Mybatis基础知识大全!!!

打印 上一主题 下一主题

主题 897|帖子 897|积分 2691

目录

1.<properties resource="db.properties"> </properties>简介

1.1什么是Mybatis


  • MyBatis<properties resource="db.properties"> </properties>是一款优秀的持久层框架
  • 它支持自定义<properties resource="db.properties"> </properties>SQL、存储过程以及高级映射。
  • MyBatis<properties resource="db.properties"> </properties>免除了几乎所有的<properties resource="db.properties"> </properties>JDBC<properties resource="db.properties"> </properties>代码以及设置参数和获取结果集的工作。
  • MyBatis<properties resource="db.properties"> </properties>可以通过简单的<properties resource="db.properties"> </properties>XML<properties resource="db.properties"> </properties>或注解来配置和映射原始类型、接口和<properties resource="db.properties"> </properties>Java<properties resource="db.properties"> </properties>POJO(Plain<properties resource="db.properties"> </properties>Old<properties resource="db.properties"> </properties>Java<properties resource="db.properties"> </properties>Objects,普通老式<properties resource="db.properties"> </properties>Java<properties resource="db.properties"> </properties>对象)为数据库中的记录。
1.2<properties resource="db.properties"> </properties>如何获得Mybatis


  • 获得maven仓库:
    1. <dependency>
    2. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><groupId>org.mybatis</groupId>
    3. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><artifactId>mybatis</artifactId>
    4. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><version>3.5.9</version>
    5. </dependency>
    复制代码
  • Github:https://github.com/mybatis/mybatis-3
  • 中文文档:https://mybatis.net.cn/getting-started.html
1.3<properties resource="db.properties"> </properties>使用Mybatis的好处:


  • 使用简单,传统的JDBC代码太复杂
  • 简单易学:没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件。
  • 灵活
  • 解除sql与程序代码的耦合
  • 提供映射标签,支持对象与数据库的orm字段关系映射。
  • 提供对象关系映射标签,支持对象关系组建维护。
  • 提供xml标签,支持编写动态sql。
2.初涉Mybatis

2.1环境搭建


  • 使用navicat创建一个数据库

  • 新建项目
  • 导入依赖
    1. <dependency>
    2. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><groupId>org.mybatis</groupId>
    3. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><artifactId>mybatis</artifactId>
    4. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><version>3.5.9</version>
    5. </dependency>
    复制代码
