MyBatis搭建过程

  1. 导入jar包

    1. mybatis-x.x.x.jar //mybatis-3.4.1.jar
    2. log4j.jar //要有log4j的配置文件,例:log4j.xml 或 log4j.properties
    3. //名字一定得是log4j
    4. mysql-connector-java-5.1.7-bin.jar
  2. 创建mybatis的全局配置文件并配置 ```java <?xml version=”1.0” encoding=”UTF-8” ?> //必须是第一行 <!DOCTYPE configuration PUBLIC “-//mybatis.org//DTD Config 3.0//EN” “http://mybatis.org/dtd/mybatis-3-config.dtd">

//引入映射文件

  1. 3. 创建映射文件并配置
  2. ```java
  3. <?xml version="1.0" encoding="UTF-8" ?> //必须是第一行
  4. <!DOCTYPE configuration
  5. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  6. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  7. <mapper namespace="">
  8. // #{} ${}
  9. <select id="" resultType="" >select * from Blog where id=#{id}</select>
  10. </mapper>
  1. 创建mapper接口,实现两个绑定 ```java <?xml version=”1.0” encoding=”UTF-8” ?> //必须是第一行 <!DOCTYPE configuration PUBLIC “-//mybatis.org//DTD Mapper 3.0//EN” “http://mybatis.org/dtd/mybatis-3-mapper.dtd">

//namespace 是对应接口文件的全类名

//id 是对应接口文件中的对应的方法名,resultType要写返回类型的全类名 // #{} ${} 5. 获取mybatis操作数据库的会话对象sqlsessionjava public class TestMyBatis { @Test public void test(){ //1 InputStream is = Resource.getResourceAsStream(“mybatis.xml”); //2 SqlSessionFactory sqlSesssionFactory = new SqlSessionFactoryBuilder().build(is); //3 openSession有个boolean类型的参数,true表示自动提交事务,默认false SqlSession sqlSession = sqlSessionFactory.openSession(); //4 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //5 User user = userMapper.getUserById(“1”); System.out.println(user); } } 6. 测试 <a name="sf0Dg"></a> # enviroments,properties,settings,typeAliases(mybatis.xml)java //标签是有顺序的 / / / resource 可替换为 url resource 是在当前类路径下寻找文件 url 是在网络路径下或者磁盘路径下 / //在这个包下的所有类都会起别名,默认是类名,不区分大小写 //同样,不设置alias属性则默认别名是类名,不区分大小写 //设置连接数据库的环境 default是默认使用哪个设置(与后面的environment的id对应) //type的取值有两种:JDBC 和 MANAGED //type的取值有三种:POOLED 、 UNPOOLED 、 JNDI <a name="Sdj2A"></a> # 在mapper.xml中实现简单CRUDjava <?xml version=”1.0” encoding=”UTF-8” ?> //必须是第一行 <!DOCTYPE configuration PUBLIC “-//mybatis.org//DTD Mapper 3.0//EN” “http://mybatis.org/dtd/mybatis-3-mapper.dtd"> //namespace 是对应接口文件的全类名 //id 是对应接口文件中的对应的方法名,resultType要写返回类型的全类名 // #{} ${} 标签中有paramType属性:写入参属性,可以不写 <a name="TLN7V"></a> # mybatis.xml通过package引入maaper.xml映射文件 <a name="xdR7D"></a> ## 使用 package 引入映射文件需要映射文件和对应的接口文件在同一个包下java <?xml version=”1.0” encoding=”UTF-8” ?> //必须是第一行 <!DOCTYPE configuration PUBLIC “-//mybatis.org//DTD Config 3.0//EN” “http://mybatis.org/dtd/mybatis-3-config.dtd"> //引入映射文件 // //使用 package 引入映射文件需要映射文件和对应的接口文件在同一个包下 <a name="HiQ0T"></a> # 查询返回键值对集合(Map) xml配置:java 代码:java @MapKey(“eid”) //设置map的键 Map getAllEmpMap(); <a name="EHwN5"></a> # 添加时获取自动生成的主键java //keyProperty:会将自动生成的主键放入设置的eid中 //void insertEmp(Emp emp); useGeneratedKey默认是true insert into emp values(null,#{name},#{age},#{sex}); <a name="IiaAf"></a> # #{ } 和 ${ }的对比 1. 当入参为单个String类型或其他基本类型时 #{ } 可以使用任何名字获取参数<br />${ } 只能用 ${ value } 或 ${ _parameter } 2. 当入参为JavaBean时 #{ } 和 ${ } 都可以通过属性名获取属性值,但要注意单引号问题 3. 当入参有多个时,mybatis会默认将这些参数放入map集合中 使用#{ }:#{0},#{1},#{n} 或者 #{param1},#{param2},#{paramN}<br />使用${ }:#{param1},#{param2},#{paramN} @注意单引号问题 4. 当入参为Map类型时 #{ } 和 ${ } 都可以通过键的名字获取属性值,但要注意单引号问题 注:当传入参数为List 或 Array时,mybatis会将其放在map中,键分别为list 和 array。 <a name="2Q8lu"></a> # @Param(定义参数在map中的键)java 通过 @Param(“名称”) 为map集合指定键的名字 public Emp getEmp(@Param(“eid”) String eid, @Param(“ename”) String ename); <a name="SyN5D"></a> # 多对一(resultMap的使用)java //emp 和 dept两张表 / 两种类型:Emp, Dept Emp 属性: eid, ename, age, sex, dept Dept 属性: did, dname / //没别名的情况下,type写全类名 <a name="JcYBJ"></a> ## 使用association标签java //第二种写法 //property是Emp中的Dept类型的JavaBean,javaType写全类名 <a name="o3oGl"></a> ## 分步查询java //emp 和 dept两张表 / 两种类型:Emp, Dept Emp 属性: eid, ename, age, sex, dept Dept 属性: did, dname / //没别名的情况下,type写全类名 //column与上面不同,是传给select的参数 select的值是namespace.方法名(id)

——————————-另一个mapper

  1. <a name="k2Ouz"></a>
  2. # 延迟加载
  3. 在以上分步查询的基础上再在mybatis.xml中添加一下配置
  4. ```java
  5. <settings>
  6. <setting name="lazyLoadingEnabled" value="true" />
  7. <setting name="aggressiveLazyLoading" value="false" />
  8. </settings>

