mybatis总结

淩亂°似流年 2022-04-18 00:41 273阅读 0赞

目录:

  1. 基础

    1. MyBatis ORM 概览
    2. MyBatis 简介
    3. MyBatis 架构( Java API)

      1. SqlSessionFactoryBuilder
      2. SqlSessionFactory:SqlSessionFactory 本 身 是 由 SqlSessionFactoryBuilder 创建的,它可以从 XML 配置,注解或手动配置 Java 来创建 SqlSessionFactory。
      3. SqlSession:SqlSessions 是由 SqlSessionFactory 实例创建的。SqlSessionFactory 对 象 包 含 创 建 SqlSession 实 例 的 所 有 方 法 。
        SqlSession代表和数据库的一次回话,用完必须关闭;
        SqlSession和connection一样都是非线程安全。每次使用都应该去获取新的对象。

        1. String **resource** = "org/mybatis/builder/mybatis-config.xml";
        2. InputStream **inputStream** = Resources.getResourceAsStream(resource);
        3. SqlSessionFactoryBuilder **builder** = new SqlSessionFactoryBuilder();
        4. SqlSessionFactory **factory** = builder.build(inputStream);
        5. SqlSession session = factory.openSession();
    4. MyBatis 环境
    5. MyBatis 配置
    6. MyBatis 会话SqlSession
    7. MyBatis 持久化类
    8. MyBatis 映射文件
    9. MyBatis 例子
    10. MyBatis 查询

      1. 模糊查询
      2. 多条件查询
      3. 分页
      4. 查询总数
      5. PageHelper :是一款犀利的Mybatis分页插件
  2. 关系

    1. MyBatis 一对多,使用 collection
    2. MyBatis 多对一,使用 association
    3. MyBatis 多对多,使用 中间表
    4. MyBatis 延迟加载
  3. MyBatis 动态SQL+ SQL 拼接
  4. 相关概念

    1. MyBatis 日志
    2. MyBatis 事务
    3. MyBatis 缓存

      1. 一级缓存
      2. 二级缓存
    4. MyBatis C3P0连接池
    5. MyBatis 逆向工程
  5. 注解

