首页 > 其他 > 详细

Mybatis从门外到入门

时间:2020-03-21 02:54:48      阅读:112      评论:0      收藏:0      [点我收藏+]

对比介绍:

  • JDBC:sql在代码中耦合度高   编写sql ——>预编译——>设置参数——>执行sql——>封装结果;
  • Hibernate:全自动ORM框架   JavaBean ——>DataBase (hibernate不容易定制sql,初学容易学好较难);
  • MyBatis:半自动ORM框架 ,sql和代码分开,自己定制sql  JavaBean ——>编写sql(配置文件) ——>DataBase;

MyBatis的基本使用:

  1. 在xml中配置数据库连接池,SessionFactory,SqlSession等Bean。
  2. 准备好数据库对应的实体类和sql映射文件,将对应的目录配置在SessionFactory中。
  3. 使用SqlSession通过命名空间和Id组成唯一标识找到sql执行,一个SqlSession表示一次和数据库交互,用完关闭。

接口式编程:

       创建一个接口,利用SqlSession的getMapper(Class<T> var1)方法使接口和映射文件绑定。

       mybatis会为接口创建一个代理实现类执行sql ,命名空间=接口的全类名 sql标签id=方法名

接口类:EmployeeDao 实体类:Employee 
EmployeeDao employeeDao = sqlSession.getMapper(EmployeeDao.class);
Employee employee = employeeDao.selectById(1);

映射文件:
<?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.example.dao.EmployeeDao">
    <resultMap id="BaseResultMap" type="com.example.pojo.Employee" >
        <id column="ID" property="id" jdbcType="INTEGER"/>
        <result column="LAST_NAME" property="lastName" jdbcType="VARCHAR" />
        <result column="GENDER" property="gender" jdbcType="VARCHAR" />
        <result column="EMAIL" property="email" jdbcType="VARCHAR" />
    </resultMap>

    <select id="selectById" resultMap="BaseResultMap" parameterType="map" >
        select    *
        from employee
        where
        ID = #{id, jdbcType=INTEGER}
    </select>
</mapper>

 

#{}与${}的区别:

#{}表示是以预编译的形式,将参数设置到sql中,PreStatement,可以防止sql注入;

${}是将取出的值直接拼装在sql中会有安全问题;

大部分情况下都应该使用#{},${}适用于jdbc不支持占位符的地方,比如分表时使用 select * from ${tableName} where ....

 

MyBatis插件:

      利用动态代理的方式在方法级进行拦截,支持拦截的方法:

  • 执行器Executor(update、query、commit、rollback等方法);
  • 参数处理器ParameterHandler(getParameterObject、setParameters方法);
  • 结果集处理器ResultSetHandler(handleResultSets、handleOutputParameters等方法);
  • SQL语法构建器StatementHandler(prepare、parameterize、batch、update、query等方法);

      如果配置了多个拦截器,会通过责任链模式形成一个代理链条,即代理对象代理了另一个代理对象,要注意:

  • 不要定义过多的插件,代理嵌套过多,执行方法的时候,比较耗性能;
  • 拦截器实现类的intercept方法里最后不要忘了执行invocation.proceed()方法,否则多个拦截器情况下,执行链条会断掉;

Mybatis从门外到入门

原文:https://www.cnblogs.com/dream2true/p/12528505.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!