学习笔记-Mybatis

29 篇文章 0 订阅

mybatis

  • orm框架

    • 对象映射关系
  • 操作

    • connect
    • preparestatement
    • resultset

JDBC

public class JdbcTest {

    public void testJdbc() {
        String url = "jdbc:mysql://localhost:3306/xxx";
        String u
        Connection conn = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection(url);
            String author = "coolblog.xyz";
            String date = "2018.06.10";
            String sql = "SELECT id, title, author, content, create_time" + " FROM article" + " WHERE author = '" + author
                + "' AND create_time > '" + date + "'";
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql);
            List<Article> articles = new ArrayList<>(rs.getRow());
            while (rs.next()) {
                Article article = new Article();
                article.setId(rs.getInt("id"));
                article.setTitle(rs.getString("title"));
                article.setAuthor(rs.getString("author"));
                article.setContent(rs.getString("content"));
                article.setCreateTime(rs.getDate("create_time"));
                articles.add(article);
             }
            System.out.println("Query SQL ==> " + sql);
            System.out.println("Query Result: ");
            articles.forEach(System.out::println);
         } catch (ClassNotFoundException e) {
            e.printStackTrace();
         } catch (SQLException e) {
            e.printStackTrace();
         } finally {
            try {
                conn.close();
             } catch (SQLException e) {
                e.printStackTrace();
             }
         }
     } 
        
}

项目搭建

依赖

<!--mybatis核心-->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version>
</dependency>
<!--mysql驱动-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.3</version>
</dependency>
<!--junit测试-->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.1.2</version>
    <scope>test</scope>
</dependency>
<!--log4j日志-->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

配置文件

  • resources/mybtais-config.xml
    • 数据库源
      • driver
      • url
      • username
      • password
<?xml version="1.0" encoding="UTF-8 ?>
<!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Cofing 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 引入本地配置文件-->
    <properties resource="jdbc.properties" />
    
    <!-- mybatis全局配置-->
    <settings>
        <!-- 下划线自动映射为驼峰 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!-- 开启延迟加载 -->
        <setting name="lazyLoadingEnabled" value="true"/>
    </settings>
    
    <!--设置类型别名-->
    <typeAliases>
        <!-- mapper内的resultType可以使用别名替换-->
        <typeAlias type="xxx.xxx.pojo.User" alias="User"></typeAlias>
        
        <!--以包为单位设置默认别名-->
        <package name="xxx.xxx.pojo"/>
    </typeAliases
    
    <!-- environments:配置多个连接数据库环境
        default:设置默认环境id
    -->
    <environments default="development">
        <!-- environment:配置某个具体连接数据库环境
            id:环境唯一标识
        -->
        <environment id="development">
            <!-- transactionManager 设置事务管理方式
                type:"JDBC|MANAGED"
                    JDBC:原生jdbc的事务管理方式,事务提交或回滚需要手动处理
                    MANAGED:被管理(如spring)
            -->
            <transactionManager type="JDBC"/>
            <!-- dataSource 设置数据源
                type:"POOLED|UNPOOLED|JNDI"
                    POOLED:使用数据库连接池缓存数据库连接
                    UNPOOLED:不使用数据库连接池
                    JNDI:表示使用上下文中的数据源
            -->
            <dataSource type="POOLED">
                <property name="dirver" value=${jdbc.dirver}/>
                <property name="url" value=${jdbc.url}/>
                <property name="username" value=${jdbc.username}/>
                <property name="password" value=${jdbc.password}/>
            </dataSource>
        </environment>
        <environment id="test">
            <transactionManager type="JDBC"/>
             <dataSource type="POOLED">
                <property name="dirver" value=${jdbc.dirver}/>
                <property name="url" value=${jdbc.url}/>
                <property name="username" value=${jdbc.username}/>
                <property name="password" value=${jdbc.password}/>
            </dataSource>
        </environment>
    </environments><!-- 引入映射文件-->
    <mappers>
        <!-- <mapper resource="mappers/UserMapper.xml"> -->
        <!-- 引入包内的映射文件,mapper接口与映射文件 包名 和 文件名 需要都一致-->
        <package name="mappers"/>
    </mappers>