fetchType(设定单个是否延迟加载)

在resultMap中的association 和 collection标签上的一个属性,值lazy 和 eager
用于设定单个是否延迟加载

一对多(resultMap中collection标签)

  1. /*
  2. 准备:
  3. DeptEmps类:did, dname, List<Emps> emps
  4. */
  5. <mapper namespace="">
  6. //没别名的情况下,type写全类名
  7. <resultMap id="deptEmpsMap" type="DeptEmps">
  8. <id column="did" property="did" />
  9. <result column="dname" property="dname" />
  10. //ofType是集合中的类型
  11. <collection property="emps" ofType="Emp" >
  12. <id column="eid" property="eid" />
  13. <result column="ename" property="ename" />
  14. <result column="age" property="age" />
  15. <result column="sex" property="sex" />
  16. </collection>
  17. //若collection要分步查询,则与上面多对一类似,使用select属性和column
  18. //column若要传多个参数则使用map的形式
  19. //<collection property="emps" select="" column="{did=did,ename=ename}"></collection>
  20. </resultMap>
  21. //查询一个部门中所有的员工
  22. <select id="getDeptEmps" resultMap="deptEmpsMap">
  23. select dept.did,dept.dname,eid,ename,age,sex
  24. from emp left join dept
  25. on emp.did=dept.did
  26. where dept.id=#{did}
  27. </select>
  28. </mapper>

动态SQL之if

  1. <select id="" resultType="">
  2. select eid,ename,age,sex
  3. from emp
  4. where eid=#{id}
  5. <if test="ename != null and ename != ''">
  6. and ename=#{name}
  7. </if>
  8. <if test="age != null">
  9. and age=#{age}
  10. </if>
  11. //对于等于号,必须是数字,男和女不行
  12. <if test="sex == 1 or sex == 0">
  13. and sex=#{age}
  14. </if>
  15. </select>

