Java Mybatis 笔记

打印 上一主题 下一主题

主题 990|帖子 990|积分 2970

[url=https://so.csdn.net/so/search?q=MyBatis&spm=<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
100<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
1.2<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
10<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
1.300<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
1.7020]MyBatis[/url]


<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
1、简介


<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
1.<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
1 什么是Mybatis


[img]https://img-blog.csdnimg.cn/20200623<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
16463790.png[/img]

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


数据持久化

  • 持久化就是将程序的数据在持久状态和瞬时状态转化的过程
  • 内存:断电即失
  • 数据库(Jdbc),io文件持久化。
为什么要持久化?

  • 有一些对象,不能让他丢掉
  • 内存太贵
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
1.3 持久层


Dao层、Service层、Controller层

  • 完成持久化工作的代码块
  • 层界限十分明显
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
1.4 为什么需要MyBatis



  • 帮助程序员将数据存入到数据库中
  • 方便
  • 传统的JDBC代码太复杂了,简化,框架,自动化
  • 不用MyBatis也可以,技术没有高低之分
  • 优点:

    • 简单易学
    • 灵活
    • sql和代码的分离,提高了可维护性。
    • 提供映射标签,支持对象与数据库的orm字段关系映射
    • 提供对象关系映射标签,支持对象关系组建维护
    • 提供xml标签,支持编写动态sql

2、第一个Mybatis程序

思路:搭建环境 --> 导入MyBatis --> 编写代码 --> 测试
2.<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
1 搭建环境