2.2、创建一个模块(项目)


  • 编写mybatis的核心配置文件
    1. <?xml<properties resource="db.properties"> </properties>version="1.0"<properties resource="db.properties"> </properties>encoding="UTF-8"<properties resource="db.properties"> </properties>?>
    2. <!DOCTYPE<properties resource="db.properties"> </properties>configuration
    3. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>PUBLIC<properties resource="db.properties"> </properties>"-//mybatis.org//DTD<properties resource="db.properties"> </properties>Config<properties resource="db.properties"> </properties>3.0//EN"
    4. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>"http://mybatis.org/dtd/mybatis-3-config.dtd">
    5. <configuration>
    6. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><environments<properties resource="db.properties"> </properties>default="development">
    7. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><environment<properties resource="db.properties"> </properties>id="development">
    8. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><transactionManager<properties resource="db.properties"> </properties>type="JDBC"/>
    9. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><dataSource<properties resource="db.properties"> </properties>type="POOLED">
    10. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><property<properties resource="db.properties"> </properties>name="driver"<properties resource="db.properties"> </properties>value="com.mysql.cj.jdbc.Driver"/>
    11. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><property<properties resource="db.properties"> </properties>name="url"<properties resource="db.properties"> </properties>value="jdbc:mysql://localhost:3306/mybatis?&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai"/>
    12. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><property<properties resource="db.properties"> </properties>name="username"<properties resource="db.properties"> </properties>value="root"/>
    13. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><property<properties resource="db.properties"> </properties>name="password"<properties resource="db.properties"> </properties>value="18227022334a"/>
    14. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties></dataSource>
    15. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties></environment>
    16. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties></environments>
    17. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><mappers>
    18. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><mapper<properties resource="db.properties"> </properties>resource="Mapper/UserMapper.xml"/>
    19. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties></mappers>
    20. </configuration>
    复制代码
  • 编写mybatis工具类(封装):
    1. public<properties resource="db.properties"> </properties>class<properties resource="db.properties"> </properties>MybatisUtils<properties resource="db.properties"> </properties>{
    2. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>private<properties resource="db.properties"> </properties>static<properties resource="db.properties"> </properties>SqlSessionFactory<properties resource="db.properties"> </properties>sqlSessionFactory;
    3. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>//第一步:获取SqlSessionFactory对象
    4. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>static<properties resource="db.properties"> </properties>{
    5. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>try<properties resource="db.properties"> </properties>{
    6. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>String<properties resource="db.properties"> </properties>resource<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>"mybatis-config.xml";//路径写对
    7. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>InputStream<properties resource="db.properties"> </properties>inputStream<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>Resources.getResourceAsStream(resource);
    8. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>sqlSessionFactory<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>new<properties resource="db.properties"> </properties>SqlSessionFactoryBuilder().build(inputStream);
    9. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>}<properties resource="db.properties"> </properties>catch<properties resource="db.properties"> </properties>(IOException<properties resource="db.properties"> </properties>e)<properties resource="db.properties"> </properties>{
    10. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>e.printStackTrace();
    11. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>}
    12. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>}
    13. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>//通过SqlSessionFactory对象获取SqlSession对象
    14. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>//SqlSession:SqlSession<properties resource="db.properties"> </properties>提供了在数据库执行<properties resource="db.properties"> </properties>SQL<properties resource="db.properties"> </properties>命令所需的所有方法。你可以通过<properties resource="db.properties"> </properties>SqlSession<properties resource="db.properties"> </properties>实例来直接执行已映射的<properties resource="db.properties"> </properties>SQL<properties resource="db.properties"> </properties>语句。
    15. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>public<properties resource="db.properties"> </properties>static<properties resource="db.properties"> </properties>SqlSession<properties resource="db.properties"> </properties>getSqlSession(){return<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>sqlSessionFactory.openSession();}//当传递一个true参数时表示自动提交事务
    16. }
    复制代码
  • 编写

    • 编写实体类
      1. //注;实体类的属性名必须与数据库的列名一致,否则无法进行匹配从而出现数据为空的现象,当然也可以在Mapper.xml配置中通过编写一个resultMap来进行映射,此时名字可以不相同
      2. public<properties resource="db.properties"> </properties>class<properties resource="db.properties"> </properties>User<properties resource="db.properties"> </properties>{
      3. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>private<properties resource="db.properties"> </properties>int<properties resource="db.properties"> </properties>id;
      4. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>private<properties resource="db.properties"> </properties>String<properties resource="db.properties"> </properties>username;
      5. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>private<properties resource="db.properties"> </properties>String<properties resource="db.properties"> </properties>password;
      6. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>public<properties resource="db.properties"> </properties>User()<properties resource="db.properties"> </properties>{
      7. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>}
      8. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>public<properties resource="db.properties"> </properties>User(int<properties resource="db.properties"> </properties>id,<properties resource="db.properties"> </properties>String<properties resource="db.properties"> </properties>username,<properties resource="db.properties"> </properties>String<properties resource="db.properties"> </properties>password)<properties resource="db.properties"> </properties>{
      9. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>this.id<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>id;
      10. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>this.username<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>username;
      11. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>this.password<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>password;
      12. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>}
      13. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>public<properties resource="db.properties"> </properties>int<properties resource="db.properties"> </properties>getId()<properties resource="db.properties"> </properties>{
      14. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>return<properties resource="db.properties"> </properties>id;
      15. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>}
      16. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>public<properties resource="db.properties"> </properties>void<properties resource="db.properties"> </properties>setId(int<properties resource="db.properties"> </properties>id)<properties resource="db.properties"> </properties>{
      17. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>this.id<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>id;
      18. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>}
      19. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>public<properties resource="db.properties"> </properties>String<properties resource="db.properties"> </properties>getUsername()<properties resource="db.properties"> </properties>{
      20. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>return<properties resource="db.properties"> </properties>username;
      21. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>}
      22. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>public<properties resource="db.properties"> </properties>void<properties resource="db.properties"> </properties>setUsername(String<properties resource="db.properties"> </properties>username)<properties resource="db.properties"> </properties>{
      23. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>this.username<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>username;
      24. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>}
      25. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>public<properties resource="db.properties"> </properties>String<properties resource="db.properties"> </properties>getPassword()<properties resource="db.properties"> </properties>{
      26. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>return<properties resource="db.properties"> </properties>password;
      27. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>}
      28. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>public<properties resource="db.properties"> </properties>void<properties resource="db.properties"> </properties>setPassword(String<properties resource="db.properties"> </properties>password)<properties resource="db.properties"> </properties>{
      29. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>this.password<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>password;
      30. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>}
      31. }
      复制代码
    • 编写Mapper接口(Dao)
      1. public<properties resource="db.properties"> </properties>interface<properties resource="db.properties"> </properties>UserMapper<properties resource="db.properties"> </properties>{
      2. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>public<properties resource="db.properties"> </properties>List<User><properties resource="db.properties"> </properties>getUser();
      3. }
      复制代码
    • 编写Mapper配置文件
      1. //注:每个Mapper文件都需要在mybatis-config.xml文件中去注册
      2. //<mapper<properties resource="db.properties"> </properties>resource="Mapper/UserMapper.xml"/>
      3. //相当于Mapper的接口实现类
      4. <?xml<properties resource="db.properties"> </properties>version="1.0"<properties resource="db.properties"> </properties>encoding="UTF-8"<properties resource="db.properties"> </properties>?>
      5. <!DOCTYPE<properties resource="db.properties"> </properties>mapper
      6. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>PUBLIC<properties resource="db.properties"> </properties>"-//mybatis.org//DTD<properties resource="db.properties"> </properties>Mapper<properties resource="db.properties"> </properties>3.0//EN"
      7. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
      8. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>
      9. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>//namespace:命名空间,指定要实现的Mapper接口,路径映射
      10. <mapper<properties resource="db.properties"> </properties>namespace="com.study.dao.UserMapper">
      11. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>
      12. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>//id:唯一匹配于Mapper接口的方法名
      13. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>//resultType:返回类型,必须写全限定名称
      14. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><select<properties resource="db.properties"> </properties>id="getUser"<properties resource="db.properties"> </properties>resultType="com.study.pojo.User">
      15. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>select<properties resource="db.properties"> </properties>*<properties resource="db.properties"> </properties>from<properties resource="db.properties"> </properties>user;
      16. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties></select>
      17. </mapper>
      复制代码

  • 测试
    1. public<properties resource="db.properties"> </properties>class<properties resource="db.properties"> </properties>UserMapperTest<properties resource="db.properties"> </properties>{
    2. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>@Test
    3. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>public<properties resource="db.properties"> </properties>void<properties resource="db.properties"> </properties>test(){
    4. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>//获得sqlSession对象
    5. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>SqlSession<properties resource="db.properties"> </properties>sqlSession<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>MybatisUtils.getSqlSession();
    6. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>//获取UserMapper的对象以调用接口内的方法
    7. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>UserMapper<properties resource="db.properties"> </properties>userMapper<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>sqlSession.getMapper(UserMapper.class);
    8. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>//调用方法
    9. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>List<User><properties resource="db.properties"> </properties>users<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>userMapper.getUser();
    10. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>//遍历结果集
    11. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>for<properties resource="db.properties"> </properties>(User<properties resource="db.properties"> </properties>user<properties resource="db.properties"> </properties>:<properties resource="db.properties"> </properties>users)<properties resource="db.properties"> </properties>{
    12. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>System.out.println(user.getId()<properties resource="db.properties"> </properties>+<properties resource="db.properties"> </properties>"<properties resource="db.properties"> </properties>"<properties resource="db.properties"> </properties>+<properties resource="db.properties"> </properties>user.getUsername()<properties resource="db.properties"> </properties>+<properties resource="db.properties"> </properties>"<properties resource="db.properties"> </properties>"<properties resource="db.properties"> </properties>+<properties resource="db.properties"> </properties>user.getPassword());
    13. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>}
    14. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>//关闭sqlSessoin
    15. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>sqlSession.close();
    16. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>}
    17. }
    复制代码
2.3、使用Mybatis的三个重要类


  • SqlSessionFactoryBuilder:
    可以重用<properties resource="db.properties"> </properties>SqlSessionFactoryBuilder<properties resource="db.properties"> </properties>来创建多个<properties resource="db.properties"> </properties>SqlSessionFactory<properties resource="db.properties"> </properties>实例,但最好还是不要一直保留着它,以保证所有的<properties resource="db.properties"> </properties>XML<properties resource="db.properties"> </properties>解析资源可以被释放给更重要的事情
  • SqlSessionFactory:
    SqlSessionFactory<properties resource="db.properties"> </properties>一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例,最简单的就是使用单例模式或者静态单例模式
  • SqlSession:
    SqlSession<properties resource="db.properties"> </properties>的实例不是线程安全的,因此是不能被共享的,每次打开一个<properties resource="db.properties"> </properties>SqlSession,记得关闭它,<properties resource="db.properties"> </properties>这个关闭操作很重要
3.Mybatis的CRUD简单实现

3.1、通过id查找用户:


  • 接口:
    1. public<properties resource="db.properties"> </properties>User<properties resource="db.properties"> </properties>getUserById(int<properties resource="db.properties"> </properties>id);
    复制代码
  • Mapper配置文件
    1. <select<properties resource="db.properties"> </properties>id="getUserById"<properties resource="db.properties"> </properties>resultType="com.study.pojo.User">
    2. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>select<properties resource="db.properties"> </properties>*<properties resource="db.properties"> </properties>from<properties resource="db.properties"> </properties>user<properties resource="db.properties"> </properties>where<properties resource="db.properties"> </properties>id=#{id};
    3. </select>
    复制代码
  • 测试
    1. SqlSession<properties resource="db.properties"> </properties>sqlSession<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>MybatisUtils.getSqlSession();
    2. UserMapper<properties resource="db.properties"> </properties>userMapper<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>sqlSession.getMapper(UserMapper.class);
    3. User<properties resource="db.properties"> </properties>user<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>userMapper.getUserById(1);
    4. sqlSession.close();
    复制代码