</configuration>
  • resources/jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/xxx
jdbc.password=xxx
jdbc.username=xxx

mapper接口

  • xxx.xxx.mapper
public interface UserMapper{
    // 添加用户
    int insertUser();
    
    // 修改用户
    void updateUser();
    
    // 删除用户
    void deleteUser();
    
    // 查询
    User getUserById();
    
    List<User> getAllUser();
}
  • xxx.xxx.pojo
public class User{
    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private String sex;
    private String email;
    // set get
}

映射文件

  • resources/mappers/UserMapper.xml
    • 执行语句
      • select
      • insert
      • update
      • delete
<? 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="xxx.xxx.UserMapper">
    <insert id="insertUser">
        insert into user values(null,'admin','123456',23,'男','xxxx@qq.com')
    </insert>
    
    <update id="updateUser">
        update user set username= 'xxx' whrere id = '4'
    </update>
    
    <delete id="deleteUser">
        delete from user whrere id = '5'
    </delete>
    
    <select id="getUserById" resultType="xxx.xxx.pojo.User">
        select * from user whrere id = '3'
    </select>
     <select id="getAllUser" resultType="xxx.xxx.pojo.User">
        select * from user  
    </select>
    
    
</mapper>

测试

  • test
public class MyBatisTest{
    
    @Test
    public void testInsert1(){
        // 加载核心配置文件
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        // 获取SqlSessionFactoryBuilder
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(s);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 获取mapper接口对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        // 测试
        int result =  mapper.insetUser();
        // 提交事务
        sqlSession.commit();
        System.out.println("result:"+result);
    }
    @Test
    public void testInsert2(){
        // 加载核心配置文件
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        // 获取SqlSessionFactoryBuilder
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(s);
        // 默认不自动提交事务,sqlSessionFactory.openSession(true)自动提交事务
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        // 获取mapper接口对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        // 测试
        int result =  mapper.insetUser();
        System.out.println("result:"+result);
    }
    
    @Test
    public void testUpdate(){
        // 加载核心配置文件
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        // 获取SqlSessionFactoryBuilder
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(s);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        // 获取mapper接口对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        // 测试
        mapper.updateUser();
        System.out.println("执行成功");
    }
    
    @Test
    public void testDelete(){
        // 加载核心配置文件
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        // 获取SqlSessionFactoryBuilder
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(s);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        // 获取mapper接口对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        // 测试
        mapper.deleteUser();
        System.out.println("执行成功");
    }
    
    @Test
    public void testSelect(){
        // 加载核心配置文件
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        // 获取SqlSessionFactoryBuilder
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(s);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        // 获取mapper接口对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        // 测试
        User user = mapper.getUserById();
        System.out.println(user);
    }
}

添加日志

  • resources/log4j.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
        <param name="Encoding" value="UTF-8"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" />
        </layout>
    </appender>
    <logger name="java.sql">
        <level value="debug"/>
    </logger>
    <logger name="org.apache.ibatis">
        <level value="info"/>
    </logger>
    <root>
        <level value="debug"/>
        <appender-ref ref="STDOUT"/>
    </root>
    
</log4j:configuration>

获取参数

  • ${}
    • 字符串拼接
  • #{}
    • 占位符
单个参数
// interface
User getUserByName(String username);
<select id="getUserByName" resultType="xxx.xxx.pojo.User">
    select * from user where username = #{username}
</select>
User user = mapper.getUserByName("admin");
多个参数
方法一
// interface
User checkLogin(@Param("username")String username,@Param("password")String password);
<select id="checkLogin" resultType="xxx.xxx.pojo.User">
    select * from user 
    where username = #{username}
    and password = #{password}
</select>
User user = mapper.checkLogin("admin","123456");
方法二
// interface
User checkLoginByMap(Map<String,Object> map);
<select id="checkLoginByMap" resultType="xxx.xxx.pojo.User">
    select * from user 
    where username = #{username}
    and password = #{password}
