mybats-puls---条件构造器Wrapper,插件扩展,SQL注入器,公共字段填充

条件构造器Wrapper(看官网即可)
代码生成器
AutoGenerator 是 MyBatis­Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块 的代码,极大的提升了开发效率。
其实在学习mybatis的时候我们就使用过逆向工程,根据我们的数据表 来生成的对应的实体类,DAO接口和Mapper映射文件,而MyBatis­plus提供了 更加完善的功能,下面来针对两种方式做一个基本的对比
1、MyBatis­plus是根据java代码开生成代码的,而Mybatis是根据 XML文件的配置来生成的
2、MyBatis­plus能够生成实体类、Mapper接口、Mapper映射文件, Service层,Controller层,而Mybatis只能生成实体类,Mapper接口,Mapper映 射文件
1、操作步骤:
1、添加依赖
添加代码生成器依赖

1<dependency>
2<groupId>com.baomidou</groupId>
3<artifactId>mybatis‐plus‐generator</artifactId>
4<version>3.3.1.tmp</version>
5</dependency>

添加 模板引擎 依赖,MyBatis­Plus 支持 Velocity(默认)、Freemarker、
Beetl,用户可以选择自己熟悉的模板引擎,如果都不满足您的要求,可以采用

自定义模板引擎。

1<dependency>
2<groupId>org.apache.velocity</groupId>
3<artifactId>velocity‐engine‐core</artifactId>
4<version>2.2</version>
5</dependency>
6<dependency>
7<groupId>org.freemarker</groupId>
8<artifactId>freemarker</artifactId>
9<version>2.3.30</version>
10</dependency>
11<dependency>
12<groupId>com.ibeetl</groupId>
13<artifactId>beetl</artifactId>
14<version>3.1.1.RELEASE</version>
15</dependency>

2、编写生成类

public class MyTest {


@Test
public void testGenerator(){
	//此处默认有两个对应的实现类,大家不要导错包
	GlobalConfig globalConfig = new GlobalConfig();
	//设置全局的配置
globalConfig.setActiveRecord(true)//是否支持AR模式
.setAuthor("lian")//设置作者
.setOutputDir("e:\\self_project\\mybatisplus_generatorcode\\src\\main\\java")//设置生成路径
.setFileOverride(true)//设置文件覆盖
.setIdType(IdType.AUTO) //设置主键生成策略
.setServiceName("%sService")//设置生成的serivce接口的名字
.setBaseResultMap(true) //设置基本的结果集映射
.setBaseColumnList(true);//设置基本的列集合
// 进行策略配置
StrategyConfig strategyConfig = new StrategyConfig(); strategyConfig.setCapitalMode(true)//设置全局大写命名
.setNaming(NamingStrategy.underline_to_camel)//数据库表映射到实体的命名策
.setTablePrefix("tbl_")//设置表名前缀
.setInclude("tbl_emp");//生成的表
// 进行包名的策略配置
PackageConfig packageConfig = new PackageConfig(); packageConfig.setParent("cn.tulingxueyuan")
.setMapper("mapper")
.setService("service")
.setController("controller")
.setEntity("bean")
.setXml("mapper");
//整合配置
AutoGenerator autoGenerator = new AutoGenerator(); autoGenerator.setGlobalConfig(globalConfig).setDataSource(dataSourceCon
fig).setStrategy(strategyConfig)
	.setPackageInfo(packageConfig);
autoGenerator.execute();
}
}


注意,当通过上述代码实现之后,大家发现可以在Controller层可以直
接实现调用,这些调用的实现最核心的功能就在于ServiceImpl类,这个类中自 动完成mapper的注入,同时提供了一系列CRUD的方法。

6、插件扩展
MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,
MyBatis 允许使用插件来拦截的方法调用包括:
Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
ParameterHandler (getParameterObject, setParameters) ResultSetHandler (handleResultSets, handleOutputParameters) StatementHandler (prepare, parameterize, batch, update, query)
1、分页插件
在spring.xml文件中添加如下配置引入插件

1<property name="plugins">
2<array>
3<bean class="com.baomidou.mybatisplus.extension.plugins.PaginationInterc eptor"></bean>
4</array>
5</property>

编写测试类

1@Test
2public void TestPage(){
3Page page = new Page(2,2);
4Page page1 = empDao.selectPage(page, null);
5List records = page1.getRecords();
6for (Object record : records) {
7System.out.println(record);
8	}
9	System.out.println("==============");
10System.out.println("获取总条数:"+page.getTotal());
11System.out.println("当前页码:"+page.getCurrent());
12System.out.println("总页码:"+page.getPages());
13System.out.println("每页显示的条数:"+page.getSize());
14System.out.println("是否有上一页:"+page.hasPrevious());
15System.out.println("是否有下一页:"+page.hasNext());
16	}

2、乐观锁插件
当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁实现方式:

取出记录时,获取当前version
更新时,带上这个version
执行更新时, set version = newVersion where version = oldVersion
如果version不对,就更新失败 添加配置:

 <bean class="com.baomidou.mybatisplus.extension.plugins.OptimisticLockerI nterceptor"></bean>

修改实体类添加version字段并在表中添加version字段
编写测试类

@Test
public void testOptimisticLocker(){
Emp emp = new Emp();
emp.setEmpno(22);
emp.seteName("zhang");
	emp.setSal(10000.0);
emp.setComm(1000.0);
emp.setVersion(2);
empDao.updateById(emp);
}

3、SQL执行分析插件,避免出现全表更新和删除

