• 第五章 MyBais插件


    1. pageHelper 分页插件

    1.1 maven 导入依赖

    1. <groupId>com.github.pagehelpergroupId>
    2. <artifactId>pagehelperartifactId>
    3. <version>5.3.0version>

    1.2 在MyBatis的xml文件中配置

    1. <plugins>
    2. <plugin interceptor="com.github.pagehelper.PageInterceptor">
    3. <property name="offsetAsPageNum" value="true"/>
    4. <property name="rowBoundsWithCount" value="true"/>
    5. <property name="reasonable" value="true"/>
    6. plugin>
    7. plugins>

    1.3 使用

    三步走:

    //配置要访问的页码和每页的记录数

    PageHelper.startPage(1,3)

    //执行自己的查询方法

    .........

    //用分页插件中的工具类来封装查询结果,这个对象就是封装好的分页结果对象

    new PageInfo<>(mapper.goodsList())

    2. 插件开发(拦截器)

            MyBatis拦截器为了供用户在某些时候可以实现自己的逻辑而不必去动MyBatis固有的逻辑;通过MyBatis拦截器我们可以拦截某些方法的调用,我们可以选择在这些被拦截的方法执行前后加上某些逻辑,也可以在执行这些被拦截的方法时执行自己的逻辑而不再执行被拦截的方法。

            MyBatis拦截器并不是每个对象里面的方法都可以被拦截的,拦截器只能拦截Executor、ParameterHandler、StatementHandler、ResultSetHandler四个对象里面的方法,MyBatis允许在映射语句执行过程中的某一点进行拦截调用,默认情况下,MyBatis允许使用插件来拦截的方法调用包括:

    对象名称对象作用
    ParameterHandler处理用户提交参数对象
    StatementHandler预编译SQL语句对象
    Executor执行SQL语句对象
    ResultSetHandler处理返回结果集对象

    2.1 接口

            Executor 是 Mybatis 的内部执行器,负责调用StatementHandler操作数据库,并把结果集通过 ResultSetHandler 进行自动映射,同时还处理了二级缓存的操作(故我们可以通过插件来实现自定义的二级缓存);

            StatemenHandler 是 Mybatis 直接和数据库执行 sql 脚本的对象,也实现了Mybatis的一级缓存(可以使用插件来实现对一级缓存的操作(禁用等));

            ParameterHandler 是 Mybatis 实现 Sql 入参设置的对象(插件可以该改变sql的参数默认设置);

            ResuSetHandler 是 Mybatis 把 ResultSet 集合映射成 POJO 的接口对象(可以定义插件对Mybatis 的结果集自动映射进行修改)。

    2.2 自定义拦截器(分页插件)

            只需要实现 interceptor 接口,并指定想要拦截的方法签名即可。

    1. @Intercepts(
    2. @Signature(
    3. type = StatementHandler.class,
    4. method = "prepare",
    5. args = {Connection.class,Integer.class}
    6. )
    7. )
    8. public class MyPageInterceptor implements Interceptor {
    9. }
    属性名称属性作用
    @Intercepts标记这是一个interceptor
    @Signature定义拦截点
    @type拦截对象
    @method拦截对象中的某一个方法
    @args拦截方法上对应的参数

    2.3 接口interceptor方法

    1. public interface Interceptor {
    2. Object intercept(Invocation invocation) throws Throwable;
    3. Object plugin(Object target);
    4. void setProperties(Properties properties);
    5. }

            intercept :直接覆盖所拦截的对象,有个参数 invocation 对象,通过改对象可以反射调度原来对象的方法;

            plugin:target 是被拦截的对象,用于给被拦截对象生成一个代理对象;

            setProperties:允许在plugin元素中配置所需参数,该方法在插件初始化的时候会被调用一次。

    2.4 实现过程

            Mybatis 在执行 sql 语句前会产生一个包含 Sql 语句的 Statement 对象,在 生成 statement 之前修改 sql 语句,把 原来的sql 语句改成对应分页查询 sql 语句。

    2.5 将插件注册到全局配置文件中

    1. <plugins>
    2. <plugin interceptor="com.interceptor.MyPageInterceptor">
    3. <property name="start" value="0"/>
    4. <property name="end" value="3"/>
    5. plugin>
    6. plugins>

    2.6 具体代码

    1. public class MyPageInterceptor implements Interceptor {
    2. private String start;
    3. private String end;
    4. @Override
    5. public Object intercept(Invocation invocation) throws Throwable {
    6. Object target = invocation.getTarget();
    7. MetaObject metaObject = SystemMetaObject.forObject(target);
    8. String oldSql = metaObject.getValue("delegate.boundSql.sql").toString();
    9. System.out.println("oldSql:"+oldSql);
    10. String newSql = oldSql+" limit "+start+","+end;
    11. System.out.println("newSql"+newSql);
    12. metaObject.setValue("delegate.boundSql.sql",newSql);
    13. return invocation.proceed();
    14. }
    15. @Override
    16. public Object plugin(Object target) {
    17. if(target instanceof StatementHandler){
    18. return Plugin.wrap(target, this);
    19. }
    20. return target;
    21. }
    22. @Override
    23. public void setProperties(Properties properties) {
    24. start = properties.getProperty("start");
    25. end = properties.getProperty("end");
    26. }
    27. }

    3. 通用mapper

            2. 使用通用 Mapper

            通用mapper的作用,在mybatis框架基础上,封装了单表增删改查的操作(不需要定义mapper文件,就可以实现相应功能)

    3.1 加 jar

    1. <dependency>
    2. <groupId>com.github.abel533groupId>
    3. <artifactId>mapperartifactId>
    4. <version>3.0.1version>
    5. dependency>

    3.2 配置插件(Mapper在Mybtis的拦截器)

    1. <plugin interceptor="com.github.abel533.mapperhelper.MapperInterceptor">
    2. <property name="mappers" value="com.github.abel533.mapper.Mapper" />
    3. plugin>

    3.3 编写接口继承Mapper

    1. public interface IGoodsDaoCo extends Mapper {
    2. }

    3.4 配置实体类与表之间的关系

    1. @Data
    2. @Table(name = "tb_goods")
    3. public class Goods implements Serializable {
    4. @Id
    5. private Integer goodsId;
    6. @Column(name = "goods_name")
    7. private String goodsName;
    8. private Double price;
    9. private Date produceDate;
    10. private String address;
    11. private Integer categoryId;
    12. }

    3.5 测试

    1. @Test
    2. public void IGoodsDaoCo(){
    3. IGoodsDaoCo mapper = session.getMapper(IGoodsDaoCo.class);
    4. List select = mapper.select(null);
    5. System.out.println(select);
    6. Goods goods = mapper.selectByPrimaryKey(19);
    7. System.out.println(goods);
    8. session.close();
    9. }

    自定义条件查询:

    1. @Test
    2. public void testSelectByExample(){
    3. Example example = new Example(Goods.class);
    4. example.createCriteria().andBetween("goodsId",15,19);
    5. example.or(example.createCriteria().andLike("goodsName","%茶%"));
    6. example.setOrderByClause("goodsId desc");
    7. IGoodsDaoCo mapper = session.getMapper(IGoodsDaoCo.class);
    8. mapper.selectByExample(example).forEach(System.out::println);
    9. }

     3.6 小结

    ①表名默认使用类名,驼峰转下划线(只对大写字母进行处理),如 UserInfo 默认对应的表名为 user_info;

    ②表名可以使用 @Table(name = "tableName")进行指定,对不符合第一条默认规则的通过这种方式指定表名;

    ③字段默认和 @Column 一样,都会作为表字段,表字段默认为Java对象的Field名字驼峰转下划线形式;

    ④可以使用 @Column(name = "filedName") 指定不符合第三条规则的表名;

    ⑤使用 @Transient 注解可以忽略字段,添加该注解的字段不会作为表字段使用;

    ⑥建议有一个 @Id 注解作为主键字段,可以有多个 @Id 注解的字段作为联合主键;

    ⑦如果是MySQL的自增字段,加上 @GeneratedValue(generator = "JDBC" )即可;

    ⑧实体里不i安逸使用基本数据类型如int类型默认是为0且无法消除。

    4. 逆向工程

            通过逆向工程插件(代码生成工具),根据数据库中的表,自动生成Java代码类。

            MyBatis Generator Core – Introduction to MyBatis Generator 

    4.1 jar

    1. <dependency>
    2. <groupId>org.mybatis.generatorgroupId>
    3. <artifactId>mybatis-generator-coreartifactId>
    4. <version>1.3.2version>
    5. dependency>

    4.2 配置文件(单独的)

    1. "1.0" encoding="UTF-8"?>
    2. generatorConfiguration
    3. PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
    4. "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
    5. <generatorConfiguration>
    6. <context id="testTables" targetRuntime="MyBatis3">
    7. <plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
    8. <commentGenerator>
    9. <property name="suppressAllComments" value="false" />
    10. commentGenerator>
    11. <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
    12. connectionURL="jdbc:mysql://localhost:3306/lay-first?useSSL=false&characterEncoding=utf-8&serverTimezone=Asia/Shanghai" userId="root"
    13. password="123456">
    14. jdbcConnection>
    15. <javaTypeResolver>
    16. <property name="forceBigDecimals" value="false" />
    17. javaTypeResolver>
    18. <javaModelGenerator targetPackage="com.entity"
    19. targetProject=".\src\main\java">
    20. <property name="enableSubPackages" value="false" />
    21. <property name="trimStrings" value="true" />
    22. javaModelGenerator>
    23. <sqlMapGenerator targetPackage="com.mapper"
    24. targetProject=".\src\main\resources">
    25. <property name="enableSubPackages" value="false" />
    26. sqlMapGenerator>
    27. <javaClientGenerator type="XMLMAPPER"
    28. targetPackage="com.mapper"
    29. targetProject=".\src\main\java">
    30. <property name="enableSubPackages" value="false" />
    31. javaClientGenerator>
    32. <table schema="" tableName="tb_goods" enableCountByExample="false" domainObjectName="Goods"
    33. enableUpdateByExample="false"
    34. enableDeleteByExample="false"
    35. enableSelectByExample="false"
    36. selectByExampleQueryId="false"
    37. />
    38. context>
    39. generatorConfiguration>

    4.3 测试类(生成代码)

    1. @Test
    2. public void generator() throws Exception{
    3. List warnings = new ArrayList();
    4. boolean overwrite = true;
    5. //指定 逆向工程配置文件
    6. File configFile = new File("E:\\Desktop\\Java_dev\\0819\\MBG\\src\\main\\resources\\mybatis-config-gen.xml");
    7. //配置解析器
    8. ConfigurationParser cp = new ConfigurationParser(warnings);
    9. //配置对象
    10. Configuration config = cp.parseConfiguration(configFile);
    11. //回调设置
    12. DefaultShellCallback callback = new DefaultShellCallback(overwrite);
    13. //构建mybatis代码生成工具对象
    14. MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,
    15. callback, warnings);
    16. //进行代码生成
    17. myBatisGenerator.generate(null);
    18. }

  • 相关阅读:
    leetcode-aboutString
    Java笔记:Volatile
    0x7fffffff解析
    Android源码——Rect源码解析
    计算机毕业设计django基于python的宠物分享网站(源码+系统+mysql数据库+Lw文档)
    Android Studio实现内容丰富的安卓校园新闻浏览平台
    TCP/IP协议
    从技术创新到应用实践,百度智能云发起大模型平台应用开发挑战赛!
    java计算机毕业设计计算机组成原理教学网站源码+mysql数据库+系统+lw文档+部署
    ARM Cortex-A9:裸机开发,点亮LED3
  • 原文地址:https://blog.csdn.net/m0_71674778/article/details/126425976