zoukankan      html  css  js  c++  java
  • Mybatis从门外到入门

    对比介绍:

    • 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中会有安全问题;

    #{}可以规定参数的一些规则,javaType,jdbcType,mode等,例如: ID = #{id,jdbcType=INTEGER}

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

    MyBatis缓存机制:

    MyBatis默认定义了两级缓存,缓存可以提高查询效率。默认情况下一级缓存开启,二级缓存需要手动开启。

    一级缓存:SqlSession级的缓存,也称为本地缓存。

    二级缓存:NameSpace级别的缓存,也称为全局缓存,需要手动开启。

    为了提高扩展性,Mybatis提供了Cache接口,可以通过实现Cache接口自定义二级缓存。

    MyBatis的缓存可能会出现一致性问题,尤其是在分布式环境下,可以使用redis作为MyBatis的二级缓存。

    MyBatis处理流程:

    MyBatis插件:

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

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

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

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

      插件开发过程:

    1. 实现Interceptor接口,完成实现类
    2. 通过@Intercepts注解指定拦截的对象和方法
    3. 在全局配置中注册插件
  • 相关阅读:
    单调队列
    Johnson全源最短路
    重链剖分
    矩阵快速幂
    Tarjan
    题解 UVA439 骑士的移动 Knight Moves
    题解 SP10500 HAYBALE
    题解 P4058 [Code+#1]木材
    题解 P3395 路障
    题解 SP24 FCTRL2
  • 原文地址:https://www.cnblogs.com/dream2true/p/12528505.html
Copyright © 2011-2022 走看看