1<bean class="com.baomidou.mybatisplus.extension.plugins.SqlExplainInterc eptor">
2<property name="sqlParserList">
3<list>
4<bean class="com.baomidou.mybatisplus.extension.parsers.BlockAttackSqlPa rser"></bean>
5</list>
6</property>
7</bean>
1@Test
2public void testSqlExplain(){
3int delete = empDao.delete(null);
4System.out.println(delete);
5  }

4、非法sql检查插件

 <bean class="com.baomidou.mybatisplus.extension.plugins.IllegalSQLInterce ptor">
 </bean>


@Test
public void testSqlIllegal(){
QueryWrapper<Emp> queryWrapper = new QueryWrapper<>();
queryWrapper.or();
List<Emp> list = empDao.selectList(queryWrapper);
for (Emp emp : list) {
System.out.println(emp);
	}
  }

7、SQL注入器
全局配置 sqlInjector 用于注入 ISqlInjector 接口的子类,实现自定义 方法注入。也就是说我们可以将配置在xml中的文件使用注入的方式注入到全局 中,就不需要再编写sql语句
自定义注入器

在这里插入图片描述
添加配置:

1<bean id="globalConfig" class="com.baomidou.mybatisplus.core.config.Glob alConfig">
2<property name="dbConfig" ref="dbConfig"></property>
3<property name="sqlInjector" ref="myinject"></property>
4</bean>
5	<bean id="myinject" class="cn.tulingxueyuan.injector.MyInjector"></bean>
1  package cn.tulingxueyuan.injector;
2
3import com.baomidou.mybatisplus.core.injector.AbstractMethod;
4import com.baomidou.mybatisplus.core.metadata.TableInfo;
5import org.apache.ibatis.mapping.MappedStatement;
6import org.apache.ibatis.mapping.SqlSource;
7
8public class DeleteAll extends AbstractMethod {
9@Override
10public MappedStatement injectMappedStatement(Class<?> mapperClass, Clas s<?> modelClass, TableInfo tableInfo) {
11String sql;
12MySqlMethod mySqlMethod = MySqlMethod.DELETE_ALL;
13if (tableInfo.isLogicDelete()) {
14sql = String.format(mySqlMethod.getSql(), tableInfo.getTableName(), tab leInfo,
15sqlWhereEntityWrapper(true,tableInfo));
16} else {
17mySqlMethod = MySqlMethod.DELETE_ALL;
18sql = String.format(mySqlMethod.getSql(), tableInfo.getTableName(),
19sqlWhereEntityWrapper(true,tableInfo));
20	}
21SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
22return addUpdateMappedStatement(mapperClass, modelClass, mySqlMethod.ge tMethod(), sqlSource);
23	}
24  }
25  package cn.tulingxueyuan.injector;
26
27
28	/**
29	* 自定义全局删除方法
30	*/
31
32	public enum MySqlMethod {
33
34
35	/**
36	* 删除全部
37	*/
38	DELETE_ALL("deleteAll", "根据 entity 条件删除记录", "<script>\nDELETE FRO M %s %s\n</script>");
39
40
41private final String method;
42private final String desc;
43private final String sql;
44
45MySqlMethod(String method, String desc, String sql) {
46this.method = method;
47this.desc = desc;
48this.sql = sql;
49	}
50
51public String getMethod() {
52return method;
53	}
54
55public String getDesc() {
56return desc;
57	}
58
59public String getSql() {
60return sql;
61	}
62
63  }
64  package cn.tulingxueyuan.dao;
65
66import com.baomidou.mybatisplus.core.mapper.BaseMapper;
67import cn.tulingxueyuan.bean.Emp;
68
69  /**
70	* 在mybatis操作的时候,我们需要自己定义接口中实现的方法,并添加与之对应的EmpD ao.xml文件,编写对应的sql语句
71	* 在mybatis‐plus操作的时候,我们只需要继承BaseMapper接口即可,其中的泛型T表 示我们要实际操作的实体类对象
72	*/
73public interface EmpDao extends BaseMapper<Emp> {
74Integer deleteAll();
75  }


8、公共字段填充
实现元对象处理器接口:
com.baomidou.mybatisplus.core.handlers.MetaObjectHandler
注解填充字段 @TableField(… fill = FieldFill.INSERT) 生成器策略部分 也可以配置!
metaobject:元对象,是mybatis提供的一个用于更加方便,更加优雅的访问对象 的属性,给对象的属性设置值的一个对象,还会用于包装对象,支持 Object,Map,Collection等对象进行包装。本质上metaobject是给对象的属性设置 值,最终还是要通过Reflect获取到属性的对应方法的invoker,最终执行。 编写自定义的公共字段填充

1  package cn.tulingxueyuan.fill;
2
3import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
4import org.apache.ibatis.reflection.MetaObject;
5
6import java.time.LocalDateTime;
7import java.util.stream.Stream;
8
9  public class MyMetaObjectHandler implements MetaObjectHandler {
10
11@Override
12public void insertFill(MetaObject metaObject) {
13this.strictInsertFill(metaObject, "eName", String.class, "lian"); // 起 始版本 3.3.0(推荐使用)
14// this.fillStrategy(metaObject, "createTime", LocalDateTime.now()); //
也可以使用(3.3.0 该方法有bug请升级到之后的版本如`3.3.1.8‐SNAPSHOT`)
15	}
16
17@Override
18public void updateFill(MetaObject metaObject) {
19this.strictUpdateFill(metaObject, "eName", String.class,"lian"); // 起始 版本 3.3.0(推荐使用)
20// this.fillStrategy(metaObject, "updateTime", LocalDateTime.now()); //
也可以使用(3.3.0 该方法有bug请升级到之后的版本如`3.3.1.8‐SNAPSHOT`)
21	}
22  }

添加到对应的配置中:
在这里插入图片描述

测试:在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值