存在问题:
1 数据库连接、创建、释放 频繁造成系统资源浪费
2 sql语句 硬编码,不易维护
3 查询操作,需手动将结果集中的数据手动封装到实体中。
插入操作,需手动将实体的数据设置到sql语句的占位符位置。
应对方案:
1 使用数据库连接池初始化连接资源
2 将sql语句抽取到xml配置文件中
3 使用反射、内省等底层技术,自动将实体与表进行属性与字段的自动映射
基于java的持久层框架,它内部封装了jdbc,只需关注sql语句即可。
通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句。
mybatis框架执行sql并将结果映射为java对象并返回。采用ORM思想解决实体与数据库映射的问题,对jdbc进行封装,屏蔽jdbc api底层访问细节。
开发步骤:
1 添加MyBatis坐标
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.32version>
dependency>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.4.6version>
dependency>
4 编写映射文件UserMapper.xml
<mapper namespace="userMapper">
<select id="findAll" resultType="wsw.Domain.User">
select * from newUser
select>
mapper>
5 编写核心文件SqlMapConfig.xml
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
dataSource>
environment>
environments>
<mappers>
<mapper resource="Mapper\UserMapper.xml"/>
mappers>
configuration>
6 测试
@Test
public void test1() throws Exception {
//加载核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//获得sqlSession工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行sql语句
List<User> userList = sqlSession.selectList("User_Mapper.findAll");
//打印结果
System.out.println(userList);
//释放资源
sqlSession.close();
}
插入
UserMapper配置
<insert id="insert" parameterType="wsw.Domain.User">
insert into newUser values (#{id},#{username},#{password})
insert>
使用insert标签
映射文件使用parameterType属性指定要插入的数据类型
sql语句使用#{ 实体属性名 }引用属性值
涉及数据库数据变化,需使用sqlSession对象显示的提交事务
修改
UserMapper配置
<update id="update" parameterType="wsw.Domain.User">
update newUser set username=#{username},password=#{password} where id=#{id}
update>
删除
UserMapper配置
<delete id="delete" parameterType="java.lang.Integer">
delete from newUser where id=#{id}
delete>
测试代码涉及
使用delete标签
sql语句使用#{任意字符串}引用传递的单个参数
< configuration >为根标签
包括:
properties 属性
settings 设置
typeAliases 类型别名
typeHandlers 类型处理器
objectFactory 对象工厂
plugins 插件
environments 环境
···environment 环境变量
·····transactionManager 事务管理器
·····dataSource 数据源
databaseIdProvider 数据库厂商标识
mappers 映射器
数据环境配置,支持多环境配置
事务管理器(transactionManager)类型有两种:
· JDBC:直接使用JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域
· MANAGED:该配置几乎不做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如JEE应用服务器的上下文)。默认情况下它会关闭连接,而一些容器不希望如此,因此需将closeConnection属性设置为false来阻止它默认的关闭行为。
数据源(dataSource)类型有三种:
· UNPOOLED:该数据源的实现只是每次被请求时打开和关闭连接(类似原始JDBC操作)
· POOLED:该数据源的实现利用 “ 池 ” 的概念将JDBC连接对象组织起来
· JNDI:该数据源的实现是为了能在如EJB或应用服务器这类容器中使用,容器可集中或在外部配置数据源,然后放置一个JNDI上下文的引用
作用:加载映射,方式如下:
· 使用相对于类路径的资源引用,如:< mapper resource=“org/mybatis/builder/UserMapper.xml”/>
· 使用完全限定资源定位符(URL),如:< mapper url=“file:///var/mappers/UserMapper.xml”/>
· 使用映射器接口实现类的完全限定类名,如:< mapper class=“org.mybatis.builder.UserMapper.xml”/>
· 将包内的映射器接口实现全部注册为映射器,如:< package name=“org.mybatis.builder”/>
实际开发中,习惯将数据源配置信息单独抽取成一个properties文件,该标签可加载额外配置的properties文件
类型别名是为Java类型设置一个短的名字,自定义时使用。
该标签顺序必须在configuration里靠前
sqlSession工厂构造器SqlSessionFactoryBuilder
常用API:SqlSessionFactory build(InputStream inputStream)
通过加载mybatis的核心文件的输入流的形式构建一个SqlSessionFactory对象
Resource类在org.apache.ibatis.io中
SqlSession工厂对象SqlSessionFactory
其中,SqlSessionFactory 创建SqlSession实例常用方法:
SqlSession会话对象
执行语句方法:
操作事务方法:
只需编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象方法体同Dao接口实现类方法
通过SqlSession.getMapper获取Mybatis生成的代理对象
UserMapper usermapper = sqlSession.getMapper(UserMapper.class);
if
choose(when、otherwise)
trim(where、set)
foreach
< if >
根据实体类的不同取值,使用不同SQL语句查询。如:
< foreach >
open、close :以…开始、以…结束
item:每项命名
separator:设置分隔符
< sql >
SQL片段抽取
可重写类型处理器或创建自己的类型处理器以处理不支持的或非标准的类型。
实现org.apache.ibatis.type.TypeHandler接口,或继承一个便利类org.apache.ibatis.type.BaseTypeHandler,然后可选择性地将它映射到一个JDBC类型。
开发步骤:
1 定义转换类继承类BaseTypehandler< T >
2 覆盖4个未实现的方法,其中setNonNullParameter为java程序设置数据到数据库的回调方法,getNullableResult为查询时mysql的字符串类型转换成java的Type类型方法
3 在Mybatis核心配置文件中进行注册
4 测试
使用第三方插件
分页助手PageHelper将分页操作进行封装。
开发步骤:
1 导入通用PageHelper的坐标
<dependency>
<groupId>com.github.pagehelpergroupId>
<artifactId>pagehelperartifactId>
<version>5.1.2version>
dependency>
<dependency>
<groupId>com.github.jsqlparsergroupId>
<artifactId>jsqlparserartifactId>
<version>1.2version>
dependency>
2 在mybatis核心配置文件中配置PageHelper插件
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
plugin>
plugins>
其中,uid是外键,对应着User的id
通过< resultMap >手动配置外键的映射关系
@Insert:新增
@Update:更新
@Delete:删除
@Select:查询
@Result:结果集封装
@Results:可与@Result一起使用,封装多个结果集
@One:一对一结果集封装
@Many:一对多结果集封装
一对一
方式一
方式二
一对多
OrderMapper
UserMapper
多对多
RoleMapper
UserMapper
MyBatis-Plus(MP)是Mybatis增强工具,在Mybatis基础上只做增强。
只需简单配置,即可快速进行CRUD操作。
具有热加载、代码生成、分页、性能分析等功能。
官网地址
pom.xml导入代码:
<dependencies>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plusartifactId>
<version>3.1.1version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.47version>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druidartifactId>
<version>1.0.11version>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
<version>1.18.4version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
dependency>
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-log4j12artifactId>
<version>1.6.4version>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<configuration>
<source>1.8source>
<target>1.8target>
configuration>
plugin>
plugins>
build>
若是用最新版本的plus需要额外导入mybatis-plus-boot-starter或者mybatisplus-spring-boot-starter不然会报NoClassDefFoundErro
步骤:
实体类加入@Data、@NoArgsConstructor、@AllArgsConstructor三个注解后,不需要再写get、set方法等
二、使用Mybatis-Plus中的MybatisSqlSessionFactoryBuilder进程构建
在Spring整合时,除了上述的步骤外,还需在配置文件中改:
springBoot整合mybatis-plus
步骤一:导入坐标
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.1.4.RELEASEversion>
parent>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-loggingartifactId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>3.1.1version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.47version>
dependency>
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-log4j12artifactId>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
步骤二:创建配置文件、实体类、对应的mapper接口(继承BaseMapper)
插入操作:
在实体类id处需加入一个注解为@TableId,将id设置为自增长,同时数据库表内的自增值需要更改一下
@TableField
通过该注解可指定字段的一些属性,常解决问题:
1、对象中属性名与字段名不一致问题(非驼峰)
2、对象中的属性字段在表中不存在的问题
通过exist属性使该字段被忽略掉
此外,通过@TableField(select = false) 使指定字段在查询时不被返回
更新
2、根据条件更新
通过Wrapper两个实现类 QueryWrapper、UpdateWrapper设置条件
删除
4、根据id批量删除
当根据查询条件 查出数据超出一条时会报错
7、根据条件查询所有数据(翻页)
先编写配置类MybatisPlusConfig
@Configuration
@MapperScan("wsw.Mapper") //设置mapper接口的扫描包
public class MybatisPlusConfig {
@Bean //配置分页插件
public PaginationInterceptor paginationInterceptor(){
return new PaginationInterceptor();
}
}
首先MP中,ISqlInjector负责SQL的注入工作,它是一个接口,AbstractSqlInjector是它的实现类
在AbstractSqlInjector中,是由inspectInject()方法进行注入。其中methodList.forEach(m -> m.inject(builderAssistant, mapperClass, modelClass,
tableInfo));循环遍历方法,进行注入。
由inject里的injectMappedStatement抽象方法注入。该方法有很多实现类
以SelectById为例,生成了SqlSource对象,再将SQL通过addSelectMappedStatement方法添加到meppedStatements中。SqlSource对象包含sql语句
有单独的 MyBatis 配置,请将其路径配置到 configLocation 中。
SpringBoot:
mybatis-plus.config-location = classpath:mybatis-config.xml
SpringMVC:
<bean id="sqlSessionFactory"
class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatis-config.xml"/>
bean>
MyBatis Mapper 所对应的 XML 文件位置,如果在 Mapper 中有自定义方法(XML 中有自定义实现),需要进行该配置。
SpringBoot:
mybatis-plus.mapper-locations = classpath*:mybatis/*.xml
SpringMVC:
<bean id="sqlSessionFactory"
class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
<property name="mapperLocations" value="classpath*:mybatis/*.xml"/>
bean>
MyBaits 别名包扫描路径,通过该属性可以给包中的类注册别名,注册后在 Mapper 对应的 XML 文件中可以直接使用类名,而不用使用全限定的类名(即 XML 中调用的时候不用包含包名)。
SpringBoot:
mybatis-plus.type-aliases-package = cn.itcast.mp.pojo
SpringMVC:
<bean id="sqlSessionFactory"
class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
<property name="typeAliasesPackage"
value="com.baomidou.mybatisplus.samples.quickstart.entity"/>
bean>
是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN(下划线命名) 到经典 Java 属性名 aColumn(驼峰命名) 的类似映射。默认值为true
SpringBoot:
#关闭自动驼峰映射,该参数不能和mybatis-plus.config-location同时存在
mybatis-plus.configuration.map-underscore-to-camel-case=false
全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存,默认为 true。
mybatis-plus.configuration.cache-enabled=false
全局默认主键类型,设置后,即可省略实体对象中的@TableId(type = IdType.AUTO)配置。
SpringBoot:
mybatis-plus.global-config.db-config.id-type=auto
SpringMVC:
<bean id="sqlSessionFactory"
class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="globalConfig">
<bean class="com.baomidou.mybatisplus.core.config.GlobalConfig">
<property name="dbConfig">
<bean
class="com.baomidou.mybatisplus.core.config.GlobalConfig$DbConfig">
<property name="idType" value="AUTO"/>
bean>
property>
bean>
property>
bean>
表名前缀,全局配置后可省略@TableName()配置。
SpringBoot:
mybatis-plus.global-config.db-config.table-prefix=tb_
SpringMVC:
<bean id="sqlSessionFactory"
class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="globalConfig">
<bean class="com.baomidou.mybatisplus.core.config.GlobalConfig">
<property name="dbConfig">
<bean
class="com.baomidou.mybatisplus.core.config.GlobalConfig$DbConfig">
<property name="idType" value="AUTO"/>
<property name="tablePrefix" value="tb_"/>
bean>
property>
bean>
property>
bean>
全部eq(或个别isNull)
map集合中所有k(数据库字段名),v(字段值)均为条件
allEq(Map<R, V> params)
map集合中除去k(数据库字段名),v(字段值)为空的,其余为条件
allEq(Map<R, V> params, boolean null2IsNull)
创建过滤,通过箭头函数
allEq(BiPredicate<R, V> filter, Map<R, V> params)
allEq(BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull)
eq 等于
ne 不等于
gt 大于
ge 大于等于
lt 小于
le 小于等于
between 在值1与值2
notBetween 不在值1与值2
in 字段在(字段1,字段2,...)
notin 字段不在(字段1,字段2,...)
like like(“name”,“王”)--> name like ‘%王%’
notLike notLike(“name”,“王”)--> name not like ‘%王%’
likeLeft likeLeft(“name”,“王”)--> name like ‘%王’
likeRight likeRight(“name”,“王”)--> name like ‘王%’
orderBy orderBy(true, true, "id", "name") ---> order by id ASC,name ASC
orderByAsc orderByAsc("id", "name") ---> order by id ASC,name ASC 正序
orderByDesc orderByDesc("id", "name") ---> order by id DESC,name DESC 倒序
or 主动调用 or 表示紧接着下一个方法不是用 and 连接!(不调用 or 则默认为使用 and 连接)
and and(i -> i.eq("name", "李白").ne("status", "活着")) ---> and (name = '李白' and status
<> '活着')
select默认查询所有字段,如有需要则可以进行指定字段
ActiveRecord属于ORM(对象关系映射)层。遵循标准的ORM模型:
表映射到记录,记录映射到对象 ,字段映射到对象属性。
ActiveRecord主要思想:
· 每个数据库表对应创建一个类,类的每个对象实例对应数据库中表的一行记录;通常表的每个字段在类中都有相应的Field;
· ActiveRecord同时负责把自己持久化,在ActiveRecord中封装了对数据库的访问;
· ActiveRecord是一种领域模型(Domain Model),封装了部分业务逻辑;
需要将实体对象继承 Model< T >即可
在实体对象继承Model后,通过new实例化对象,即可操作,对应的UserMapper不可删除
Oracle数据库不支持自增长,需使用Sequence序列生成id值
1、在Oracle数据库中创建一个序列
2、版权原因,需将驱动包安装至本地仓库
3、修改application.properties
4、配置序列生成器、在实体对象中指定序列名称
Mybatis允许在已映射语句执行过程中的某一点进行拦截调用。
默认情况下,MyBatis允许使用插件来拦截的方法调用包括:
自定义拦截器:
@Intercepts({@Signature(
type = Executor.class,//指定拦截类型
method = "update",//拦截指定方法
args = {MappedStatement.class,Object.class}
)})
public class MyInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
//拦截方法,具体业务逻辑编写位置
return null;
}
@Override
public Object plugin(Object o) {
//创建target对象的代理对象,目的将当前拦截器加入到该对象中
return null;
}
@Override
public void setProperties(Properties properties) {
//属性设置
}
}
编写拦截器类进行注入,可通过注解形式
或xml配置
其中,plugin方法执行四次,第一次target是Executor执行器,随后进入interceptor方法,再接着,执行第二、三、四次,target依次是ParameterHandler、ResultSetHandler、StatementHandler
在MP中提供对SQL执行的分析插件,可用作阻断全表更新、删除的操作(仅适用于开发环境)
SpringBoot配置:
@Bean //SQL分析
public SqlExplainInterceptor sqlExplainInterceptor(){
SqlExplainInterceptor sqlExplainInterceptor = new SqlExplainInterceptor();
List<ISqlParser> sqlParserList = new ArrayList<>();
//攻击SQL阻断解析器,加入解析链
sqlParserList.add(new BlockAttackSqlParser());
sqlExplainInterceptor.setSqlParserList(sqlParserList);
return sqlExplainInterceptor;
}
用于输出每条SQL语句及执行时间,可设置最大执行时间,超出时间会抛出异常
配置:
@Bean //性能分析插件
public PerformanceInterceptor performanceInterceptor(){
PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
//最大执行时间,单位为毫秒
performanceInterceptor.setMaxTime(100);
//对输出SQL做格式化,,默认false
performanceInterceptor.setFormat(true);
return performanceInterceptor;
}
当要更新一条记录时,希望该记录没被他人更新。
乐观锁实现方式:
· 取出记录时,获取当前version
· 更新时,带上该version
· 执行更新时,set version = newVersion where version = oldVersion
· 如果version不对,则更新失败
Spring xml配置:
SpringBoot配置:
在实体类上添加version字段,同时数据库表中创建version对应的字段
特别说明:
· 支持数据类型:int、Integer、long、Long、Date、Timestamp、LocalDateTime
· 整数类型下newVersion = oldVersion + 1
· newVersion会回到entity中
· 仅支持updateById (id) 与 update (entity,wrapper) 方法
· 在 update (entity,wrapper) 方法下,wrapper不能复用
在MP中,通过AbstractSqlInjector将BaseMapper中的方法注入到Mybatis容器中。
通过自定义SQL注入器来扩展方法
1、编写自定义MyMapper来继承BaseMapper< T >:
public interface MyBaseMapper<T> extends BaseMapper<T> {
List<T> findAll();
}
2、其它Mapper只需继承MyMapper,可进行统一扩展方法
3、编写MySqlInjector类
如果直接继承AbstractSqlInjector的话,原有的BaseMapper中的方法将失效,需选择继承DefaultSqlInjector进行扩展。
public class MySqlInjector extends DefaultSqlInjector {
@Override
public List<AbstractMethod> getMethodList() {
List<AbstractMethod> list = new ArrayList<>();
//获取父类中的集合
list.addAll(super.getMethodList());
//扩充自定义方法
list.add(new FindAll());
return list;
}
}
4、编写扩展方法的类FindAll
public class FindAll extends AbstractMethod {
@Override
public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
String sql = "select * from "+tableInfo.getTableName(); //tableInfo动态获取表名
SqlSource sqlSource = languageDriver.createSqlSource(configuration,sql,modelClass);
//第二个参数为扩展方法名
return addSelectMappedStatement(mapperClass, "findAll", sqlSource, modelClass, tableInfo);
}
}
5、在SpringBoot中配置注入
//自定义sql注入
@Bean
public MySqlInjector mySqlInjector(){
return new MySqlInjector();
}
1、添加@TableField注解
@TableField(fill = FieldFill.INSERT)
private String password;
为password字段设置自动填充,在新增数据时有效
2、编写MyMetaObjectHandler
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
//插入时自动填充
@Override
public void insertFill(MetaObject metaObject) {
Object password = getFieldValByName("password",metaObject);
if (password == null){
setFieldValByName("password","777777",metaObject);
}
}
//更新时自动填充
@Override
public void updateFill(MetaObject metaObject) {
}
}
逻辑删除,即,将数据标记为删除,并非真正的物理删除(非Delete操作),查询时需携带状态条件,确保被标记的数据不被查询到
修改实体类,添加deleted属性,添加@TableLogic注解:
添加配置:
#删除状态的值为:1
mybatis-plus.global-config.db-config.logic-delete-value=1
#未删除状态的值为:0
mybatis-plus.global-config.db-config.logic-not-delete-value=0
定义枚举:
public enum SexEnum implements IEnum<Integer> {
MAN(1,"男"),
WOMAN(2,"女");
private int value;
private String desc;
SexEnum(int value, String desc) {
this.value = value;
this.desc = desc;
}
@Override
public Integer getValue() {
return this.value;
}
@Override
public String toString() {
return this.desc;
}
}
添加配置:
#枚举包配置
mybatis-plus.type-enums-package=wsw.Enum
实体类中添加枚举属性:
添加、查询均有效,实现数字与字段的对应
AutoGenerator是Mybatis-Plus的代码生成器。可快速生成Entity、Mapper、MapperXML、Service、Controller等代码
pom.xml导入坐标:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.1.4.RELEASEversion>
parent>
<groupId>org.examplegroupId>
<artifactId>GeneratorartifactId>
<version>1.0-SNAPSHOTversion>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>3.1.1version>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-generatorartifactId>
<version>3.1.1version>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-freemarkerartifactId>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.47version>
dependency>
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-log4j12artifactId>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
project>
代码:
package wsw;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.FileOutConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.TemplateConfig;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
public class generator {
/**
*
* 读取控制台内容
*
*/
public static String scanner(String tip) {
Scanner scanner = new Scanner(System.in);
StringBuilder help = new StringBuilder();
help.append("请输入" + tip + ":");
System.out.println(help.toString());
if (scanner.hasNext()) {
String ipt = scanner.next();
if (StringUtils.isNotEmpty(ipt)) {
return ipt;
}
}throw new MybatisPlusException("请输入正确的" + tip + "!");
}
/**
* RUN THIS
*/
public static void main(String[] args) {
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
gc.setOutputDir(projectPath + "/src/main/java");
gc.setAuthor("wsw");
gc.setOpen(false);
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&useSSL=false&characterEncoding=utf8");
// dsc.setSchemaName("public");
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("123456");
mpg.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName(scanner("模块名"));
pc.setParent("wsw");
mpg.setPackageInfo(pc);
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
List<FileOutConfig> focList = new ArrayList<>();
focList.add(new FileOutConfig("/templates/mapper.xml.ftl") {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输入文件名称
return projectPath + "/Generator/src/main/resources/mapper/" + pc.getModuleName()
+ "/" + tableInfo.getEntityName() + "Mapper" +
StringPool.DOT_XML;
}
});
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
mpg.setTemplate(new TemplateConfig().setXml(null));
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
//
strategy.setSuperEntityClass("com.baomidou.mybatisplus.samples.wsw.generator.common.BaseEntity");
strategy.setEntityLombokModel(true);
//
strategy.setSuperControllerClass("com.baomidou.mybatisplus.samples.wsw.generator.common.BaseController");
strategy.setInclude(scanner("表名"));
strategy.setSuperEntityColumns("id");
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix(pc.getModuleName() + "_");
mpg.setStrategy(strategy);
// 选择 freemarker 引擎需要指定如下加,注意 pom 依赖必须有!
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
mpg.execute();
}
}
在settings中plugins安装
功能:
1 java与xml回调跳转
2 Mapper自动生成xml