首页 > 其他分享 >Mybatis核心原理简单实现

Mybatis核心原理简单实现

时间:2023-05-27 09:56:38浏览次数:27  
标签:String RuntimeException 核心 System println new Mybatis 原理 out

1、导入一个依赖

点击查看代码
     <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>
2、有一个mapper.xml文件
点击查看代码
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.bh.dao.IStudentDAO">
    <select id="findAll" resultType="com.bh.po.Student2" >
        select * from student
    </select>

    <insert id="save" parameterType="com.bh.po.Student">
        insert into student values(#{id}, #{name})
    </insert>

    <delete id="remove" parameterType="com.bh.po.Student">
        delete from student where id=#{id}
    </delete>

    <update id="modify" parameterType="com.bh.po.Student">
        update student set name=#{name} where id=#{id}
    </update>

</mapper>
3、封装jdbc中execute文件
点击查看代码
 public List executeQuery(String sql,String resultType){
        PreparedStatement ps = null;
        ResultSet rs = null;
        List list = new ArrayList();

        try {
            ps = DbManager.getConnection().prepareStatement(sql);
             rs = ps.executeQuery();
             //根据检索结果,放到resultType的po中
            ResultSetMetaData metaData = rs.getMetaData();//得到结果集(rs)的结构
            //检索结果的所有列数个数
            int columnCount = metaData.getColumnCount();
       /*     for (int i = 1; i < columnCount; i++) {
                //获取检索列名
                String columnLabel = metaData.getColumnLabel(i);
                System.out.println(columnLabel);
                //获取列名字段类型
                String columnTypeName = metaData.getColumnTypeName(i);
                System.out.println(columnTypeName);
            }*/
            //根据resultType,获得类对象
            Class clz = Class.forName(resultType);
            while (rs.next()){
                //po
                Object po = clz.newInstance();
                for (int i = 1; i < columnCount; i++) {
                    //取得第i列的列名
                    String columnName = metaData.getColumnLabel(i);
                    //根据列名取内容
                    String value = rs.getString(columnName);

                    //根据列名获得成员属性
                    Field declaredField = clz.getDeclaredField(columnName);
                    //获得成员属性的类型
                    Class type = declaredField.getType();

                    String methodName = "set" + columnName.substring(0,1).toUpperCase() +columnName.substring(1);
                    //根据类对象取得方法
                    Method setMethod = clz.getMethod(methodName, type);

                    //执行set方法,将db中的值放到po中去
                    if ("int".equals(type.getName())){
                        setMethod.invoke(po,Integer.valueOf(value));

                    }else if ("java.lang.String".equals(type.getName())){
                        setMethod.invoke(po,value);
                    }




                }
                list.add(po);
                System.out.println("==============");
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        } catch (NoSuchFieldException e) {
            throw new RuntimeException(e);
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        }finally {
            try {
                rs.close();
                ps.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }


        return list;
    }
5、测试调用
点击查看代码
package com.bh.test;

import com.bh.jdbc.Execute;
import com.bh.po.Student2;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.InputStream;
import java.util.List;

public class TestDom {
    public static void main(String[] args) {
        System.out.println("start============");
        //读取配置文件
        InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("mapper/StudentMapper.xml");
        //解析xml格式的配置文件
        SAXReader reader = new SAXReader();
        try {
            Document doc = reader.read(in);
            //获得xml文件根节点
            Element rootElement = doc.getRootElement();
            /*System.out.println(rootElement.getName());//根节点为mapper*/
            //获取root节点获得所有的子节点
            List<Element> elements = rootElement.elements();
            //遍历所有子节点
            for (Element e:elements) {
                String idValue = e.attributeValue("id");
                String parameterType = e.attributeValue("parameterType");
                String resultType = e.attributeValue("resultType");
                String sql = e.getText().trim();
              /*  System.out.println(sql);
                System.out.println(idValue);
                System.out.println(parameterType);
                System.out.println(resultType);
                System.out.println("===============");*/


                //模拟检索查询
                if ("findAll".equals(idValue)){
                    Execute execute = new Execute();
                    List<Student2> list = execute.executeQuery(sql, resultType);
                    for (Student2 st:list) {
                        System.out.println(st.getId()+st.getName()+st.getSex()+st.getScore()+st.getPhone());
                    }

                }
            }
        } catch (DocumentException e) {
            throw new RuntimeException(e);
        }


        System.out.println("end============");
    }
}

标签:String,RuntimeException,核心,System,println,new,Mybatis,原理,out
From: https://www.cnblogs.com/liangkuan/p/17436303.html

相关文章

  • 数据库系统原理-实验一
    一、实验目的:掌握使用SQL语言进行数据定义和数据操纵的方法。二、实验要求:建立一个数据库stumanage,建立三个关系表student,course,sc。向表中插入数据,然后对数据进行删除、修改等操作,对关系、数据库进行删除操作。三、实验步骤:1、开始→程序→MicrosoftSQLServer→S......
  • 领域驱动设计-软件核心复杂应对之道:第八章
    第三部分通过重构来加深理解要想成功地开发出实用的模型,需要注意以下三点复杂巧妙地领域模型是可以实现的,也是值得我们去花费力气实现的这样的模型离开不断地重构是很难开发出来的,重构需要领域专家和热爱学习领域知识的开发人员密切参与进来要实现并有效地运用模型,需要精通......
  • 计算机组成原理之中央处理器(二)
    微程序这一章,感念比较多,注意好区分。微命令就是一个一个最小的控制信号,比如说三态门中的什么什么有效,总线中的什么什么有效,以及给ALU的什么运算类型等这些最小的信号就是微命令。相对来说,这两个概念就比较好理解了。微操作就是接受微命令后部件进行的操作,例如ALU接受命令后......
  • drf全局异常处理,接口文档,jwt介绍和原理,base64编码和解码
    drf全局异常处理:只要三大认证,视图类的方法出了异常,都会执行一个函数:rest_framework.viewsimportexception_handlersetting:REST_FRAMEWORK={'EXCEPTION_HANDLER':'app01.exception.commn_exception_handler',#导入自己写的异常类的路径}......
  • 7、Hystrix 断路器执行原理
    断路器深入的工作原理1、如果经过断路器的流量超过了一定的阈值,HystrixCommandProperties.circuitBreakerRequestVolumeThreshold()举个例子,可能看起来是这样子的,要求在10s内,经过短路器的流量必须达到20个;在10s内,经过短路器的流量才10个,那么根本不会去判断要不要短路2、如果断......
  • 数据类型转换校验核心类---DataBinder,详细讲述一下其运行机制
    下面就是其运行机制的示意图 简单一句话就是把请求中参数信息绑定到目标方法的参数上。数据绑定是参数解析过程中的一部分。SpringMVC通过反射机制对目标处理方法进行解析,将请求消息绑定到处理方法的入参中①数据绑定过程中,获取到请求中的数据后向目标对象进行绑定,那么这个阶......
  • 4、深入分析hystrix执行时的8大流程步骤以及内部原理
    前面了解了Hystrix最基本的支持高可用的技术:资源隔离 + 限流。创建command;执行这个command;配置这个command对应的group和线程池。开始执行这个command,调用了这个command的execute()方法之后,Hystrix底层的执行流程和步骤以及原理是什么1、构建一个Hystri......
  • mybatis-plus
    mybatis-plus是一款Mybatis增强工具,用于简化开发,提高效率。下文使用缩写mp来简化表示mybatis-plus,本文主要介绍mp搭配SpringBoot的使用。注:本文使用的mp版本是当前最新的3.4.2,早期版本的差异请自行查阅文档官方网站:baomidou.com/快速入门创建一个SpringBoot项目导入依赖......
  • MybatisPlusGenerator 实体类 xml dao 生成工具
    packagecom.thtf.zwdsj.gongjia.config;importcom.baomidou.mybatisplus.core.mapper.BaseMapper;importcom.baomidou.mybatisplus.generator.FastAutoGenerator;importcom.baomidou.mybatisplus.generator.config.OutputFile;importcom.baomidou.mybatisplus.gener......
  • 详解GaussDB(DWS)用户监控原理及应用
    摘要:本文将聚焦于用户监控的原理及应用进行介绍。本文分享自华为云社区《GaussDB(DWS)监控工具指南(二)用户级监控》,作者:幕后小黑爪。前言资源监控是整个运维乃至整个产品生命周期重要的一环,事前及时语句发现故障,事后提供详实的数据用于追查定位问题。GaussDB(DWS)整个资源监控......