知识点:

  1. mybatis使用流程

    1. 导包
    2. 配置全局配置文件 mybatis-conf.xml
    3. 配置映射文件 mapper.xml
  2. 原生编程和接口式编程(目前普遍使用接口式编程)
  3. 基础(使用配置文件和使用注解实现两种方式)

    1. 实例:实现增删改查
    2. 全局配置文件详解 mybatis-conf.xml
    3. 映射文件详解 mapper.xml
    4. 关系:
      一对多,使用 collection
      多对一,使用 association
      多对多
  4. 动态sql

    1. if
    2. where
    3. choose
    4. foreach
    5. bind
  5. 日志文件的使用log4j配置详解
    使用步骤:

    1. log4j的jar包导入到当前项目
    2. 在全局配置文件中开启日志

      1. <settings>
      2. <setting name="logImpl" value="STDOUT_LOGGING"/>
      3. <setting name="cacheEnabled" value="true"></setting>//开启缓存
      4. ......
      5. </settings>
    3. 配置日志文件log4j.properties,放在src 目录下
  6. 事务管理(支持数据库的事务管理)

    1. SqlSession session = sqlSessionFactory.openSession();
    2. ......
    3. session.commit();
    4. session.close();
  7. 延迟加载:在全局配置中配置

    1. <configuration>
    2. <settings>
    3. <!-- 打开延迟加载的开关 -->
    4. <setting name="lazyLoadingEnabled" value="true" />
    5. <!-- 将积极加载改为消息加载即按需加载 -->
    6. <setting name="aggressiveLazyLoading" value="false"/>
    7. </settings>
    8. ......
    9. </configuration>
  8. 分页

    1. 第一步:在映射文件mapper.xml中的select属性中添加limint(支持mysql)

      1. <mapper>
      2. ......
      3. <select id="listCategory" resultType="Category">
      4. select * from category_
      5. <if test="start!=null and count!=null">
      6. limit #{start},#{count}
      7. </if>
      8. </select>
      9. </mapper>
    2. 为类映射接口XxxMapper.java中对应的查询方法添加参数

      1. public interface CategoryMapper {
      2. public List<Category> list();
      3. public List<Category> listByPage(@Param("start") int start, @Param("count")int count);
      4. }
    3. 测试

      1. private static void xmlWay(SqlSession session) {
      2. Map<String,Object> params = new HashMap<>();
      3. params.put("start", 0);
      4. params.put("count", 5);
      5. List<Category> cs =session.selectList("listCategory", params);
      6. for (Category c : cs) {
      7. System.out.println(c);
      8. }
      9. }
  9. PageHelper分页插件
    使用步骤:

    1. 第一步:导包,因为是第三方插件,所以需要额外的jar包
    2. 在全局配置文件 mybatis-config.xml 中配制插件

      1. <configuration>
      2. ......
      3. <plugins>
      4. <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
      5. </plugins>
      6. </configuration>
    3. 测试:在查询操作中

      1. 分页查询:查询很有意思,只需要在执行查询所有的调用之前,执行一条语句即可:PageHelper.offsetPage(0, 5);这就表示查出第一页的数据,每页5条
      2. 获取总数:PageInfo page= new PageInfo<>(cs);
  10. 一级缓存、二级缓存(redis、encache):首先二级缓存中查询,接着在一级缓存,最后在数据库中查询
    注意:使用缓存需要使pojo类实现序列化,序列化:对象将自身转化为一系列字节,记录字节的状态数据,以便再次使用。二级缓存就是将数据储存在本地,以字节的形式。

    1. Mybatis的一级缓存在session上
    2. Mybatis二级缓存是SessionFactory,如果两次查询基于同一个SessionFactory,那么就从二级缓存中取数据,而不用到数据库里去取了。
      使用步骤,以ehcache为例:

      1. 导入缓存包和两者整合的适配包
      2. 配置ehcache.properties配置文件,放在src 目录下
      3. 在全局配置文件中开启缓存
      4. 在映射文件mapper.xml 中使用自定义缓存
  11. c3p0连接池(更健壮、更稳定)
    使用步骤:

    1. 导入jar包
    2. 写个类继承UnpooledDataSourceFactory,然后指定dataSource 为ComboPooledDataSource。
      这个ComboPooledDataSource就是c3p0的数据源。

      1. public class C3P0DataSourceFactory extends UnpooledDataSourceFactory{
      2. public C3P0DataSourceFactory(){
      3. this.dataSource =new ComboPooledDataSource();
      4. }
      5. }
    3. 修改全局配置文件mybatis-conf.xml
      注释掉type=”POOLED”的数据源,换成type=”org.mybatis.c3p0.C3P0DataSourceFactory”的数据源,这样就使用c3p0了。

      1. <environments default="development">
      2. <environment id="test">
      3. <transactionManager type="JDBC" /><!--修改type即可使用c3p0-->
      4. <!-- 配置数据库连接信息 -->
      5. <dataSource type="POOLED">
      6. <property name="driver" value="${jdbc.driver}" />
      7. <property name="url" value="${jdbc.url}" />
      8. <property name="username" value="${jdbc.name}" />
      9. <property name="password" value="${jdbc.password}" />
      10. </dataSource>
      11. </environment>
      12. <environment id="development">
      13. <transactionManager type="JDBC" />
      14. <!-- 配置数据库连接信息 -->
      15. <dataSource type="POOLED">
      16. <property name="driver" value="${jdbc.driver}" />
      17. <property name="url" value="${jdbc.url}" />
      18. <property name="username" value="${jdbc.name}" />
      19. <property name="password" value="${jdbc.password}" />
      20. </dataSource>
      21. </environment>
      22. </environments>
    4. 测试
      作为数据库连接池,无法在小规模访问里看到其效果,需要高并发才能体现出其效果,这里的测试代码只能表示正常运行,无法体现其优越性。
  12. 查询总数
  13. 逆向工程