新建项目
[list=<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
1]
  • 创建一个普通的maven项目
  • 删除src目录 (就可以把此工程当做父工程了,然后创建子工程)
  • 导入maven依赖
    1. <dependencies>
    2.    
    3.     <dependency>
    4.         <groupId>mysql</groupId>
    5.         <artifactId>mysql-connector-java</artifactId>
    6.         <version>8.0.<setting name="cacheEnabled" value="true"/>
    7. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    8. 12</version>
    9.     </dependency>
    10.    
    11.     <dependency>
    12.         <groupId>org.mybatis</groupId>
    13.         <artifactId>mybatis</artifactId>
    14.         <version>3.5.4</version>
    15.     </dependency>
    16.    
    17.     <dependency>
    18.         <groupId>junit</groupId>
    19.         <artifactId>junit</artifactId>
    20.         <version>4.<setting name="cacheEnabled" value="true"/>
    21. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    22. 12</version>
    23.         <scope>test</scope>
    24.     </dependency>
    25. </dependencies>
    26. <setting name="cacheEnabled" value="true"/>
    27. <cache
    28.        eviction="FIFO"
    29.        flushInterval="60000"
    30.        size="5<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    31. 12"
    32.        readOnly="true"/>
    33. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    34. 123456789<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    35. 10<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    36. 1<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    37. 1<setting name="cacheEnabled" value="true"/>
    38. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    39. 12<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    40. 13<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    41. 14<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    42. 15<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    43. 16<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    44. 17<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    45. 18<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    46. 19202<setting name="cacheEnabled" value="true"/>
    47. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    48. 122
    复制代码
  • 创建一个Module
    2.2 创建一个模块


    • 编写mybatis的核心配置文件
      1. <?xml version="<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      2. 1.0" encoding="UTF-8" ?>
      3. <!DOCTYPE configuration
      4.         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
      5.         "http://mybatis.org/dtd/mybatis-3-config.dtd">
      6. <configuration>
      7.     <environments default="development">
      8.         <environment id="development">
      9.             <transactionManager type="JDBC"/>
      10.             <dataSource type="POOLED">
      11.                 <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
      12.                 <property name="url" value="jdbc:mysql://localhost:3306/mybatis?userSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"/>
      13.                 <property name="username" value="root"/>
      14.                 <property name="password" value="root"/>
      15.             </dataSource>
      16.         </environment>
      17.     </environments>
      18. </configuration>
      19. <setting name="cacheEnabled" value="true"/>
      20. <cache
      21.        eviction="FIFO"
      22.        flushInterval="60000"
      23.        size="5<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      24. 12"
      25.        readOnly="true"/>
      26. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      27. 123456789<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      28. 10<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      29. 1<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      30. 1<setting name="cacheEnabled" value="true"/>
      31. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      32. 12<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      33. 13<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      34. 14<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      35. 15<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      36. 16<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      37. 17<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      38. 18
      复制代码
    • 编写mybatis工具类
      1. //sqlSessionFactory --> sqlSession
      2. public class MybatisUtils {
      3.     static SqlSessionFactory sqlSessionFactory = null;
      4.     static {
      5.         try {
      6.             //使用Mybatis第一步 :获取sqlSessionFactory对象
      7.             String resource = "mybatis-config.xml";
      8.             InputStream inputStream = Resources.getResourceAsStream(resource);
      9.             sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
      10.         } catch (IOException e) {
      11.             e.printStackTrace();
      12.         }
      13.     }
      14.     //既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例.
      15.     // SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。
      16.     public static SqlSession getSqlSession(){
      17.         return sqlSessionFactory.openSession();
      18.     }
      19. }
      20. <setting name="cacheEnabled" value="true"/>
      21. <cache
      22.        eviction="FIFO"
      23.        flushInterval="60000"
      24.        size="5<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      25. 12"
      26.        readOnly="true"/>
      27. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      28. 123456789<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      29. 10<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      30. 1<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      31. 1<setting name="cacheEnabled" value="true"/>
      32. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      33. 12<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      34. 13<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      35. 14<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      36. 15<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      37. 16<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      38. 17<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      39. 18<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      40. 19202<setting name="cacheEnabled" value="true"/>
      41. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      42. 122
      复制代码
    2.3 编写代码


    • 实体类
    • Dao接口
      1. public interface UserDao {
      2.     public List<User> getUserList();
      3. }
      4. <setting name="cacheEnabled" value="true"/>
      5. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      6. 123
      复制代码
    • 接口实现类 (由原来的UserDaoImpl转变为一个Mapper配置文件)
      1. <?xml version="<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      2. 1.0" encoding="UTF-8" ?>
      3. <!DOCTYPE mapper
      4.         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
      5.         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
      6. <mapper namespace="com.kuang.dao.UserDao">
      7.     <select id="getUserList" resultType="com.kuang.pojo.User">
      8.     select * from USER
      9.   </select>
      10. </mapper>
      11. <setting name="cacheEnabled" value="true"/>
      12. <cache
      13.        eviction="FIFO"
      14.        flushInterval="60000"
      15.        size="5<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      16. 12"
      17.        readOnly="true"/>
      18. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      19. 123456789<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      20. 10<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      21. 1<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      22. 1
      复制代码
    • 测试
      注意点:
      org.apache.ibatis.binding.BindingException: Type interface com.kuang.dao.UserDao is not known to the MapperRegistry.
      MapperRegistry是什么?
      核心配置文件中注册mappers

      • junit测试
        1.     @Test
        2.     public void test(){
        3.         //<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
        4. 1.获取SqlSession对象
        5.         SqlSession sqlSession = MybatisUtils.getSqlSession();
        6.         //2.执行SQL
        7.         // 方式一:getMapper
        8.         UserDao userDao = sqlSession.getMapper(UserDao.class);
        9.         List<User> userList = userDao.getUserList();
        10.         for (User user : userList) {
        11.             System.out.println(user);
        12.         }
        13.         //关闭sqlSession
        14.         sqlSession.close();
        15.     }
        16. <setting name="cacheEnabled" value="true"/>
        17. <cache
        18.        eviction="FIFO"
        19.        flushInterval="60000"
        20.        size="5<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
        21. 12"
        22.        readOnly="true"/>
        23. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
        24. 123456789<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
        25. 10<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
        26. 1<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
        27. 1<setting name="cacheEnabled" value="true"/>
        28. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
        29. 12<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
        30. 13<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
        31. 14<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
        32. 15<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
        33. 16
        复制代码

    可能会遇到的问题:
    [list=<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1]
  • 配置文件没有注册
  • 绑定接口错误
  • 方法名不对
  • 返回类型不对
  • Maven导出资源问题
    3、CURD

    <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1. namespace


    namespace中的包名要和Dao/Mapper接口的包名一致
    2. select

    选择,查询语句;

    • id:就是对应的namespace中的方法名;
    • resultType : Sql语句执行的返回值;
    • parameterType : 参数类型;
      [list=<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      1]
    • 编写接口
      1. public interface UserMapper {
      2.     //查询所有用户
      3.     public List<User> getUserList();
      4.     //插入用户
      5.     public void addUser(User user);
      6. }
      7. <setting name="cacheEnabled" value="true"/>
      8. <cache
      9.        eviction="FIFO"
      10.        flushInterval="60000"
      11.        size="5<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      12. 12"
      13.        readOnly="true"/>
      14. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      15. 123456
      复制代码
    • 编写对应的mapper中的sql语句
      1. <insert id="addUser" parameterType="com.kuang.pojo.User">
      2.     insert into user (id,name,password) values (#{id}, #{name}, #{password})
      3. </insert>
      4. <setting name="cacheEnabled" value="true"/>
      5. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      6. 123
      复制代码
    • 测试
      1. @Test
      2. public void test2() {
      3.     SqlSession sqlSession = MybatisUtils.getSqlSession();
      4.     UserMapper mapper = sqlSession.getMapper(UserMapper.class);
      5.     User user  = new User(3,"黑子","666");
      6.     mapper.addUser(user);
      7.     //增删改一定要提交事务
      8.     sqlSession.commit();
      9.     //关闭sqlSession
      10.     sqlSession.close();
      11. }
      12. <setting name="cacheEnabled" value="true"/>
      13. <cache
      14.        eviction="FIFO"
      15.        flushInterval="60000"
      16.        size="5<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      17. 12"
      18.        readOnly="true"/>
      19. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      20. 123456789<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      21. 10<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      22. 1<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      23. 1<setting name="cacheEnabled" value="true"/>
      24. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      25. 12
      复制代码
      注意:增删改查一定要提交事务:
      1. sqlSession.commit();
      2. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      3. 1
      复制代码

    3. Insert

    4. update

    5. Delete

    6. 万能Map

    假设,我们的实体类,或者数据库中的表,字段或者参数过多,我们应该考虑使用Map!
    [list=<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1]
  • UserMapper接口
    1. //用万能Map插入用户
    2. public void addUser2(Map<String,Object> map);
    3. <setting name="cacheEnabled" value="true"/>
    4. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    5. 12
    复制代码
    [list=<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1]
  • UserMapper.xml
    1. <insert id="addUser2" parameterType="map">
    2.     insert into user (id,name,password) values (#{userid},#{username},#{userpassword})
    3. </insert>
    4. <setting name="cacheEnabled" value="true"/>
    5. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    6. 1234
    复制代码
    [list=<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1]
  • 测试
    1.     @Test
    2.     public void test3(){
    3.         SqlSession sqlSession = MybatisUtils.getSqlSession();
    4.         UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    5.         HashMap<String, Object> map = new HashMap<String, Object>();
    6.         map.put("userid",4);
    7.         map.put("username","王虎");
    8.         map.put("userpassword",789);
    9.         mapper.addUser2(map);
    10.         //提交事务
    11.         sqlSession.commit();
    12.         //关闭资源
    13.         sqlSession.close();
    14.     }
    15. <setting name="cacheEnabled" value="true"/>
    16. <cache
    17.        eviction="FIFO"
    18.        flushInterval="60000"
    19.        size="5<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    20. 12"
    21.        readOnly="true"/>
    22. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    23. 123456789<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    24. 10<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    25. 1<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    26. 1<setting name="cacheEnabled" value="true"/>
    27. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    28. 12<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    29. 13<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    30. 14
    复制代码
    Map传递参数,直接在sql中取出key即可! 【parameter=“map”】
    对象传递参数,直接在sql中取出对象的属性即可! 【parameter=“Object”】
    只有一个基本类型参数的情况下,可以直接在sql中取到
    多个参数用Map , 或者注解!
    7. 模糊查询

    模糊查询这么写?
    [list=<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1]
  • Java代码执行的时候,传递通配符% %
    1. List<User> userList = mapper.getUserLike("%李%");
    2. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    3. 1
    复制代码
  • 在sql拼接中使用通配符
    1. select * from user where name like "%"#{value}"%"
    2. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    3. 1
    复制代码
    4、配置解析

    <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1. 核心配置文件



    • mybatis-config.xml
    • Mybatis的配置文件包含了会深深影响MyBatis行为的设置和属性信息。
      1. configuration(配置)
      2.     properties(属性)
      3.     settings(设置)
      4.     typeAliases(类型别名)
      5.     typeHandlers(类型处理器)
      6.     objectFactory(对象工厂)
      7.     plugins(插件)
      8.     environments(环境配置)
      9.             environment(环境变量)
      10.                     transactionManager(事务管理器)
      11.                     dataSource(数据源)
      12.     databaseIdProvider(数据库厂商标识)
      13.     mappers(映射器)
      14. <setting name="cacheEnabled" value="true"/>
      15. <cache
      16.        eviction="FIFO"
      17.        flushInterval="60000"
      18.        size="5<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      19. 12"
      20.        readOnly="true"/>
      21. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      22. 123456789<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      23. 10<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      24. 1<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      25. 1<setting name="cacheEnabled" value="true"/>
      26. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      27. 12<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      28. 13
      复制代码
    2. 环境配置 environments

    MyBatis 可以配置成适应多种环境
    不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境
    学会使用配置多套运行环境!
    MyBatis默认的事务管理器就是JDBC ,连接池:POOLED
    3. 属性 properties

    我们可以通过properties属性来实现引用配置文件
    这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。【db.poperties】
    [list=<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1]
  • 编写一个配置文件
    db.properties
    1. driver=com.mysql.cj.jdbc.Driver
    2. url=jdbc:mysql://localhost:3306/mybatis?userSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    3. username=root
    4. password=root
    5. <setting name="cacheEnabled" value="true"/>
    6. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    7. 1234
    复制代码
  • 在核心配置文件中引入
    1. <properties resource="db.properties">
    2.     <property name="username" value="root"/>
    3.     <property name="password" value="root"/>
    4. </properties>
    5. <setting name="cacheEnabled" value="true"/>
    6. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    7. 12345
    复制代码

    • 可以直接引入外部文件
    • 可以在其中增加一些属性配置
    • 如果两个文件有同一个字段,优先使用外部配置文件的

    4. 类型别名 typeAliases


    • 类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置.
    • 意在降低冗余的全限定类名书写。
      1. <typeAliases>
      2.     <typeAlias type="com.kuang.pojo.User" alias="User"/>
      3. </typeAliases>
      4. <setting name="cacheEnabled" value="true"/>
      5. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      6. 1234
      复制代码
      也可以指定一个包,每一个在包 domain.blog 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 domain.blog.Author 的别名为 author,;若有注解,则别名为其注解值。见下面的例子:
      1. <typeAliases>
      2.     <package name="com.kuang.pojo"/>
      3. </typeAliases>
      4. <setting name="cacheEnabled" value="true"/>
      5. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      6. 123
      复制代码
      在实体类比较少的时候,使用第一种方式。
      如果实体类十分多,建议用第二种扫描包的方式。
      第一种可以DIY别名,第二种不行,如果非要改,需要在实体上增加注解。
      1. @Alias("author")
      2. public class Author {
      3.     ...
      4. }
      5. <setting name="cacheEnabled" value="true"/>
      6. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      7. 1234
      复制代码
    5. 设置 Settings

    这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。
    [img]https://img-blog.csdnimg.cn/20200623<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    16474822.png[/img]
    6. 其他配置

    7. 映射器 mappers

    MapperRegistry:注册绑定我们的Mapper文件;
    方式一:【推荐使用】
    1. <typeAliases>
    2.     <typeAlias type="com.kuang.pojo.User" alias="User"/>
    3. </typeAliases>
    4. <setting name="cacheEnabled" value="true"/>
    5. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    6. 1234
    复制代码
    方式二:使用class文件绑定注册
    1. <typeAliases>
    2.     <typeAlias type="com.kuang.pojo.User" alias="User"/>
    3. </typeAliases>
    4. <setting name="cacheEnabled" value="true"/>
    5. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    6. 1234
    复制代码
    注意点:

    • 接口和他的Mapper配置文件必须同名
    • 接口和他的Mapper配置文件必须在同一个包下
    方式三:使用包扫描进行注入
    1. <typeAliases>
    2.     <package name="com.kuang.pojo"/>
    3. </typeAliases>
    4. <setting name="cacheEnabled" value="true"/>
    5. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    6. 123
    复制代码
    8. 作用域和生命周期

    [img]https://img-blog.csdnimg.cn/20200623<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    164809990.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0RERERlbmdf,size_<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    16,color_FFFFFF,t_70[/img]
    声明周期和作用域是至关重要的,因为错误的使用会导致非常严重的并发问题
    SqlSessionFactoryBuilder:

    • 一旦创建了SqlSessionFactory,就不再需要它了
    • 局部变量
    SqlSessionFactory:

    • 说白了就可以想象为:数据库连接池
    • SqlSessionFactory一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建一个实例。
    • 因此SqlSessionFactory的最佳作用域是应用作用域(ApplocationContext)。
    • 最简单的就是使用单例模式或静态单例模式。
    SqlSession:

    • 连接到连接池的一个请求
    • SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。
    • 用完之后需要赶紧关闭,否则资源被占用!
    [img]https://img-blog.csdnimg.cn/20200623<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    164833872.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0RERERlbmdf,size_<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    16,color_FFFFFF,t_70[/img]
    5、解决属性名和字段名不一致的问题

    <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1. 问题


    数据库中的字段
    [img]https://img-blog.csdnimg.cn/20200623<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    164845962.png[/img]
    新建一个项目,拷贝之前的,测试实体类字段不一致的情况
    [img]https://img-blog.csdnimg.cn/20200623<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    164853569.png[/img]
    测试出现问题
    [img]https://img-blog.csdnimg.cn/20200623<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    16490<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    186<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1.png[/img]
    1. // select * from user where id = #{id}
    2. // 类型处理器
    3. // select id,name,pwd from user where id = #{id}
    4. <setting name="cacheEnabled" value="true"/>
    5. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    6. 123
    复制代码
    解决方法:

    • 起别名
    1. <select id="getUserById" resultType="com.kuang.pojo.User">
    2.     select id,name,pwd as password from USER where id = #{id}
    3. </select>
    4. <setting name="cacheEnabled" value="true"/>
    5. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    6. 123
    复制代码
    2. resultMap

    结果集映射
    id name pwd
    id name password
    1. <resultMap id="UserMap" type="User">
    2.    
    3.     <result column="id" property="id"></result>
    4.     <result column="name" property="name"></result>
    5.     <result column="pwd" property="password"></result>
    6. </resultMap>
    7. <select id="getUserList" resultMap="UserMap">
    8.     select * from USER
    9. </select>
    10. <setting name="cacheEnabled" value="true"/>
    11. <cache
    12.        eviction="FIFO"
    13.        flushInterval="60000"
    14.        size="5<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    15. 12"
    16.        readOnly="true"/>
    17. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    18. 123456789<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    19. 10<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    20. 1<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    21. 1
    复制代码

    • resultMap 元素是 MyBatis 中最重要最强大的元素。
    • ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。
    • ResultMap 的优秀之处——你完全可以不用显式地配置它们。
    • 如果这个世界总是这么简单就好了。
    6、日志

    6.<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1 日志工厂


    如果一个数据库操作,出现了异常,我们需要排错,日志就是最好的助手!
    曾经:sout、debug
    现在:日志工厂
    [img]https://img-blog.csdnimg.cn/20200623<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    164920502.png[/img]

    • SLF4J
    • LOG4J 【掌握】
    • LOG4J2
    • JDK_LOGGING
    • COMMONS_LOGGING
    • STDOUT_LOGGING 【掌握】
    • NO_LOGGING
    在MyBatis中具体使用哪一个日志实现,在设置中设定
    STDOUT_LOGGING
    1. <typeAliases>
    2.     <package name="com.kuang.pojo"/>
    3. </typeAliases>
    4. <setting name="cacheEnabled" value="true"/>
    5. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    6. 123
    复制代码
    [img]https://img-blog.csdnimg.cn/20200623<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1649339<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0RERERlbmdf,size_<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    16,color_FFFFFF,t_70[/img]
    6.2 Log4j

    什么是Log4j?

    • Log4j是[url=https://baike.baidu.com/item/Apache/85<setting name="cacheEnabled" value="true"/>
      <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      12995]Apache[/url]的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件;
    • 我们也可以控制每一条日志的输出格式;
    • 通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程;
    • 最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
    [list=<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1]
  • 先导入log4j的包
    1. <dependency>
    2.     <groupId>log4j</groupId>
    3.     <artifactId>log4j</artifactId>
    4.     <version><cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    5. 1.2.<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    6. 17</version>
    7. </dependency>
    8. <setting name="cacheEnabled" value="true"/>
    9. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    10. 12345
    复制代码
  • log4j.properties
    1. #将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
    2. log4j.rootLogger=DEBUG,console,file
    3. #控制台输出的相关设置
    4. log4j.appender.console = org.apache.log4j.ConsoleAppender
    5. log4j.appender.console.Target = System.out
    6. log4j.appender.console.Threshold=DEBUG
    7. log4j.appender.console.layout = org.apache.log4j.PatternLayout
    8. log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
    9. #文件输出的相关设置
    10. log4j.appender.file = org.apache.log4j.RollingFileAppender
    11. log4j.appender.file.File=./log/rzp.log
    12. log4j.appender.file.MaxFileSize=<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    13. 10mb
    14. log4j.appender.file.Threshold=DEBUG
    15. log4j.appender.file.layout=org.apache.log4j.PatternLayout
    16. log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
    17. #日志输出级别
    18. log4j.logger.org.mybatis=DEBUG
    19. log4j.logger.java.sql=DEBUG
    20. log4j.logger.java.sql.Statement=DEBUG
    21. log4j.logger.java.sql.ResultSet=DEBUG
    22. log4j.logger.java.sq<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    23. 1.PreparedStatement=DEBUG
    24. <setting name="cacheEnabled" value="true"/>
    25. <cache
    26.        eviction="FIFO"
    27.        flushInterval="60000"
    28.        size="5<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    29. 12"
    30.        readOnly="true"/>
    31. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    32. 123456789<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    33. 10<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    34. 1<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    35. 1<setting name="cacheEnabled" value="true"/>
    36. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    37. 12<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    38. 13<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    39. 14<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    40. 15<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    41. 16<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    42. 17<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    43. 18<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    44. 19202<setting name="cacheEnabled" value="true"/>
    45. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    46. 122
    复制代码
  • 配置settings为log4j实现
  • 测试运行
    Log4j简单使用
    [list=<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1]
  • 在要使用Log4j的类中,导入包 import org.apache.log4j.Logger;
  • 日志对象,参数为当前类的class对象
    1. Logger logger = Logger.getLogger(UserDaoTest.class);
    2. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    3. 1
    复制代码
  • 日志级别
    1. logger.info("info: 测试log4j");
    2. logger.debug("debug: 测试log4j");
    3. logger.error("error:测试log4j");
    4. <setting name="cacheEnabled" value="true"/>
    5. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    6. 123
    复制代码
    [list=<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1]
  • info
  • debug
  • error

    7、分页

    思考:为什么分页?

    • 减少数据的处理量
    7.<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1 使用Limit分页

    1. SELECT * from user limit startIndex,pageSize
    2. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    3. 1
    复制代码
    使用MyBatis实现分页,核心SQL
    [list=<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1]
  • 接口
    1. //分页
    2. List<User> getUserByLimit(Map<String,Integer> map);
    3. <setting name="cacheEnabled" value="true"/>
    4. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    5. 12
    复制代码
  • Mapper.xml
    1. <select id="getUserByLimit" parameterType="map" resultMap="UserMap">
    2.     select * from user limit #{startIndex},#{pageSize}
    3. </select>
    4. <setting name="cacheEnabled" value="true"/>
    5. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    6. 1234
    复制代码
  • 测试
    1.     @Test
    2.     public void getUserByLimit(){
    3.         SqlSession sqlSession = MybatisUtils.getSqlSession();
    4.         UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    5.         HashMap<String, Integer> map = new HashMap<String, Integer>();
    6.         map.put("startIndex",<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    7. 1);
    8.         map.put("pageSize",2);
    9.         List<User> list = mapper.getUserByLimit(map);
    10.         for (User user : list) {
    11.             System.out.println(user);
    12.         }
    13.     }
    14. <setting name="cacheEnabled" value="true"/>
    15. <cache
    16.        eviction="FIFO"
    17.        flushInterval="60000"
    18.        size="5<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    19. 12"
    20.        readOnly="true"/>
    21. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    22. 123456789<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    23. 10<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    24. 1<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    25. 1<setting name="cacheEnabled" value="true"/>
    26. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    27. 12
    复制代码
    7.2 RowBounds分页

    不再使用SQL实现分页
    [list=<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1]
  • 接口
    1. //分页2
    2. List<User> getUserByRowBounds();
    3. <setting name="cacheEnabled" value="true"/>
    4. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    5. 12
    复制代码
  • mapper.xml
    1. <select id="getUserByLimit" parameterType="map" resultMap="UserMap">
    2.     select * from user limit #{startIndex},#{pageSize}
    3. </select>
    4. <setting name="cacheEnabled" value="true"/>
    5. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    6. 1234
    复制代码
  • 测试
    1.     public void getUserByRowBounds(){
    2.         SqlSession sqlSession = MybatisUtils.getSqlSession();
    3.         //RowBounds实现
    4.         RowBounds rowBounds = new RowBounds(<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    5. 1, 2);
    6.         //通过Java代码层面实现分页
    7.         List<User> userList = sqlSession.selectList("com.kaung.dao.UserMapper.getUserByRowBounds", null, rowBounds);
    8.         for (User user : userList) {
    9.             System.out.println(user);
    10.         }
    11.         sqlSession.close();
    12.     }
    13. <setting name="cacheEnabled" value="true"/>
    14. <cache
    15.        eviction="FIFO"
    16.        flushInterval="60000"
    17.        size="5<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    18. 12"
    19.        readOnly="true"/>
    20. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    21. 123456789<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    22. 10<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    23. 1<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    24. 1
    复制代码
    7.3 分页插件

    [img]https://img-blog.csdnimg.cn/20200623<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    164958936.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0RERERlbmdf,size_<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    16,color_FFFFFF,t_70[/img]
    8、使用注解开发

    8.<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1 面向接口开发


    三个面向区别

    • 面向对象是指,我们考虑问题时,以对象为单位,考虑它的属性和方法;
    • 面向过程是指,我们考虑问题时,以一个具体的流程(事务过程)为单位,考虑它的实现;
    • 接口设计与非接口设计是针对复用技术而言的,与面向对象(过程)不是一个问题,更多的体现就是对系统整体的架构;
    8.2 使用注解开发

    [list=<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1]
  • 注解在接口上实现
    1. @Select("select * from user")
    2. List<User> getUsers();
    3. <setting name="cacheEnabled" value="true"/>
    4. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    5. 12
    复制代码
  • 需要在核心配置文件中绑定接口
    1. <typeAliases>
    2.     <package name="com.kuang.pojo"/>
    3. </typeAliases>
    4. <setting name="cacheEnabled" value="true"/>
    5. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    6. 123
    复制代码
  • 测试
    本质:反射机制实现
    底层:动态代理
    [img]https://img-blog.csdnimg.cn/20200623<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1650<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    14965.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0RERERlbmdf,size_<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    16,color_FFFFFF,t_70[/img]
    MyBatis详细执行流程
    [img]https://img-blog.csdnimg.cn/20200623<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    165030775.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0RERERlbmdf,size_<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    16,color_FFFFFF,t_70#pic_center[/img]
    8.3 注解CURD
    1. //方法存在多个参数,所有的参数前面必须加上@Param("id")注解
    2. @Delete("delete from user where id = ${uid}")
    3. int deleteUser(@Param("uid") int id);
    4. <setting name="cacheEnabled" value="true"/>
    5. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    6. 123
    复制代码
    关于@Param( )注解

    • 基本类型的参数或者String类型,需要加上
    • 引用类型不需要加
    • 如果只有一个基本类型的话,可以忽略,但是建议大家都加上
    • 我们在SQL中引用的就是我们这里的@Param()中设定的属性名
    #{} 和 ${}
    9、Lombok

    Lombok项目是一个Java库,它会自动插入编辑器和构建工具中,Lombok提供了一组有用的注释,用来消除Java类中的大量样板代码。仅五个字符(@Data)就可以替换数百行代码从而产生干净,简洁且易于维护的Java类。
    使用步骤:
    [list=<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1]
  • 在IDEA中安装Lombok插件
  • 在项目中导入lombok的jar包
    1. <dependency>
    2.     <groupId>org.projectlombok</groupId>
    3.     <artifactId>lombok</artifactId>
    4.     <version><cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    5. 1.<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    6. 18.<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    7. 10</version>
    8.     <scope>provided</scope>
    9. </dependency>
    10. <setting name="cacheEnabled" value="true"/>
    11. <cache
    12.        eviction="FIFO"
    13.        flushInterval="60000"
    14.        size="5<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    15. 12"
    16.        readOnly="true"/>
    17. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    18. 123456
    复制代码
  • 在程序上加注解
    1. @Getter and @Setter
    2. @FieldNameConstants
    3. @ToString
    4. @EqualsAndHashCode
    5. @AllArgsConstructor, @RequiredArgsConstructor and @NoArgsConstructor
    6. @Log, @Log4j, @Log4j2, @Slf4j, @XSlf4j, @CommonsLog, @JBossLog, @Flogger, @CustomLog
    7. @Data
    8. @Builder
    9. @SuperBuilder
    10. @Singular
    11. @Delegate
    12. @Value
    13. @Accessors
    14. @Wither
    15. @With
    16. @SneakyThrows
    17. @val
    18. <setting name="cacheEnabled" value="true"/>
    19. <cache
    20.        eviction="FIFO"
    21.        flushInterval="60000"
    22.        size="5<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    23. 12"
    24.        readOnly="true"/>
    25. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    26. 123456789<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    27. 10<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    28. 1<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    29. 1<setting name="cacheEnabled" value="true"/>
    30. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    31. 12<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    32. 13<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    33. 14<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    34. 15<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    35. 16<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    36. 17
    复制代码
    说明:
    1. @Data
    2. @AllArgsConstructor
    3. @NoArgsConstructor
    4. public class User {
    5.     private int id;
    6.     private String name;
    7.     private String password;
    8. }
    9. <setting name="cacheEnabled" value="true"/>
    10. <cache
    11.        eviction="FIFO"
    12.        flushInterval="60000"
    13.        size="5<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    14. 12"
    15.        readOnly="true"/>
    16. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    17. 12345678
    复制代码
    [img]https://img-blog.csdnimg.cn/20200623<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    165052<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    167.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0RERERlbmdf,size_<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    16,color_FFFFFF,t_70[/img]
    <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    10、多对一处理


    多个学生一个老师;
    1. alter table student ADD CONSTRAINT fk_tid foreign key (tid) references teacher(id)
    2. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    3. 1
    复制代码
    <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1. 测试环境搭建


    [list=<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1]
  • 导入lombok
  • 新建实体类Teacher,Student
  • 建立Mapper接口
  • 建立Mapper.xml文件
  • 在核心配置文件中绑定注册我们的Mapper接口或者文件 【方式很多,随心选】
  • 测试查询是否能够成功
    2. 按照查询嵌套处理
    1. <select id="getStudent" resultMap="StudentTeacher">
    2.     select * from student
    3. </select>
    4. <resultMap id="StudentTeacher" type="student">
    5.     <result property="id" column="id"/>
    6.     <result property="name" column="name"/>
    7.    
    8.     <collection property="teacher" column="tid" javaType="teacher" select="getTeacher"/>
    9. </resultMap>
    10. <select id="getTeacher" resultType="teacher">
    11.     select * from teacher where id = #{id}
    12. </select>
    13. <setting name="cacheEnabled" value="true"/>
    14. <cache
    15.        eviction="FIFO"
    16.        flushInterval="60000"
    17.        size="5<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    18. 12"
    19.        readOnly="true"/>
    20. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    21. 123456789<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    22. 10<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    23. 1<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    24. 1<setting name="cacheEnabled" value="true"/>
    25. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    26. 12<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    27. 13<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    28. 14<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    29. 15<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    30. 16<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    31. 17
    复制代码
    3.按照结果嵌套处理
    1.                 select s.id sid , s.name sname, t.name tname        from student s,teacher t        where s.tid=t.id                                                    <properties resource="db.properties">
    2.     <property name="username" value="root"/>
    3.     <property name="password" value="root"/>
    4. </properties>
    5. <setting name="cacheEnabled" value="true"/>
    6. <cache
    7.        eviction="FIFO"
    8.        flushInterval="60000"
    9.        size="5<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    10. 12"
    11.        readOnly="true"/>
    12. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    13. 123456789<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    14. 10<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    15. 1<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    16. 1<setting name="cacheEnabled" value="true"/>
    17. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    18. 12<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    19. 13<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    20. 14
    复制代码
    回顾Mysql多对一查询方式:

    • 子查询 (按照查询嵌套)
    • 联表查询 (按照结果嵌套)
    <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1、一对多处理


    一个老师多个学生;
    对于老师而言,就是一对多的关系;
    <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1. 环境搭建


    实体类
    1. @Data
    2. public class Student {
    3.     private int id;
    4.     private String name;
    5.     private int tid;
    6. }
    7. <setting name="cacheEnabled" value="true"/>
    8. <cache
    9.        eviction="FIFO"
    10.        flushInterval="60000"
    11.        size="5<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    12. 12"
    13.        readOnly="true"/>
    14. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    15. 123456
    16. @Data
    17. public class Teacher {
    18.     private int id;
    19.     private String name;
    20.     //一个老师拥有多个学生
    21.     private List<Student> students;
    22. }
    23. <setting name="cacheEnabled" value="true"/>
    24. <cache
    25.        eviction="FIFO"
    26.        flushInterval="60000"
    27.        size="5<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    28. 12"
    29.        readOnly="true"/>
    30. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    31. 12345678
    复制代码
    2. 按照结果嵌套嵌套处理
    1.     SELECT s.id sid, s.name sname,t.name tname,t.id tid FROM student s, teacher t    WHERE s.tid = t.id AND tid = #{tid}                                    <properties resource="db.properties">
    2.     <property name="username" value="root"/>
    3.     <property name="password" value="root"/>
    4. </properties>
    5. <setting name="cacheEnabled" value="true"/>
    6. <cache
    7.        eviction="FIFO"
    8.        flushInterval="60000"
    9.        size="5<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    10. 12"
    11.        readOnly="true"/>
    12. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    13. 123456789<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    14. 10<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    15. 1<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    16. 1<setting name="cacheEnabled" value="true"/>
    17. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    18. 12<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    19. 13<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    20. 14<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    21. 15<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    22. 16<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    23. 17<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    24. 18
    复制代码
    小结

    [list=<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1]
  • 关联 - association 【多对一】
  • 集合 - collection 【一对多】
  • javaType & ofType[list=<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1]
  • JavaType用来指定实体类中的类型
  • ofType用来指定映射到List或者集合中的pojo类型,泛型中的约束类型

    注意点:

    • 保证SQL的可读性,尽量保证通俗易懂
    • 注意一对多和多对一,属性名和字段的问题
    • 如果问题不好排查错误,可以使用日志,建议使用Log4j
    面试高频

    • Mysql引擎
    • InnoDB底层原理
    • 索引
    • 索引优化
    <setting name="cacheEnabled" value="true"/>
    <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    12、动态SQL


    什么是动态SQL:动态SQL就是根据不同的条件生成不同的SQL语句
    所谓的动态SQL,本质上还是SQL语句,只是我们可以在SQL层面,去执行一个逻辑代码
    动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。
    搭建环境
    1. CREATE TABLE `mybatis`.`blog`  (
    2.   `id` int(<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    3. 10) NOT NULL AUTO_INCREMENT COMMENT '博客id',
    4.   `title` varchar(30) NOT NULL COMMENT '博客标题',
    5.   `author` varchar(30) NOT NULL COMMENT '博客作者',
    6.   `create_time` datetime(0) NOT NULL COMMENT '创建时间',
    7.   `views` int(30) NOT NULL COMMENT '浏览量',
    8.   PRIMARY KEY (`id`)
    9. )
    10. <setting name="cacheEnabled" value="true"/>
    11. <cache
    12.        eviction="FIFO"
    13.        flushInterval="60000"
    14.        size="5<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    15. 12"
    16.        readOnly="true"/>
    17. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    18. 12345678
    复制代码
    创建一个基础工程
    [list=<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1]
  • 导包
  • 编写配置文件
  • 编写实体类
    1. @Data
    2. public class Blog {
    3.     private int id;
    4.     private String title;
    5.     private String author;
    6.     private Date createTime;// 属性名和字段名不一致
    7.     private int views;
    8. }
    9. <setting name="cacheEnabled" value="true"/>
    10. <cache
    11.        eviction="FIFO"
    12.        flushInterval="60000"
    13.        size="5<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    14. 12"
    15.        readOnly="true"/>
    16. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    17. 123456789
    复制代码
  • 编写实体类对应Mapper接口和Mapper.xml文件
    IF
    1.     select * from blog                        and title = #{title}                            and author = #{author}    <properties resource="db.properties">
    2.     <property name="username" value="root"/>
    3.     <property name="password" value="root"/>
    4. </properties>
    5. <setting name="cacheEnabled" value="true"/>
    6. <cache
    7.        eviction="FIFO"
    8.        flushInterval="60000"
    9.        size="5<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    10. 12"
    11.        readOnly="true"/>
    12. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    13. 123456789<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    14. 10<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    15. 1<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    16. 1
    复制代码
    choose (when, otherwise)

    trim、where、set

    SQL片段

    有的时候,我们可能会将一些功能的部分抽取出来,方便服用!
    [list=<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1]
  • 使用SQL标签抽取公共部分可
    1.             title = #{title}                and author = #{author}<typeAliases>
    2.     <typeAlias type="com.kuang.pojo.User" alias="User"/>
    3. </typeAliases>
    4. <setting name="cacheEnabled" value="true"/>
    5. <cache
    6.        eviction="FIFO"
    7.        flushInterval="60000"
    8.        size="5<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    9. 12"
    10.        readOnly="true"/>
    11. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    12. 12345678
    复制代码
  • 在需要使用的地方使用Include标签引用即可
    1.     select * from blog        <properties resource="db.properties">
    2.     <property name="username" value="root"/>
    3.     <property name="password" value="root"/>
    4. </properties>
    5. <setting name="cacheEnabled" value="true"/>
    6. <cache
    7.        eviction="FIFO"
    8.        flushInterval="60000"
    9.        size="5<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    10. 12"
    11.        readOnly="true"/>
    12. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    13. 123456
    复制代码
    注意事项:

    • 最好基于单标来定义SQL片段
    • 不要存在where标签
    动态SQL就是在拼接SQL语句,我们只要保证SQL的正确性,按照SQL的格式,去排列组合就可以了
    建议:

    • 先在Mysql中写出完整的SQL,再对应的去修改成我们的动态SQL实现通用即可
    <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    13、缓存


    <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    13.<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1 简介


    查询 : 连接数据库,耗资源
    一次查询的结果,给他暂存一个可以直接取到的地方 --> 内存:缓存
    我们再次查询的相同数据的时候,直接走缓存,不走数据库了
    [list=<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1]
  • 什么是缓存[Cache]?

    • 存在内存中的临时数据
    • 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题

  • 为什么使用缓存?

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

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

    • 经常查询并且不经常改变的数据 【可以使用缓存】

    <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    13.2 MyBatis缓存



    • MyBatis包含一个非常强大的查询缓存特性,它可以非常方便的定制和配置缓存,缓存可以极大的提高查询效率。
    • MyBatis系统中默认定义了两级缓存:
      一级缓存

      二级缓存

      • 默认情况下,只有一级缓存开启(SqlSession级别的缓存,也称为本地缓存)
      • 二级缓存需要手动开启和配置,他是基于namespace级别的缓存。
      • 为了提高可扩展性,MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来定义二级缓存。

    <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    13.3 一级缓存



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

      • 与数据库同一次会话期间查询到的数据会放在本地缓存中
      • 以后如果需要获取相同的数据,直接从缓存中拿,没必要再去查询数据库

    测试步骤:
    [list=<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1]
  • 开启日志
  • 测试在一个Session中查询两次记录
    1.     @Test
    2.     public void test<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    3. 1() {
    4.         SqlSession sqlSession = MybatisUtils.getSqlSession();
    5.         UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    6.         User user = mapper.getUserById(<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    7. 1);
    8.         System.out.println(user);
    9.         System.out.println("=====================================");
    10.         User user2 =  mapper.getUserById(<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    11. 1);
    12.         System.out.println(user2 == user);
    13.     }
    14. <setting name="cacheEnabled" value="true"/>
    15. <cache
    16.        eviction="FIFO"
    17.        flushInterval="60000"
    18.        size="5<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    19. 12"
    20.        readOnly="true"/>
    21. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    22. 123456789<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    23. 10<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    24. 1<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    25. 1<setting name="cacheEnabled" value="true"/>
    26. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    27. 12
    复制代码
  • 查看日志输出
    [img]https://img-blog.csdnimg.cn/20200623<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    165<setting name="cacheEnabled" value="true"/>
    <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    129955.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0RERERlbmdf,size_<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    16,color_FFFFFF,t_70[/img]
    缓存失效的情况:
    [list=<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1]
  • 查询不同的东西
  • 增删改操作,可能会改变原来的数据,所以必定会刷新缓存
  • 查询不同的Mapper.xml
  • 手动清理缓存
    1. sqlSession.clearCache();
    2. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    3. 1
    复制代码
    <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    13.4 二级缓存



    • 二级缓存也叫全局缓存,一级缓存作用域太低了,所以诞生了二级缓存
    • 基于namespace级别的缓存,一个名称空间,对应一个二级缓存
    • 工作机制

      • 一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中
      • 如果会话关闭了,这个会员对应的一级缓存就没了;但是我们想要的是,会话关闭了,一级缓存中的数据被保存到二级缓存中
      • 新的会话查询信息,就可以从二级缓存中获取内容
      • 不同的mapper查询出的数据会放在自己对应的缓存(map)中

    一级缓存开启(SqlSession级别的缓存,也称为本地缓存)

    • 二级缓存需要手动开启和配置,他是基于namespace级别的缓存。
    • 为了提高可扩展性,MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来定义二级缓存。
    步骤:
    [list=<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1]
  • 开启全局缓存
    1. <setting name="cacheEnabled" value="true"/>
    2. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    3. 12
    复制代码
  • 在Mapper.xml中使用缓存
    1. <setting name="cacheEnabled" value="true"/>
    2. <cache
    3.        eviction="FIFO"
    4.        flushInterval="60000"
    5.        size="5<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    6. 12"
    7.        readOnly="true"/>
    8. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    9. 123456
    复制代码
  • 测试
    [list=<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1]
  • 问题:我们需要将实体类序列化,否则就会报错

    小结:

    • 只要开启了二级缓存,在同一个Mapper下就有效
    • 所有的数据都会放在一级缓存中
    • 只有当前会话提交,或者关闭的时候,才会提交到二级缓存中
    <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    13.5 缓存原理


    [img]https://img-blog.csdnimg.cn/20200623<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    165404<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    13.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0RERERlbmdf,size_<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    16,color_FFFFFF,t_70#pic_center[/img]
    注意:

    • 只有查询才有缓存,根据数据是否需要缓存(修改是否频繁选择是否开启)useCache=“true”
      1.             select * from user where id = #{id}<typeAliases>
      2.     <package name="com.kuang.pojo"/>
      3. </typeAliases>
      4. <setting name="cacheEnabled" value="true"/>
      5. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
      6. 123
      复制代码
    <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    13.6 自定义缓存-ehcache


    Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存
    [list=<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    1]
  • 导包
    1.     org.mybatis.caches    mybatis-ehcache    <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    2. 1.2.<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    3. 1<setting name="cacheEnabled" value="true"/>
    4. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    5. 12345
    复制代码
  • 在mapper中指定使用我们的ehcache缓存实现
    1. <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    2. 1
    复制代码

    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
  • 本帖子中包含更多资源

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

    x
    回复

    使用道具 举报

    0 个回复

    倒序浏览

    快速回复

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

    本版积分规则

    我爱普洱茶

    金牌会员
    这个人很懒什么都没写!
    快速回复 返回顶部 返回列表