</select>
Map<String,Object> map = new HashMap<>();
map.put("username","admin");
map.put("password","123456");
User user = mapper.checkLoginByMap(map);
方法三
// interface
User insertUser(User user);
<insert id="insertUser">
    insert into user valuse(null,#{username},#{password},#{age},#{sex},#{email})
</insert>
User user = new User();
user.setUsername("admin");
user.setPassword("123456");
user.setAge(12);
user.setSex("男");
user.setEmail("xxx@qq.com");
User user = mapper.insertUser(user);
获取自增主键
<insert id="insertUser" userGeneratedKeys="true" keyProperty="id">
   insert into user valuse(null,#{username},#{password},#{age},#{sex},#{email})
</insert>
自定义映射resultMap
  • xxx.xxx.pojo.Emp
public class Emp{
    private Integer eid;
    private String empName;
    private Integer age;
    private String sex;
    private String email;
    private Dept dept;
    // set get
    
}
  • xxx.xxx.pojo.Dept
public class Dept{
    private Integer did;
    private String deptName;
    // set get
}
  • xxx.xxx.mapper.EmpMapper
public interface EmpMapper{
    List<Emp> getAllEmp();
}
  • resources/mapper/EmpMapper.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="xxx.xxx.mapper.EmpMapper">
    <resultMap id="empResultMap" type="xxx.xxx.pojo.Emp">
        <id property="eid" column="eid"></id>
        <result property="empName" column="emp_name"></result>
        <result property="age" column="age"></result>
        <result property="sex" column="sex"></result>
        <result property="email" column="email"></result>
    </resultMap>

    <select id="getAllEmp" resultMap="empResultMap">
        select * from emp
    </select>
</mapper>
多对一映射
  • xxx.xxx.mapper.EmpMapper
public interface EmpMapper{
    Emp getEmpAndDept(@Param("eid")Integer id);
    // 分步查询(第一步)
    Emp getEmpAndDeptByStepOne(@Param("eid")Integer id);
}
  • resources/mapper/EmpMapper.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="xxx.xxx.mapper.EmpMapper">
    <!--多对一映射关系-->
    <resultMap id="empAndDeptResultMapOne" type="xxx.xxx.pojo.Emp">
        <id property="eid" column="eid"></id>
        <result property="empName" column="emp_name"></result>
        <result property="age" column="age"></result>
        <result property="sex" column="sex"></result>
        <result property="email" column="email"></result>
        <result property="dept.did" column="did"></result>
        <result property="dept.deptName" column="dept_name"></result>
    </resultMap>
    
    <!--多对一映射关系-->
    <resultMap id="empAndDeptResultMapTwo" type="xxx.xxx.pojo.Emp">
        <id property="eid" column="eid"></id>
        <result property="empName" column="emp_name"></result>
        <result property="age" column="age"></result>
        <result property="sex" column="sex"></result>
        <result property="email" column="email"></result>
        <association property="dept" javaType="xxx.xxx.pojo.Dept">
            <id property="did" column="did"></id>
            <result property="deptNmae" column="dept_name"></result>
        </association>
    </resultMap>
    <!--多对一映射关系,分步查询-->
    <resultMap id="empAndDeptResultMapThree" type="xxx.xxx.pojo.Emp">
        <id property="eid" column="eid"></id>
        <result property="empName" column="emp_name"></result>
        <result property="age" column="age"></result>
        <result property="sex" column="sex"></result>
        <result property="email" column="email"></result>
        <!--fetchType :开启了延迟加载后,通过手动控制是否延迟加载
                        lazy|eager: lazy:延迟加载;eager:立即加载  
        -->
        <association property="dept" 
                     column="did"
                     fetchType="eager"
                     select="xxx.xxx.mapper.DeptMapper.getEmpAndDeptByStepTwo"></association>
    </resultMap>
    <select id="getEmpAndDept" resultMap="empAndDeptResultMapOne">
        select * from emp
        left join dept on dept.did = emp.did 
        where emp.eid=#{eid}
    </select>
    
    <select id="getEmpAndDeptByStepOne" resultMap="empAndDeptResultMapThree">
        select * from emp
        where emp.eid=#{eid}
    </select>
    
</mapper>
  • xxx.xxx.mapper.DeptMapper
public interface DeptMapper{ 
    // 分步查询(第二步)
    Dept getEmpAndDeptByStepTwo(@Param("did")Integer did);
}
  • resources/mapper/DeptMapper.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="xxx.xxx.mapper.DeptMapper">
    <resultMap id="deptResultMap" javaType="xxx.xxx.pojo.Dept">
        <id property="did" column="did"></id>
        <result property="deptNmae" column="dept_name"></result>
    </resultMap>
    <select id="getEmpAndDeptByStepTwo" resultMap="deptResultMap">
        select * from dept
        where did=#{did}
    </select>

</mapper>
一对多
  • xxx.xxx.pojo.Dept
public class Dept{
    private Integer did;
    private String deptName;
    private List<EMP> emps;
    // set get
}
public interface DeptMapper{
    Dept getDeptAndEmp(@Param("did")Integer did);
    
    // 分布查询(第一步)
    Dept getDeptAndEmpByStepOne(@Param("did")Integer did);
}
  • resources/mapper/DeptMapper.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="xxx.xxx.mapper.DeptMapper">
    <resultMap id="deptAndEmpResultMap" javaType="xxx.xxx.pojo.Dept">
        <id property="did" column="did"></id>
        <result property="deptNmae" column="dept_name"></result>
        <collection property="emps" ofType="xxx.xxx.pojo.Emp">
            <id property="eid" column="eid"></id>
            <result property="empName" column="emp_name"></result>
            <result property="age" column="age"></result>
            <result property="sex" column="sex"></result>
            <result property="email" column="email"></result>
        </collection> 
    </resultMap>
    <resultMap id="deptAndEmpResultMapTwo" javaType="xxx.xxx.pojo.Dept">
        <id property="did" column="did"></id>
        <result property="deptNmae" column="dept_name"></result>
        <collection property="emps" 
                    select="xxx.xxx.mapper.EmpMapper.getDeptAndEmpByStepTwo"
                    column="did">
        </collection> 
    </resultMap>
    <select id="getDeptAndEmp" resultMap="deptAndEmpResultMap">
        select * from dept 
        left join emp on dept.did=emp.did
        where dept.did=#{did}
    </select>
    <select id="getDeptAndEmpByStepOne" resultMap="deptAndEmpResultMapTwo">
        select * from dept 
        where dept.did=#{did}
    </select>


</mapper>
  • xxx.xxx.mapper.EmpMapper
public interface EmpMapper{
    // 分步查询(第二步)
    List<Emp> getDeptAndEmpByStepTwo(@Param("did")Integer did);
}
  • resources/mapper/EmpMapper.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="xxx.xxx.mapper.EmpMapper">
    <!--多对一映射关系-->
    <resultMap id="empAndDeptResul" type="xxx.xxx.pojo.Emp">
        <id property="eid" column="eid"></id>
        <result property="empName" column="emp_name"></result>
        <result property="age" column="age"></result>
        <result property="sex" column="sex"></result>
        <result property="email" column="email"></result>
    </resultMap>
    <select id="getDeptAndEmpByStepTwo" resultMap="empAndDeptResul">
        select * from emp
        where emp.did=#{did}
    </select>

</mapper>

动态sql

if

public interface DynamicSQLMapper{
    
    // 多条件查询
    List<Emp> getEmpByCondition(Emp emp);
}
<? 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="xxx.xxx.mapper.DynamicSQLMapper">
    <select id="getEmpByCondition" resultType="Map">
        select * from emp where  1=1
        <if test="empName!=null and empName!=''">
            and emp_name=#{empName}
        </if>
        <if test="age!=null and age != ''">
            and age = #{age}
        </if>
        <if test="sex!=null and sex != ''">
            and sex = #{sex}
        </if>
        <if test="email!=null and email != ''">
            and email = #{email}
        </if>
    </select> 

</mapper>

where

<? 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="xxx.xxx.mapper.DynamicSQLMapper">
    <select id="getEmpByCondition" resultType="Map">
        select * from emp 
        <where>
            <if test="empName!=null and empName!=''">
                and emp_name=#{empName}
            </if>
            <if test="age!=null and age != ''">
                and age = #{age}
            </if>
            <if test="sex!=null and sex != ''">
                and sex = #{sex}
            </if>
            <if test="email!=null and email != ''">
                and email = #{email}
            </if>
        </where>
    </select> 

</mapper>

trim

<? 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="xxx.xxx.mapper.DynamicSQLMapper">
    <select id="getEmpByCondition" resultType="Map">
        select * from emp 
        <!--prefix suffix suffixOverrides prefixOverrides-->
        <trim prefix="where" suffixOverrides="and|or" >
            <if test="empName!=null and empName!=''">
                 emp_name=#{empName} and
            </if>
            <if test="age!=null and age != ''">
                 age = #{age} and
            </if>
            <if test="sex!=null and sex != ''">
                 sex = #{sex} and
            </if>
            <if test="email!=null and email != ''">
                 email = #{email} and
            </if>
        </trim>
    </select> 

</mapper>

chose&when&otherwise

<? 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="xxx.xxx.mapper.DynamicSQLMapper">
    <select id="getEmpByCondition" resultType="Map">
        select * from emp 
        <where>
            <chose>
                <when test="empName!=null and empName!=''">
                    emp_name=#{empName} 
                </when>
                <when test="age!=null and age != ''">
                     age = #{age} 
                </when>
                <when test="sex!=null and sex != ''">
                     sex = #{sex} 
                </when>
                <when test="email!=null and email != ''">
                     email = #{email} 
                </when>
                <otherwise>
                    did = 1
                </otherwise>
            </chose>
        </where>
    </select> 

</mapper>

foreach


int deleteMoreByArray(@Param("eids")Integer[] eids);
<? 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="xxx.xxx.mapper.DynamicSQLMapper">
    <select id="deleteMoreByArray" resultType="Map">
        delete from emp 
        where eid in 
        <!--open close-->
        <foreach collection="eids" item="eid" separator="," open="(" close=")">
            #{eid}    
        </foreach>
        
    </select> 

</mapper>

sql

<? 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="xxx.xxx.mapper.DynamicSQLMapper">
    <sql id="empSql">
        emp.emp_name,
        emp.age,
        emp.sex,
        emp.age
    </sql>
    <!--在sql内直接引用-->
    <!--<include refix="empSql" ></include>-->
</mapper>

缓存

一级缓存

  • 范围
    • sqlsession
  • 失效情况
    • 不同sqlSession
    • 查询条件不同
    • 两次查询期间执行过增删改操作
    • 手动清空缓存
      • sqlSession.clearCache();

二级缓存

  • 范围
    • sqlSessionFactory
  • 开启条件
    • 全局配置 中cacheEnable=“true”,默认就是true
    • 映射文件设置
    • SqlSession关闭或提交后才生效
      • sqlSession.close()
    • 查询的数据转换为实体类必须实现序列化接口
  • 失效情况
    • 两次查询期间执行过增删改操作
  • 配置
    • mapper中标签:cache
      • evicate:缓存回收策略
        • LRU:最近最少使用,默认
        • FIFO:先进先出
        • SOFT:软引用
        • WEAK:弱引用
      • flushInterval:刷新时间,毫秒
      • size:引用数目,缓存对象数目
      • readOnly:只读true/false,通过缓存查询的数据是否可以修改,默认false
  • 查询顺序
    • 先查二级缓存
    • 没有命中二级缓存,再查一级缓存
    • 一级没有命中,再查数据库
    • sqlSession关闭后一级缓存转入二级缓存

第三方缓存EHCache

  • pom.xml
<!--mybatis-ehche整合包-->
<dependency>
    <groupId>org.mybatis.cahces</groupId>
    <arifactId>mybatis-ehcache</artifactId>
    <version>1.2.1</version>
</dependency>
<!--slf4j日志门面具体实现-->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <arifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>
  • ehcache.xml
<?xml version="1.0" encoding="UTF-8" ?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
    <!--磁盘保存路径-->
    <diskStore path="D:\xx\xx"/>
    
    <defaultCache 
        maxElementsInMemory="1000"
        maxElementsOnDisk="10000000"
        eternal="false"
        overflowToDisk="true"
        timeToIdleSeconds="120"
        timeToLiveSeconds="120"
        diskExpiryThreadIntervalSeconds="120"
        memoryStoreEvictionPolicy="LRU">
    </defaultCache>
</ehcache>
  • 在mapper中配置
<cahce type="org.mybatis.caches.ehcache.EhcacheCache">
  • logback.xml
<?xml version="1.0" encoding="UTF-8" ?>
<configuration debug="true">
    <!--指定日志输出位置-->
    <appender name="STDOUT" 
        class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!--日志输出格式-->
            <!--时间 日志级别 打印日志类 日志内容 换行-->
            <pattern>[%d{HH:MM:SS.sss}] [%-5level] [%thread] [%logger] [%msg]%n</pattern>
        </encoder>
    </appender>
    <!--设置全局日志级别:DEBUGE INFO WARN ERROR-->
    <!--指定任何一个日志级别都只打印当前级别和后面级别的日志-->
    <root level="DEBUG">
        <!--指定打印日志的appender 这里通过STDOUT引用前面配置的appender-->
        <appender-ref ref="STDOUT" />
    </root>
    
    <!--根据特殊需求指定局部日志级别-->
    <logger name="xxx.xxx.mapper" level="DEBUG"/>
</configuration>

逆向工程

  • pom.xml
<build>
    <!--构建过程用到的插件-->
    <plugins>
        <!--具体插件-->
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.0</version>
            <!--插件依赖-->
            <dependencies>
                <!--逆向工程核心依赖-->
                <dependency>
                    <groupId>org.mybatis.generator</groupId>
                    <artifactId>mybatis-generator-core</artifactId>
                    <version>1.3.2</version>
                </dependency>
                <!--数据库连接池-->
                <dependency>
                    <groupId>com.mchange</groupId>
                    <artifactId>c3p0</artifactId>
                    <version>0.9.2</version>
                </dependency>
                <!--mysql驱动-->
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>5.1.3</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>
  • generatorConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generationConfiguration
    PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
    "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <!--tragetRuntimeL执行生成的逆向工程版本
        Mybatis3Simple:生成基本CRUD
        Mybatis3:生成带条件的CRUD-->
    <context id="DB2Tables" targetRuntime="MyBatis3Simple">
        <!--数据库连接信息-->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
            connectionURL="jdbc:mysql://localhost:3306/xxx"
            userId="xxx"
            password="xxx">
        </jdbcConnection>
        <!--javaBean生成策略-->
        <javaModelGenerator targetPackage="xxx.xxx.mybatis.pojo"  targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true">
            <property name="trimStrings" value="true">
        </javaModelGenerator>
        <!--sql映射文件生成策略-->
        <sqlMapGenerator targetPackage="mybatis.mapper"  targetProject=".\src\main\resources">
            <property name="enableSubPackages" value="true">
        </javaModelGenerator>
        <!--mapper接口生成策略-->
        <sqlMapGenerator type="XMLMAPPER" targetPackage="xxx.xxx.mapper"  targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true">
        </javaModelGenerator>
        <!--逆向分析的表-->
        <!--tableName设置为*,可以生成所有表,不屑domainObjectName-->
        <table tableName="emp" domainObjectName="Emp">
        <table tableName="dept" domainObjectName="Dept">
    </context>
</generatorConfiguration>

分页

  • pom.xml
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehepler</artifactId>
    <version>5.2.0</version>
</dependency>
  • mybatis-config.xml
<plugins>
    <!--设置分页插件-->
    <plugin interceptor="com.github.pagehlper.PageInterceptor"></plugin>
</plugins>
// limit index,pageSize
// index:当前页起始索引
// pageSize:当前页条数
// pageNum:当前页页码
// index = (pageNum-1)*pageSize

// 查询之前,开启分页
PageHelper.startPage(pageNum,pageSize);
List<Emp> list = mapper.selectByExample(null);
PageInfo<Emp> page = new PageInfo<Emp>(list,5);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值