注解:

22.详解 @MapperScan 注解和 @Mapper 注解

@Mapper 这个注解的定义如下:

@Documented @Inherited @Retention(RUNTIME) @Target({ TYPE, METHOD, FIELD, PARAMETER }) public @interface Mapper { // Interface Mapper }

@Mapper 一般我们用在接口上,代码如下:

@Mapper public interface UserDAO { @Select(“select * from user where name = #{name}“) User find(String name); @Select(“select * from user where name = #{name} and pwd = #{pwd}“) /** * 对于多个参数来说,每个参数之前都要加上@Param注解, * 要不然会找不到对应的参数进而报错 */ User login(@Param(“name”)String name, @Param(“pwd”)String pwd); }

使用 @Mapper,最终 Mybatis 会有一个拦截器,会自动的把 @Mapper 注解的接口生成动态代理类。这点可以在 MapperRegistry 类中的源代码中查看。

@Mapper 注解针对的是一个一个的类,相当于是一个一个 Mapper.xml 文件。而一个接口一个接口的使用 @Mapper,太麻烦了,于是 @MapperScan 就应用而生了。@MapperScan 配置一个或多个包路径,自动的扫描这些包路径下的类,自动的为它们生成代理类。

@SpringBootApplication @MapperScan({“com.xttblog.mapper”,”com.xttblog.dao”}) public class XttblogApp { public static void main(String[] args) { SpringApplication.run(XttblogApp.class, args); } }

当使用了 @MapperScan 注解,将会生成 MapperFactoryBean, 如果没有标注 @MapperScan 也就是没有 MapperFactoryBean 的实例,就走 @Import 里面的配置,具体可以在 AutoConfiguredMapperScannerRegistrar 和 MybatisAutoConfiguration 类中查看源代码进行分析。

例:

有@Mapper

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBAeWlnZw_size_20_color_FFFFFF_t_70_g_se_x_16

无@Mapper

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBAeWlnZw_size_20_color_FFFFFF_t_70_g_se_x_16 1

在SpringBoot中集成MyBatis,可以在mapper接口上添加@Mapper注解,将mapper注入到Spring,但是如果每一给mapper都添加@mapper注解会很麻烦,这时可以使用@MapperScan注解来扫描包。

经测试发现,@MapperScan注解只会扫描包中的接口,不会扫描类,所以可以在包中写Provider类。

@MapperScan(“com.demo.mapper”):扫描指定包中的接口 @MapperScan(“com.demo.*.mapper”):一个*代表任意字符串,但只代表一级包,比如可以扫到com.demo.aaa.mapper,不能扫到com.demo.aaa.bbb.mapper @MapperScan(“com.demo.**.mapper”):两个*代表任意个包,比如可以扫到com.demo.aaa.mapper,也可以扫到com.demo.aaa.bbb.mapper

原文地址:https://blog.csdn.net/f45056231p/article/details/83817740

发表评论

表情:
评论列表 (有 0 条评论,273人围观)

还没有评论,来说两句吧...

相关阅读

    相关 mybatis总结

    最近学习mybatis,总结了一些东西,都是些死东西,但是很实用,分享出来,希望将要学习mybatis的同学少走弯路。 阅读mybatis文档了解   1.重要类及

    相关 mybatis总结

      MyBatis框架 1. mybatis框架原理 持久层的框架 对原生态的jdbc程序进行总结 mybatis开发dao的两种方式 原始的方式:程序需要编写da

    相关 mybatis总结

    Mybatis也是一个ORM框架 ORM框架有很多,最常用的是Hibernate,Mybatis Mybatis支持原生态的sql语句,支持面向接口编程 Mybatis动