3.2、插入用户:


  • 接口:
    1. public<properties resource="db.properties"> </properties>void<properties resource="db.properties"> </properties>insertUser(User<properties resource="db.properties"> </properties>user);
    复制代码
  • Mapper配置文件
    1. <insert<properties resource="db.properties"> </properties>id="insertUser">
    2. <insert<properties resource="db.properties"> </properties>id="insertUser">
    3. <insert<properties resource="db.properties"> </properties>id="insertUser">
    4. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>insert<properties resource="db.properties"> </properties>into<properties resource="db.properties"> </properties>user<properties resource="db.properties"> </properties>values<properties resource="db.properties"> </properties>(#{id},#{username},#{password});
    5. </insert>
    6. </insert>
    7. </insert>
    复制代码
  • 测试
    1. SqlSession<properties resource="db.properties"> </properties>sqlSession<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>MybatisUtils.getSqlSession();
    2. UserMapper<properties resource="db.properties"> </properties>userMapper<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>sqlSession.getMapper(UserMapper.class);
    3. userMapper.insertUser(new<properties resource="db.properties"> </properties>User(5,"老六","1234"));
    4. sqlSession.commit();
    5. sqlSession.close();
    6. //注:在Mybatis中增删改查找都需要使用事务,必须手动提交事务如果没有配置自动管理事务的情况下
    复制代码
3.3、根据id更改用户名字:


  • 接口:
    1. public<properties resource="db.properties"> </properties>void<properties resource="db.properties"> </properties>insertUser(User<properties resource="db.properties"> </properties>user);
    复制代码
  • Mapper配置文件
    1. <insert<properties resource="db.properties"> </properties>id="insertUser">
    2. <insert<properties resource="db.properties"> </properties>id="insertUser">
    3. <insert<properties resource="db.properties"> </properties>id="insertUser">
    4. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>insert<properties resource="db.properties"> </properties>into<properties resource="db.properties"> </properties>user<properties resource="db.properties"> </properties>values<properties resource="db.properties"> </properties>(#{id},#{username},#{password});
    5. </insert>
    6. </insert>
    7. </insert>
    复制代码
  • 测试
    1. //当有多个参数的时候,可以使用@Param()注解指定名字
    2. //public<properties resource="db.properties"> </properties>void<properties resource="db.properties"> </properties>updateName(@Param("id")<properties resource="db.properties"> </properties>int<properties resource="db.properties"> </properties>id,@Param("username")<properties resource="db.properties"> </properties>String<properties resource="db.properties"> </properties>username);
    3. SqlSession<properties resource="db.properties"> </properties>sqlSession<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>MybatisUtils.getSqlSession();
    4. UserMapper<properties resource="db.properties"> </properties>userMapper<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>sqlSession.getMapper(UserMapper.class);
    5. userMapper.updateName(3,"王五");
    6. sqlSession.commit();
    7. sqlSession.close();
    复制代码
3.4、<properties resource="db.properties"> </properties>根据id删除用户:


  • 接口:
    1. public<properties resource="db.properties"> </properties>void<properties resource="db.properties"> </properties>insertUser(User<properties resource="db.properties"> </properties>user);
    复制代码
  • Mapper配置文件
    1. <insert<properties resource="db.properties"> </properties>id="insertUser">
    2. <insert<properties resource="db.properties"> </properties>id="insertUser">
    3. <insert<properties resource="db.properties"> </properties>id="insertUser">
    4. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>insert<properties resource="db.properties"> </properties>into<properties resource="db.properties"> </properties>user<properties resource="db.properties"> </properties>values<properties resource="db.properties"> </properties>(#{id},#{username},#{password});
    5. </insert>
    6. </insert>
    7. </insert>
    复制代码
  • 测试
    1. SqlSession<properties resource="db.properties"> </properties>sqlSession<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>MybatisUtils.getSqlSession();
    2. UserMapper<properties resource="db.properties"> </properties>userMapper<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>sqlSession.getMapper(UserMapper.class);
    3. userMapper.deleteUserById(5);
    4. sqlSession.commit();
    5. sqlSession.close();
    复制代码
3.5、好用的Map

当接口中传递的对象有多个的时候,除了可以使用·@Param()注解之外,我们常常使用一个不算规范但是特别好用的方式,那就是传递Map

  • 接口:
    1. <properties resource="db.properties"> </properties>public<properties resource="db.properties"> </properties>void<properties resource="db.properties"> </properties>updateNameById(Map<String,Object><properties resource="db.properties"> </properties>map);
    复制代码
  • mapper配置文件:
    1. <update<properties resource="db.properties"> </properties>id="updateNameById"<properties resource="db.properties"> </properties>>
    2. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>update<properties resource="db.properties"> </properties>user<properties resource="db.properties"> </properties>set<properties resource="db.properties"> </properties>username=#{username}<properties resource="db.properties"> </properties>where<properties resource="db.properties"> </properties>id=#{id};
    3. </update>
    复制代码
  • 调用:
    1. SqlSession<properties resource="db.properties"> </properties>sqlSession<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>MybatisUtils.getSqlSession();
    2. UserMapper<properties resource="db.properties"> </properties>userMapper<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>sqlSession.getMapper(UserMapper.class);
    3. Map<String,Object><properties resource="db.properties"> </properties>map=new<properties resource="db.properties"> </properties>HashMap();
    4. map.put("username","战三");
    5. map.put("id",2);
    6. userMapper.updateNameById(map);
    7. sqlSession.commit();
    8. sqlSession.close();
    复制代码
总结:

  • 当接口只传递一个参数的时候:可以直接在mapper文件使用,且不需要与参数名字对应
  • 当需要多个参数的时候:

    • 如果有一个实体类正好与之对应,那么可以传递一个对象,然后在mapper文件中通过#{对象.属性}调用
    • 通过使用注解的方式@Param()指定名字
    • 通过传递一个Map

3.6、模糊查询


  • 方式一:在java代码在传递“%”
    1. userMapper.getUserLike("%张%");
    复制代码
  • 方式二:在mapper文件的sql语句中实现
    1. <select<properties resource="db.properties"> </properties>id="getUserLike"<properties resource="db.properties"> </properties>resultType="com.study.pojo.User">
    2. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>select<properties resource="db.properties"> </properties>*<properties resource="db.properties"> </properties>from<properties resource="db.properties"> </properties>user<properties resource="db.properties"> </properties>where<properties resource="db.properties"> </properties>username<properties resource="db.properties"> </properties>like<properties resource="db.properties"> </properties>"%"#{name}"%"<properties resource="db.properties"> </properties>;
    3. </select>
    复制代码
4.配置解析

MyBatis<properties resource="db.properties"> </properties>的配置文件包含了会深深影响<properties resource="db.properties"> </properties>MyBatis<properties resource="db.properties"> </properties>行为的设置和属性信息。<properties resource="db.properties"> </properties>配置文档的顶层结构如下:

  • configuration(配置)

    • properties(属性)
    • settings(设置)
    • typeAliases(类型别名)
    • typeHandlers(类型处理器)
    • objectFactory(对象工厂)
    • plugins(插件)
    • environments(环境配置)

      • environment(环境变量)

        • transactionManager(事务管理器)
        • dataSource(数据源)


    • databaseIdProvider(数据库厂商标识)
    • mappers(映射器)

4.1、environments<properties resource="db.properties"> </properties>环境配置

MyBatis<properties resource="db.properties"> </properties>可以配置成适应多种环境,不过要记住:尽管可以配置多个环境,但每个<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>SqlSessionFactory<properties resource="db.properties"> </properties>实例只能选择一种环境。
environments<properties resource="db.properties"> </properties>元素定义了如何配置环境。
  1. <environments<properties resource="db.properties"> </properties>default="development">
  2. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><environment<properties resource="db.properties"> </properties>id="development">
  3. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><transactionManager<properties resource="db.properties"> </properties>type="JDBC">
  4. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><property<properties resource="db.properties"> </properties>name="..."<properties resource="db.properties"> </properties>value="..."/>
  5. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties></transactionManager>
  6. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><dataSource<properties resource="db.properties"> </properties>type="POOLED">
  7. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><property<properties resource="db.properties"> </properties>name="driver"<properties resource="db.properties"> </properties>value="${driver}"/>
  8. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><property<properties resource="db.properties"> </properties>name="url"<properties resource="db.properties"> </properties>value="${url}"/>
  9. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><property<properties resource="db.properties"> </properties>name="username"<properties resource="db.properties"> </properties>value="${username}"/>
  10. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><property<properties resource="db.properties"> </properties>name="password"<properties resource="db.properties"> </properties>value="${password}"/>
  11. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties></dataSource>
  12. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties></environment>
  13. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>
  14. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>
  15. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><environment<properties resource="db.properties"> </properties>id="test">
  16. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties></environment>
  17. </environments>
复制代码
注意点:

  • 默认使用的环境<properties resource="db.properties"> </properties>ID(比如:default="development")。
  • 每个<properties resource="db.properties"> </properties>environment<properties resource="db.properties"> </properties>元素定义的环境<properties resource="db.properties"> </properties>ID(比如:id="development")。
  • 事务管理器的配置(比如:type="JDBC")。
  • 数据源的配置(比如:type="POOLED")。
4.2、properties(属性)

可以从外部的资源环境读取,也可以在内部定义,可以动态的替换环境中的配置信息

  • 外部资源文件引入:

    • db.properties
      1. driver=com.mysql.cj.jdbc.Driver
      2. url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
      3. username=root
      4. password=11111111
      复制代码
    • 引入:
      1. <properties resource="db.properties"> </properties>
      复制代码

  • 内部使用property定义:
    1. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>
    复制代码
设置好的属性可以动态替换:
  1. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>
复制代码
注:如果同时使用了外部资源文件和内部定义的方式那么会使用外部资源文件。
4.3、typeAliases(类型别名)

类型别名可为<properties resource="db.properties"> </properties>Java<properties resource="db.properties"> </properties>类型设置一个缩写名字,降低冗余的全限定类名书写

  • 方式一:使用具体的全限定类名
    1. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>
    复制代码
    注:设定之后在其他使用domain.blog.Author的地方就可以使用Author代替
  • 方式二:使用实体类包名
    1. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>
    复制代码
    注:通过这种方式设定之后,在该包下所有的实体类的全限定类名可以使用该类名的首字母小写来代替,比如User使用user代替
总结:两种方式各有优劣,当类比较少的时候可以使用第一种方式,当类比较多的时候可以使用第二种方式,如果想在使用第二种方式的同时给特点的类设定指定名字,可以使用注解的方式,且如果同时使用了第一种方式和第二种方式那么使用两个别名都正确。
  1. @Alias("author")public<properties resource="db.properties"> </properties>class<properties resource="db.properties"> </properties>Author<properties resource="db.properties"> </properties>{}
复制代码
4.4、settings(设置)

1.常用的一些设置:
设置名描述有效值默认值cacheEnabled全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。true<properties resource="db.properties"> </properties>|<properties resource="db.properties"> </properties>falsetruelazyLoadingEnabled延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。<properties resource="db.properties"> </properties>特定关联关系中可通过设置<properties resource="db.properties"> </properties>fetchType<properties resource="db.properties"> </properties>属性来覆盖该项的开关状态。true<properties resource="db.properties"> </properties>|<properties resource="db.properties"> </properties>falsefalseuseGeneratedKeys允许<properties resource="db.properties"> </properties>JDBC<properties resource="db.properties"> </properties>支持自动生成主键,需要数据库驱动支持。如果设置为<properties resource="db.properties"> </properties>true,将强制使用自动生成主键。尽管一些数据库驱动不支持此特性,但仍可正常工作(如<properties resource="db.properties"> </properties>Derby)。true<properties resource="db.properties"> </properties>|<properties resource="db.properties"> </properties>falseFalsemapUnderscoreToCamelCase是否开启驼峰命名自动映射,即从经典数据库列名<properties resource="db.properties"> </properties>A_COLUMN<properties resource="db.properties"> </properties>映射到经典<properties resource="db.properties"> </properties>Java<properties resource="db.properties"> </properties>属性名<properties resource="db.properties"> </properties>aColumn。true<properties resource="db.properties"> </properties>|<properties resource="db.properties"> </properties>falseFalselogImpl指定<properties resource="db.properties"> </properties>MyBatis<properties resource="db.properties"> </properties>所用日志的具体实现,未指定时将自动查找。SLF4J<properties resource="db.properties"> </properties>|<properties resource="db.properties"> </properties>LOG4J<properties resource="db.properties"> </properties>|<properties resource="db.properties"> </properties>LOG4J2<properties resource="db.properties"> </properties>|<properties resource="db.properties"> </properties>JDK_LOGGING<properties resource="db.properties"> </properties>|<properties resource="db.properties"> </properties>COMMONS_LOGGING<properties resource="db.properties"> </properties>|<properties resource="db.properties"> </properties>STDOUT_LOGGING<properties resource="db.properties"> </properties>|<properties resource="db.properties"> </properties>NO_LOGGING未设置日志:

  • STDOUT_LOGGING<properties resource="db.properties"> </properties>(mybatis默认)
  • LOG4J<properties resource="db.properties"> </properties>(掌握)
  • LOG4J2
  • JDK_LOGGING
  • COMMONS_LOGGING
  • SLF4J
  • NO_LOGGING:
4.5、mappers(映射器)


  • 作用:告诉<properties resource="db.properties"> </properties>MyBatis<properties resource="db.properties"> </properties>到哪里去找映射文件
  • 实现方式:

    • 方式一:resource(推荐)
      1. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>
      复制代码
    • 方式二:url(极不推荐)
      1. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>
      复制代码
    • 方式三:class
      1. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>
      复制代码
      注:

      • 接口必须和mapper配置文件在同一个包下
      • 接口和mapper配置文件的名字必须相同

    • 方式四:name
      1. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>
      复制代码
      注:

      • 接口必须和mapper配置文件在同一个包下
      • 接口和mapper配置文件的名字必须相同


4.6、其他(暂时了解)


  • typeHandlers(类型处理器)
  • objectFactory(对象工厂)
  • plugins(插件)(有用)

    • Mybatis<properties resource="db.properties"> </properties>PageHelper分页插件
    • Mybatis通用Mapper插件
    • Mybatis<properties resource="db.properties"> </properties>Plus插件
    • 代码生成插件mybatis-generator

5.拓展:当属性名和列名不一致

假设存在一个数据库user表,字段如下:

一个User实体类如下:
  1. public<properties resource="db.properties"> </properties>class<properties resource="db.properties"> </properties>User<properties resource="db.properties"> </properties>{<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>private<properties resource="db.properties"> </properties>int<properties resource="db.properties"> </properties>id;<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>private<properties resource="db.properties"> </properties>String<properties resource="db.properties"> </properties>username;<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>private<properties resource="db.properties"> </properties>String<properties resource="db.properties"> </properties>password;<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>}
复制代码
那么当查询结果集为User类型的时候,会出现姓名为空的问题。
解决方式:

  • 方式一:在sql语句中使用别名
    1. select<properties resource="db.properties"> </properties>id<properties resource="db.properties"> </properties>,name<properties resource="db.properties"> </properties>as<properties resource="db.properties"> </properties>usernaem,password<properties resource="db.properties"> </properties>from<properties resource="db.properties"> </properties>user;
    复制代码
  • 方式二:resultMap结果映射
    1. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>select<properties resource="db.properties"> </properties>*<properties resource="db.properties"> </properties>from<properties resource="db.properties"> </properties>user<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>;
    复制代码

    • resultMap<properties resource="db.properties"> </properties>元素是<properties resource="db.properties"> </properties>MyBatis<properties resource="db.properties"> </properties>中最重要最强大的元素。
    • ResultMap<properties resource="db.properties"> </properties>的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。
    • ResultMap<properties resource="db.properties"> </properties>的优秀之处——你完全可以不用显式地配置它们,如上面的resultMap可以改为
    1. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>
    复制代码
    即只需要显示的配置不匹配的情况即可。
    注:其实第一种方法使用别名的本质上还是使用了resultMap的映射,因为在这些情况下,MyBatis<properties resource="db.properties"> </properties>会在幕后自动创建一个<properties resource="db.properties"> </properties>ResultMap,再根据属性名来映射列到<properties resource="db.properties"> </properties>JavaBean<properties resource="db.properties"> </properties>的属性上。

6.日志

6.1、日志工厂


  • 当我们操作数据库出现错误时,需要借助一些手段进行排错

    • 之前:sout,debug
    • 现在:日志

  • 日志类别:

    • STDOUT_LOGGING(掌握)(默认的标准日志工厂)
    • LOG4J(掌握)
    • LOG4J2
    • SLF4J
    • JDK_LOGGING
    • COMMONS_LOGGING
    • NO_LOGGING

  • 配置日志:
    1. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>
    复制代码
    使用了日志之后,我们就可以查看到非常多的信息

6.2、Log4j


  • 介绍:

    • Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件等
    • 我们也可以控制每一条日志的输出格式;
    • 通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
    • 可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

  • log4j:

    • 导入log4j依赖
      1. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>log4j<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>log4j<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>1.2.17
      复制代码
    • log4j.properties
      1. #将等级为debug的日志信息输出到console和file,其中console为控制台,名字可以自己定义,file相同log4j.rootLogger=DEBUG,console,file#控制台输出的相关设置log4j.appender.console=org.apache.log4j.ConsoleAppenderlog4j.appender.console.Target=System.outlog4j.appender.console.layout=org.apache.log4j.PatternLayoutlog4j.appender.console.layout.ConversionPattern=%p:%c%n%m%l%n%m<properties resource="db.properties"> </properties>#文件输出的相关设置log4j.appender.file=org.apache.log4j.FileAppenderlog4j.appender.file.File=d:/log4jFile/mybatis.loglog4j.appender.file.layout=org.apache.log4j.PatternLayoutlog4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>HH:mm:ss}<properties resource="db.properties"> </properties>%l<properties resource="db.properties"> </properties>%F<properties resource="db.properties"> </properties>%p<properties resource="db.properties"> </properties>%m%nlog4j.appender.file.MaxFileSize=10mb#控制日志的输出鉴别log4j.logger.org.mybatis=DEBUGlog4j.logger.java.sql.ResultSet=DEBUGlog4j.logger.java.sql=DEBUGlog4j.logger.java.sql.Statement=DEBUGlog4j.logger.java.sql.PreparedStatement=DEBUG
      复制代码
    • 在mybatis-config中配置log4j的使用
      1. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>
      复制代码

7.分页

思考:为什么要分页

  • 减少数据的处理量
7.1、<properties resource="db.properties"> </properties>limit分页:
  1. select<properties resource="db.properties"> </properties>*<properties resource="db.properties"> </properties>from<properties resource="db.properties"> </properties>user<properties resource="db.properties"> </properties>limit<properties resource="db.properties"> </properties>startIndex,pagesize;select<properties resource="db.properties"> </properties>*from<properties resource="db.properties"> </properties>user<properties resource="db.properties"> </properties>limit<properties resource="db.properties"> </properties>pagesize;<properties resource="db.properties"> </properties>--<properties resource="db.properties"> </properties>当只有一个参数的时候,从第一个数据开始
复制代码
7.2、<properties resource="db.properties"> </properties>RowBounds分页(不推荐使用)


  • 接口:
    1. public<properties resource="db.properties"> </properties>List<properties resource="db.properties"> </properties>getUser();
    复制代码
  • mapper.xml:
    1. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>select<properties resource="db.properties"> </properties>*<properties resource="db.properties"> </properties>from<properties resource="db.properties"> </properties>user<properties resource="db.properties"> </properties>;
    复制代码
  • 实现:
    1. SqlSession<properties resource="db.properties"> </properties>sqlSession<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>MybatisUtils.getSqlSession();RowBounds<properties resource="db.properties"> </properties>rowBounds=new<properties resource="db.properties"> </properties>RowBounds(1,2);List<properties resource="db.properties"> </properties>list<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>sqlSession.selectList("com.study.dao.UserMapper.getUser",<properties resource="db.properties"> </properties>null,<properties resource="db.properties"> </properties>rowBounds);for<properties resource="db.properties"> </properties>(Object<properties resource="db.properties"> </properties>user<properties resource="db.properties"> </properties>:<properties resource="db.properties"> </properties>list)<properties resource="db.properties"> </properties>{<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>System.out.println(user.toString());}
    复制代码
7.3、分页插件

使用PageHelper分页插件,https://pagehelper.github.io/,了解一下即可,如有需要再看使用文档。
8.注解开发


  • 使用注解来映射简单语句会使代码显得更加简洁
  • 但对于稍微复杂一点的语句,Java<properties resource="db.properties"> </properties>注解不仅力不从心,还会让你本就复杂的<properties resource="db.properties"> </properties>SQL<properties resource="db.properties"> </properties>语句更加混乱不堪
  • 如果需要做一些很复杂的操作,最好用<properties resource="db.properties"> </properties>XML<properties resource="db.properties"> </properties>来映射语句。
使用建议:除非是很简单的操作,否则尽量建议使用xml方式完成,一般而言我们都会使用xml。
8.1、常用的注解


  • @Insert:
    插入记录的时候麻烦的一点是主键如何生成,对此基本上有三种方案,分别是手动指定(应用层)、自增主键(数据层单表)、选择主键(数据层多表)。(如想了解可以查)
    1. @Insert("insert<properties resource="db.properties"> </properties>into<properties resource="db.properties"> </properties>user<properties resource="db.properties"> </properties>values<properties resource="db.properties"> </properties>(#{id},#{username},null)")
    复制代码
  • @Delete:
    1. @Delete("delete<properties resource="db.properties"> </properties>from<properties resource="db.properties"> </properties>user<properties resource="db.properties"> </properties>where<properties resource="db.properties"> </properties>id=#{id};")
    复制代码
  • @Updata:
    1. @Update("<properties resource="db.properties"> </properties>update<properties resource="db.properties"> </properties>user<properties resource="db.properties"> </properties>set<properties resource="db.properties"> </properties>username=#{username}<properties resource="db.properties"> </properties>where<properties resource="db.properties"> </properties>id=#{id};")
    复制代码
  • @select:
    1. @Select("select<properties resource="db.properties"> </properties>*<properties resource="db.properties"> </properties>from<properties resource="db.properties"> </properties>user")
    复制代码
  • @Param:
    在接口中传递多个参数的时候可以指定
    1. <properties resource="db.properties"> </properties>public<properties resource="db.properties"> </properties>void<properties resource="db.properties"> </properties>updateName(@Param("id")<properties resource="db.properties"> </properties>int<properties resource="db.properties"> </properties>id,@Param("username")<properties resource="db.properties"> </properties>String<properties resource="db.properties"> </properties>username);
    复制代码
    注:

    • 基本类型或者String类型需要加上
    • 引用类型不需要加
    • 如果只有一个基本类型的参数可以不加
    • 在mapper.xml中使用的就是它指定的名字

  • @Results,<properties resource="db.properties"> </properties>@Result:
    当使用select标签时,如果查询的字段与当前实体类不能进行很好的匹配那么需要我们进行一个映射
    1. @Results(id<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>"userMap",<properties resource="db.properties"> </properties>value<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>{<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>@Result(id=true,<properties resource="db.properties"> </properties>column<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>"id",<properties resource="db.properties"> </properties>property<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>"id"),<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>@Result(column<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>"username",<properties resource="db.properties"> </properties>property<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>"username"),<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>@Result(column<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>"passwd",<properties resource="db.properties"> </properties>property<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>"passwd"),})@Select("SELECT<properties resource="db.properties"> </properties>*<properties resource="db.properties"> </properties>FROM<properties resource="db.properties"> </properties>t_user<properties resource="db.properties"> </properties>WHERE<properties resource="db.properties"> </properties>id=#{id}")User<properties resource="db.properties"> </properties>loadByIdResultMap(Long<properties resource="db.properties"> </properties>id);
    复制代码
  • @ResultMap:
    如果以及存在一个@Results,那么可以通过@ResultMap指定id名字去引用它
    1. @ResultMap("userMap")@Select("SELECT<properties resource="db.properties"> </properties>*<properties resource="db.properties"> </properties>FROM<properties resource="db.properties"> </properties>t_user<properties resource="db.properties"> </properties>WHERE<properties resource="db.properties"> </properties>id=#{id}")User<properties resource="db.properties"> </properties>loadByIdResultMapReference(Long<properties resource="db.properties"> </properties>id);
    复制代码
8.2、使用注解开发


  • 接口:
    1. public<properties resource="db.properties"> </properties>interface<properties resource="db.properties"> </properties>UserMapper<properties resource="db.properties"> </properties>{<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>@Select("select<properties resource="db.properties"> </properties>*<properties resource="db.properties"> </properties>from<properties resource="db.properties"> </properties>user")<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>public<properties resource="db.properties"> </properties>List<properties resource="db.properties"> </properties>getUser();<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>@Update("<properties resource="db.properties"> </properties>update<properties resource="db.properties"> </properties>user<properties resource="db.properties"> </properties>set<properties resource="db.properties"> </properties>username=#{username}<properties resource="db.properties"> </properties>where<properties resource="db.properties"> </properties>id=#{id};")<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>public<properties resource="db.properties"> </properties>void<properties resource="db.properties"> </properties>updateName(@Param("id")<properties resource="db.properties"> </properties>int<properties resource="db.properties"> </properties>id,@Param("username")<properties resource="db.properties"> </properties>String<properties resource="db.properties"> </properties>username);<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>@Insert("insert<properties resource="db.properties"> </properties>into<properties resource="db.properties"> </properties>user<properties resource="db.properties"> </properties>values<properties resource="db.properties"> </properties>(#{id},#{username},null)")<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>public<properties resource="db.properties"> </properties>void<properties resource="db.properties"> </properties>insertUser(User<properties resource="db.properties"> </properties>user);<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>@Delete("delete<properties resource="db.properties"> </properties>from<properties resource="db.properties"> </properties>user<properties resource="db.properties"> </properties>where<properties resource="db.properties"> </properties>id=#{id};")<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>public<properties resource="db.properties"> </properties>void<properties resource="db.properties"> </properties>deleteUserById(int<properties resource="db.properties"> </properties>id);}
    复制代码
  • mybatis-config.xml注册接口:
    1. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>
    复制代码
  • 测试:
    1. SqlSession<properties resource="db.properties"> </properties>sqlSession<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>MybatisUtils.getSqlSession();UserMapper<properties resource="db.properties"> </properties>userMapper<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>sqlSession.getMapper(UserMapper.class);List<properties resource="db.properties"> </properties>user<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>userMapper.getUser();//userMapper.insertUser(new<properties resource="db.properties"> </properties>User(6,"随便","123123"));//userMapper.updateName(2,"还行");//userMapper.deleteUserById(1);for<properties resource="db.properties"> </properties>(User<properties resource="db.properties"> </properties>user1<properties resource="db.properties"> </properties>:<properties resource="db.properties"> </properties>user)<properties resource="db.properties"> </properties>{<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>System.out.println(user1);}sqlSession.commit();sqlSession.close();
    复制代码
本质:反射机制实现
底层:动态代理
8.3、关于#{}和${}的比较


  • 前者是占位,在使用时会将传入的字符串加上引号当做一个整体,${}是拼接,在使用的时候会将传入的字符串不做处理直接拼接
  • 使用#{}时会进行预编译可以防止sql注入,使用${}不会预编译不可以防止sql注入
  • 使用时#{}是编译好SQL后语句再去取值,${}取值以后再去编译SQL语句
  • 建议:一般能用#{}就不用${}
8.4、当注解开发和xml开发同时使用

注:虽然注解和xml配置文件可以同时使用,但是如果在接口中的同一个方法上既使用了注解,有在xml文件中进行了配置,也就是对同一个方法同时使用了注解配置文件两种方式,那么程序会报错。
9.Lombok

Lombok项目是一个java库,它可以自动插入到编辑器和构建工具中,增强java的性能。不需要再写getter、setter或equals方法,只要有一个注解,你的类就有一个功能齐全的构建器、自动记录变量等等.

  • 常用注解:

    • Data:整合了Getter、Setter、ToString、EqualsAndHashCode、无参构造函数注解。
    • Getter:快速构建Getter方法。
    • Setter:快速构建Setter方法。
    • ToString:快速将当前对象转换成字符串类型,便于log
    • EqualsAndHashCode:快速进行相等判断
    • NonNull:判断变量(对象)是否为空。
    • AllArgsConstructor:快速构建全部参数的构造函数
    • NoArgsConstructor:快速构建无参构造函数

  • Lombok的使用:

    • 在IDEA中安装Lombok插件
      <img<properties resource="db.properties"> </properties>alt="image-20220727153039855"<properties resource="db.properties"> </properties>loading="lazy">
    • 在项目中导入lombok的jar包
      1. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>org.projectlombok<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>lombok<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>1.18.16
      复制代码
    • 使用:
      1. @Data@AllArgsConstructor@NoArgsConstructorpublic<properties resource="db.properties"> </properties>class<properties resource="db.properties"> </properties>Persosn<properties resource="db.properties"> </properties>{<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>private<properties resource="db.properties"> </properties>String<properties resource="db.properties"> </properties>name;<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>private<properties resource="db.properties"> </properties>int<properties resource="db.properties"> </properties>age;}
      复制代码
      注:由于使用@Data只含有无参构造函数,使用要结合@AllArgsConstructor使用,但是使用了@AllArgsConstructor之后@Data的无参构造函数就会消失,使用需要再搭配@NoArgsConstructor使用。

注:缺点:无法承载有各种参数的构造函数,但是我们可以手动的去添加。
10.复杂查询

10.1、模拟场景环境搭建


  • 新建项目,导入相关依赖
  • 配置文件的编写
  • 新建实体类Student和Teacher
  • 建立对应的Mapper接口
  • 建立对应的Mapper配置文件
  • 注册配置文件
  • 测试环境搭建是否成功
10.2、多对一实际应用:关联

比如多个学生对应一个老师,就是多对一
实体类如下:
  1. @Datapublic<properties resource="db.properties"> </properties>class<properties resource="db.properties"> </properties>Student<properties resource="db.properties"> </properties>{<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>private<properties resource="db.properties"> </properties>int<properties resource="db.properties"> </properties>id;<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>private<properties resource="db.properties"> </properties>String<properties resource="db.properties"> </properties>name;<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>private<properties resource="db.properties"> </properties>Teacher<properties resource="db.properties"> </properties>teacher;//多个学生一个老师}@Datapublic<properties resource="db.properties"> </properties>class<properties resource="db.properties"> </properties>Teacher<properties resource="db.properties"> </properties>{<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>private<properties resource="db.properties"> </properties>int<properties resource="db.properties"> </properties>id;<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>private<properties resource="db.properties"> </properties>String<properties resource="db.properties"> </properties>name;}
复制代码
实现关键:association
10.2.1、嵌套查询
  1. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>select<properties resource="db.properties"> </properties>*<properties resource="db.properties"> </properties>from<properties resource="db.properties"> </properties>student<properties resource="db.properties"> </properties>;<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>select<properties resource="db.properties"> </properties>*<properties resource="db.properties"> </properties>from<properties resource="db.properties"> </properties>teacher<properties resource="db.properties"> </properties>where<properties resource="db.properties"> </properties>id=#{id}<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>and<properties resource="db.properties"> </properties>views>#{views}<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>
复制代码
注:第一个where条件后面加一个1=1是为了方便后面的每一个判断条件追加sql的第一个能写and
11.3.2、choose<properties resource="db.properties"> </properties>(when,<properties resource="db.properties"> </properties>otherwise)


  • 有时候,我们不想使用所有的条件,而只是想从多个条件中选择一个使用。针对这种情况,MyBatis<properties resource="db.properties"> </properties>提供了<properties resource="db.properties"> </properties>choose<properties resource="db.properties"> </properties>元素,它有点像<properties resource="db.properties"> </properties>Java<properties resource="db.properties"> </properties>中的<properties resource="db.properties"> </properties>switch<properties resource="db.properties"> </properties>语句。
  1. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>select<properties resource="db.properties"> </properties>*<properties resource="db.properties"> </properties>from<properties resource="db.properties"> </properties>blog<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>id=#{id}<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>and<properties resource="db.properties"> </properties>title<properties resource="db.properties"> </properties>=#{title}<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>and<properties resource="db.properties"> </properties>author<properties resource="db.properties"> </properties>=#{author}<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>and<properties resource="db.properties"> </properties>views>#{views}<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>
复制代码

  • 注:当同时满足多个when的时候,按照顺序选择拼接,比如第一个when满足那么即是后面的满足了也不会拼接,然后都不满足那么拼接otherwise里面的内容,另外otherwise不是必须的
11.3.3、trim<properties resource="db.properties"> </properties>(where,<properties resource="db.properties"> </properties>set)


  • where:where<properties resource="db.properties"> </properties>元素只会在子元素返回任何内容的情况下才插入<properties resource="db.properties"> </properties>“WHERE”<properties resource="db.properties"> </properties>子句。而且,若子句的开头为<properties resource="db.properties"> </properties>“AND”<properties resource="db.properties"> </properties>或<properties resource="db.properties"> </properties>“OR”,where<properties resource="db.properties"> </properties>元素也会将它们去除。
  • set:set<properties resource="db.properties"> </properties>元素可以用于动态包含需要更新的列,忽略其它不更新的列
    1. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>update<properties resource="db.properties"> </properties>Author<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>author=#{author},<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>title=#{title},<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>views=#{views}<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>
    复制代码
  • trim:

    • trim包含的属性;

      • prefix:自定义前缀
      • prefixOverrides:需要被移除的前缀
      • suffix:自定义后缀
      • suffixOverrides:需要被移除的后缀

    • 可以自定义标签的替换方式,比如与where等同效果的格式如下:
      1. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>...
      复制代码
      prefixOverrides<properties resource="db.properties"> </properties>属性会忽略通过管道符分隔的文本序列(注意此例中的空格是必要的)。上述例子会移除所有<properties resource="db.properties"> </properties>prefixOverrides<properties resource="db.properties"> </properties>属性中指定的内容,并且插入<properties resource="db.properties"> </properties>prefix<properties resource="db.properties"> </properties>属性中指定的内容。
    • 与set等同效果的格式如下:
      1. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>...
      复制代码

11.3.4、foreach


  • foreach<properties resource="db.properties"> </properties>元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量。它也允许你指定开头与结尾的字符串以及集合项迭代之间的分隔符。
  • 可以将任何可迭代对象(如<properties resource="db.properties"> </properties>List、Set<properties resource="db.properties"> </properties>等)、Map<properties resource="db.properties"> </properties>对象或者数组对象作为集合参数传递给<properties resource="db.properties"> </properties>foreach。当使用可迭代对象或者数组时,index<properties resource="db.properties"> </properties>是当前迭代的序号,item<properties resource="db.properties"> </properties>的值是本次迭代获取到的元素。当使用<properties resource="db.properties"> </properties>Map<properties resource="db.properties"> </properties>对象(或者<properties resource="db.properties"> </properties>Map.Entry<properties resource="db.properties"> </properties>对象的集合)时,index<properties resource="db.properties"> </properties>是键,item<properties resource="db.properties"> </properties>是值。
    1. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>select<properties resource="db.properties"> </properties>*<properties resource="db.properties"> </properties>from<properties resource="db.properties"> </properties>blog<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>#{name}<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>
    复制代码
    测试:
    1. @Testpublic<properties resource="db.properties"> </properties>void<properties resource="db.properties"> </properties>test()<properties resource="db.properties"> </properties>{<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>SqlSession<properties resource="db.properties"> </properties>sqlSession<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>MybatisUtils.getSqlSession();<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>BlogMapper<properties resource="db.properties"> </properties>blogMapper<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>sqlSession.getMapper(BlogMapper.class);<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>ArrayList<properties resource="db.properties"> </properties>names<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>new<properties resource="db.properties"> </properties>ArrayList();<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>names.add("张三");<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>names.add("李四");<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>Map<properties resource="db.properties"> </properties>map=new<properties resource="db.properties"> </properties>HashMap();<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>map.put("names",names);<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>List<properties resource="db.properties"> </properties>blogs<properties resource="db.properties"> </properties>=<properties resource="db.properties"> </properties>blogMapper.queryBlog(map);<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>for<properties resource="db.properties"> </properties>(Blog<properties resource="db.properties"> </properties>blog<properties resource="db.properties"> </properties>:<properties resource="db.properties"> </properties>blogs)<properties resource="db.properties"> </properties>{<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>System.out.println(blog);<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>}<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>sqlSession.close();}
    复制代码
11.3.6、小结

动态sql本质上就是拼接sql语句
建议:

  • 我们可以在mysql中去写写出我们需要的sql语句,然后再去拼接
11.3.5、sql片段

sql片段的作用就是可以将一部分sql代码抽取出来,然后可以对他进行一个复用。
  1. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>select<properties resource="db.properties"> </properties>*<properties resource="db.properties"> </properties>from<properties resource="db.properties"> </properties>blog<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>id=#{id}<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>and<properties resource="db.properties"> </properties>title<properties resource="db.properties"> </properties>=#{title}<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>and<properties resource="db.properties"> </properties>author<properties resource="db.properties"> </properties>=#{author}<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>
复制代码
注意事项:

  • 尽量不要使sql片段太过复杂
12.Mybatis缓存

12.1、简介


  • 什么是缓存

    • 存储在内存中的临时数据
    • 将经常查询的信息从内存中复制一份到缓存,当再次查找时就直接从缓存中查找,从而提高效率,解决高并发的性能问题

  • 使用缓存的好处

    • 减少数据库的交互次数,减小系统的开销,提高效率

  • 什么样的数据库可以使用缓存

    • 查询比较频繁并且不经常改动的数据库

12.2、Mybatis缓存

mybatis本身有两种缓存,分别为一级缓存和二级缓存

  • 一级缓存:

    • MyBatis默认开启了一级缓存,一级缓存是在<properties resource="db.properties"> </properties>SqlSession<properties resource="db.properties"> </properties>层面进行缓存的。即,同一个<properties resource="db.properties"> </properties>SqlSession<properties resource="db.properties"> </properties>,多次调用同一个<properties resource="db.properties"> </properties>Mapper<properties resource="db.properties"> </properties>和同一个方法的同一个参数,只会进行一次数据库查询,然后把数据缓存到缓冲中,以后直接先从缓存中取出数据,不会直接去查数据库。

  • 二级缓存:

    • 二级缓存需要手动开启,他是基于namespce级别的缓存
    • 为了提高拓展性,mybatis定义了缓存接口Cache,我们可以通过该接口自定义二级缓存

12.3、一级缓存


  • 一级缓存也叫本地缓存:SqlSession

    • 在同一个SqlSession之间查询到的数据会放到本地的缓存中
    • 之后如果想要获取数据自己从本地缓存中取

测试步骤:

  • 开启日志
    1. <properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>
    复制代码
  • 测试在同一个SqlSession期间查询相同的数据
  • 查看日志输出

缓存失效的情况:

  • 查询不一样的数据
  • 增删改操作,由于可能会改变原来的数据,所有缓存也会失效

  • 查询不同的Mapper.xml
  • 手动清除缓存
    1. <select id="queryBlog" resultType="blog">
    2.     select * from blog
    3.     <where>
    4.         <choose>
    5.             <when test="id != null">
    6.                 id=#{id}
    7.             </when>
    8.             <when test="title != null">
    9.                 and title =#{title}
    10.             </when>
    11.             <when test="author!='李四'">
    12.                 and author =#{author}
    13.             </when>
    14.             <otherwise>
    15.                 and views>#{views}
    16.             </otherwise>
    17.         </choose>
    18.     </where>
    19. </select>
    复制代码

  • 缓存会使用最近最少使用算法(LRU,<properties resource="db.properties"> </properties>Least<properties resource="db.properties"> </properties>Recently<properties resource="db.properties"> </properties>Used)算法来清除不需要的缓存。
  • 缓存不会定时进行刷新(也就是说,没有刷新间隔)
小结:一级缓存是默认开启的,也关闭不掉,只能手动清理或者设置,一级缓存其实就相当于一个Map
12.4、二级缓存


  • 二级缓存也叫全局缓存,它的出现是为了解决一级缓存的作用域太低
  • 它是基于namespace级别的缓存,一个命名空间,对应一个二级缓存
  • 机制:

    • 一个SqlSession查询一条数据,这个数据会被放到一级缓存中;
    • 当这个SqlSession断开的时候,一级缓存就会消失,为了能够继续保存,我们就产生了二级缓存
    • 当其他的SqlSession查询数据时,就可以先从二级缓存中查询
    • 不同的mapper.xml文件查出的数据会放到自己的缓存(map)之中

测试步骤:

  • 开启二级缓存设置;
    1. [/code]
    2. [*]在要使用二级缓存的mapper.xml配置文件中开启缓存:
    3. [code]
    复制代码
  • 测试
小结:

  • 在使用二级缓存的时候可能会报错:
    1. Error<properties resource="db.properties"> </properties>serializing<properties resource="db.properties"> </properties>object.<properties resource="db.properties"> </properties><properties resource="db.properties"> </properties>Cause:<properties resource="db.properties"> </properties>java.io.NotSerializableException
    复制代码
    解决:原因是没有将实体类序列化,所以直接将类序列化即可
  • 在mapper.xml文件中,对于查找标签都可以手动设置是否开启缓存
    1. <properties resource="db.properties"> </properties>useCache="true"
    复制代码
  • 缓存清除的策略:

    • LRU<properties resource="db.properties"> </properties>–<properties resource="db.properties"> </properties>最近最少使用:移除最长时间不被使用的对象。
    • FIFO<properties resource="db.properties"> </properties>–<properties resource="db.properties"> </properties>先进先出:按对象进入缓存的顺序来移除它们。
    • SOFT<properties resource="db.properties"> </properties>–<properties resource="db.properties"> </properties>软引用:基于垃圾回收器状态和软引用规则移除对象。
    • WEAK<properties resource="db.properties"> </properties>–<properties resource="db.properties"> </properties>弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。

  • 所有的数据都会先存到一级缓存,只有当会话提交或者关闭才会提交到二级缓存
12.5、缓存原理


12.6、自定义缓存(了解)

注:一般可以采用redis来做缓存!!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

慢吞云雾缓吐愁

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表