动态SQL之where

  1. <select id="" resultType="">
  2. select eid,ename,age,sex
  3. from emp
  4. //where 标签自动加上一个where并去除后一个and
  5. <where>
  6. <if test="eid != null">
  7. eid=#{eid}
  8. </if>
  9. <if test="ename != null and ename != ''">
  10. and ename=#{name}
  11. </if>
  12. <if test="age != null">
  13. and age=#{age}
  14. </if>
  15. //对于等于号,必须是数字,男和女不行
  16. <if test="sex == 1 or sex == 0">
  17. and sex=#{age}
  18. </if>
  19. </where>
  20. </select>

动态SQL之trim

  1. <select id="" resultType="">
  2. select eid,ename,age,sex
  3. from emp
  4. /*
  5. prefix:在操作SQL语句前加上某些内容
  6. suffix:在操作SQL语句后加上某些内容
  7. prefixOverrides:在操作SQL语句前去除某些内容
  8. suffixOverrides:在操作SQL语句后去除某些内容
  9. suffixOverrides="and|or" 竖线是或,表示去除and或者or
  10. */
  11. <trim prefix="where" prefixOverrides="and">
  12. <if test="eid != null">
  13. eid=#{eid}
  14. </if>
  15. <if test="ename != null and ename != ''">
  16. and ename=#{name}
  17. </if>
  18. <if test="age != null">
  19. and age=#{age}
  20. </if>
  21. //对于等于号,必须是数字,男和女不行
  22. <if test="sex == 1 or sex == 0">
  23. and sex=#{age}
  24. </if>
  25. </trim>
  26. </select>

动态SQL之set

  1. <update id="" >
  2. update emp
  3. //set标签可用于去除多余的逗号,用trim也可实现
  4. <set>
  5. <if test="eid != null">
  6. eid=#{eid},
  7. </if>
  8. <if test="ename != null and ename != ''">
  9. and ename=#{name},
  10. </if>
  11. <if test="age != null">
  12. and age=#{age}
  13. </if>
  14. </set>
  15. </update>

动态SQL之choose

  1. <select id="" resultType="">
  2. select eid,ename,age,sex
  3. from emp
  4. where
  5. <choose>
  6. <when test="eid != null">
  7. eid=#{eid}
  8. </when>
  9. <when test="ename != null and ename!= '' ">
  10. ename=#{ename}
  11. </when>
  12. <otherwise>
  13. </otherwies>
  14. </choose>
  15. </select>

动态SQL之foreach

  1. /*
  2. collection
  3. item
  4. seperator
  5. open
  6. close
  7. */
  8. <insert id="" >
  9. insert into emps values
  10. <foreach collection="list" item="emp" seperator=",">
  11. (#{emp.eid},#{emp.ename},#{emp.age},#{emp.sex})
  12. </foreach>
  13. </insert>

动态SQL之sql

  1. /*
  2. 主要用于定义公共sql片段
  3. */
  4. <sql id="empColumn">select eid,ename,age,sex from emp</sql>
  5. //引用sql片段
  6. <include refid="empColumn"></include>

MyBatis缓存

一级缓存

默认开启
一级缓存失效情况:

  1. 两次查询不是同一个sqlSession时
  2. 两次查询的查询条件不一样时
  3. 两次查询中间执行了任意一个增删改语句时
  4. 清除了缓存时(cleanCache)

    二级缓存

  5. 二级缓存默认不开启

  6. 缓存要求POJO实现Serializable接口
  7. 二级缓存在sqlSession关闭或提交后才会生效

使用配置:

  1. 全局开启二级缓存
  2. 需要开启二级缓存的映射文件配置标签
  3. POJO要实现序列化接口

二级缓存的相关属性:

  1. eviction:缓存回收策略 LRU(默认),FIFO,SOFT,WEAK
  2. flushInterval:刷新时间 以毫秒为单位,默认不刷新尽在缓存调用语句时刷新
  3. size:缓存最多可以存储多少个对象
  4. readOnly:

    mybatis缓存常用属性

    select标签上可以写userCache

    第三方缓存

    逆向工程