关于MyBatis逆向工具的学习
一、配置逆向工具
- 配置插件信息【mybatis-generator 逆向工具插件,固定写法】
<plugins>
<!-- mybatis-generator 逆向工具插件 -->
<!-- mybatis代码生成插件 -->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<!--配置文件的位置-->
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
</dependencies>
</plugin>
</plugins>
- 在resources目录下创建配置文件generatorConfig.xml【主配置文件,必须要有,他的位置已经在插件中声明,可以自己修改】
插件中的位置:
<configuration>
<!--配置文件的位置-->
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
generatorConfig.xml主配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!--mysql 连接数据库jar 这里选择自己本地位置;
如果不知道maven本地仓库地址,可以使用EveryThing工具全局搜索mysql-connector-java,找到jar包位置;
也可以手动下载一个jar放在指定位置,进行引用。
-->
<classPathEntry location="D:\work\maven\maven_repository\mysql\mysql-connector-java\5.1.9\mysql-connector-java-5.1.9.jar"/>
<context id="testTables" targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否去除自动生成的注释,true:是,false:否 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/smstwo"
userId="root"
password="ht520520">
</jdbcConnection>
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 指定javaBean生成的位置
targetPackage:生成的类要放的包,真实的包受enableSubPackages属性控制;
targetProject:目标项目,指定一个存在的目录下,生成的内容会放到指定目录中,如果目录不存在,MBG不会自动建目录
-->
<javaModelGenerator targetPackage="com.SMS.domain" targetProject="src/main/java">
<!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false;如果多个数据库改为true分目录 -->
<property name="enableSubPackages" value="false"/>
<!-- 设置是否在getter方法中,对String类型字段调用trim()方法 -->
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 指定mapper映射文件生成的位置
targetPackage、targetProject同javaModelGenerator中作用一样-->
<sqlMapGenerator targetPackage="com.SMS.dao" targetProject="src/main/java">
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
<!-- 指定mapper接口生成的位置
targetPackage、targetProject同javaModelGenerator中作用一样
-->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.SMS.dao"
targetProject="src/main/java">
<property name="enableSubPackages" value="false"/>
</javaClientGenerator>
<!-- 指定数据库表
domainObjectName:生成的domain类的名字,当表名和domain类的名字有差异时一定要设置,如果不设置,直接使用表名作为domain类的名字;
可以设置为somepck.domainName,那么会自动把domainName类再放到somepck包里面;
-->
<table tableName="t_userlogin" domainObjectName="User"></table>
<table tableName="t_class" domainObjectName="MyClass"></table>
<table tableName="t_course" domainObjectName="Course"></table>
<table tableName="t_dept" domainObjectName="Dept"></table>
<table tableName="t_leave" domainObjectName="Leave"></table>
<table tableName="t_student" domainObjectName="Student"></table>
<table tableName="t_tearcher" domainObjectName="Tearcher"></table>
</context>
</generatorConfiguration>
- 插件以及主配置文件,直接复制修改即可。到此基本配置以及完成。
二、自动生成代码
- 配置代码自动生成的maven工具
- 在配置Tomcat那个地方,配置maven工具,点击+号新建maven工具
- 基本配置
name:就是给这个配置项取个名。
Working directory:给哪一个项目(工程或者是Model)添加逆向代码工具
Command line:mybatis-generator:generate -e【这个是逆向工具的核心指令,生成逆向代码必须项】 - 配置完毕以后。直接在配置的项目中点击运行即可。会自动生成所需代码。
三、如何进行查询
1、Generator提供的简单查询
- 根据主键进行查询
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
UserMapper userMapper = (UserMapper) ac.getBean("userMapper");
User user = userMapper.selectByPrimaryKey(1l);
System.out.println(user);
sql语句+运行结果
-
插入用户【每个字段都不能为空,否则报错】
int result= userMapper.insert(user);
-
修改用户
userMapper.updateByPrimaryKey(user);
-
删除用户【根据主键】
userMapper.deleteByPrimaryKey(1l);
2、如何使用Generator进行复杂查询【重点内容】
1、如何进行复杂查询
UserExample example = new UserExample();
UserExample.Criteria criteria = example.createCriteria();
1、使用criteria 来进行参数设置。
2、使用逆向生成的userMapper.selectByExample(UserExample example);进行查询
3、增删改查都会有这个参数example。
4、这只是基本步骤,光看这个肯定是看不懂的。往后看!
2、代码分析【源码分析】
- 关于自动生成在和实体类并列的那个UserException类分析
属性分析:
1、protected String orderByClause:asc是正序,desc是逆序。
比如:根据年龄的逆序:example.setOrderByClause(age desc)
2、protected boolean distinct:是否去除重复,true是去除,false是不去除
比如:去除查询结果重复:example.setDistinct(true);
3、protected List oredCriteria:一个集合。
在无参构造中进行了参数赋值:oredCriteria = new ArrayList<Criteria>();
自定义条件的查询,条件之间通过or连接,riteria的集合,集合中对象是由or连接。
4、关于静态内部类
public static class Criteria extends GeneratedCriteria {
protected Criteria() {
super();
}
}
一个内部类,调用了父类的无参构造。父类的无参构造创建了,criteria = new ArrayList();自定义条件的查询,条件之间通过and连接。
3、基本CRUD实现【前面不懂不要紧,看了这个你就很清晰了,再去看前面的就明白了这前后的关系了】
以User为例:
UserExample example = new UserExample();
UserExample.Criteria criteria = example.createCriteria();
- 查询用户数量:
long count = UserMapper.countByExample(example);
底层sql代码+执行结果 - where条件查询或多条件查询【and查询】
用户登录,传入username,userpwd,usertype:
UserExample example = new UserExample();
UserExample.Criteria criteria = example.createCriteria();
user.setUsername("admin");
user.setUserpwd("123");
user.setUsertype(0);
if (StringUtils.isNotBlank(user.getUsername())){
criteria.andUsernameEqualTo(user.getUsername());
}
if (StringUtils.isNotBlank(user.getUserpwd())){
criteria.andUserpwdEqualTo(user.getUserpwd());
}
if (StringUtils.isNotBlank(String.valueOf(user.getUsertype()))){
criteria.andUsertypeEqualTo(user.getUsertype());
}
List<User> users = userMapper.selectByExample(example);
System.out.println(users);
System.out.println(users.size());
执行结果+sql代码
sql代码:select uid, username, userpwd, date, usertype from t_userlogin WHERE ( username = ? and userpwd = ? and usertype = ? )
关于AND的总结:
1、criteria是多个Criterion的集合。
2、criteria是用来做And连接的。
3、使用andUsertypeEqualTo方法进行具体字段值的设置。
4、查询结果封装在List中。
5、可以这样理解:多个criterion存储在一个集合中,一个criterion就是代表一个具体的字段的赋值。如果放在一个集合中,他们的关系就是and
- where条件查询或多条件查询【or查询】
1、第一种or查询
user.setUsername("admin");
user.setUserpwd("123");
user.setUsertype(1);
UserExample example = new UserExample();
UserExample.Criteria criteria1 = example.createCriteria();
UserExample.Criteria criteria2 = example.createCriteria();
UserExample.Criteria criteria3 = example.createCriteria();
criteria1.andUsernameEqualTo(user.getUsername());
criteria2.andUserpwdEqualTo(user.getUserpwd());
criteria3.andUsertypeEqualTo(user.getUsertype());
example.or(criteria2);
example.or(criteria3);
List<User> users = userMapper.selectByExample(example);
System.out.println(users);
System.out.println(users.size());
- 每一个Criteria是一个查询条件。
- 从第二个条件开始通过example.or(Criteria);来进行or连接
- sql代码:
select uid, username, userpwd, date, usertype from t_userlogin WHERE ( username = ? ) or( userpwd = ? ) or( usertype = ? )
- 查询结果截图
2、第二种or查询
example.or().andUsernameEqualTo(user.getUsername());
example.or().andUserpwdEqualTo(user.getUserpwd());
example.or().andUsertypeEqualTo(user.getUsertype());
- example.or()后面直接跟上参数即可。
- sql代码跟上面一模一样
- 截图也是一样
4、and,or复合查询
user.setUsername("admin");
user.setUserpwd("123");
user.setUsertype(1);
UserExample example = new UserExample();
UserExample.Criteria criteria1 = example.createCriteria();
UserExample.Criteria criteria2 = example.createCriteria();
criteria1.andUsernameEqualTo(user.getUsername());
criteria1.andUserpwdEqualTo(user.getUserpwd());
criteria2.andUsernameEqualTo("1002");
criteria2.andUserpwdEqualTo("123");
example.or(criteria2);
List<User> users = userMapper.selectByExample(example);
System.out.println(users);
System.out.println(users.size());
结果:
- sql代码:
select uid, username, userpwd, date, usertype from t_userlogin WHERE ( username = ? and userpwd = ? ) or( username = ? and userpwd = ? )
- 执行结果
总结分析: - 同一个Criteria之间就是and,不同的Criteria之间就是or。
- and之间通过andUsernameEqualTo直接连接
- or通过example.or(Criteria)进行连接。配合使用就是or和and的复合使用
5、模糊查询
UserExample example = new UserExample();
UserExample.Criteria criteria = example.createCriteria();
String sql = "ad";
criteria.andUsernameLike("%"+sql+"%");
List<User> users = userMapper.selectByExample(example);
System.out.println(users);
System.out.println(users.size());
结果:
- sql代码:
select uid, username, userpwd, date, usertype from t_userlogin WHERE ( username like ? )
- 执行结果
总结: - 使用criteria.andUsernameLike("%"+sql+"%");进行模糊查询
- sql是模糊查询的条件
四、关于MyBatis-Generator需要注意的地方
1、如果使用1.3.7版本之前的mybatis-generator。每次新增一个数据库表和对应的实体类。如果之前的没有取消,则会再次生成文件并追加在后面。
比如:一开始已经生成了UserMapper.xml文件
内容是abc。
如果再次编译,这个文件就变成了了abcabc直接在后面追加了
因此使用1.3.7版本以后的逆向工具并且设置属性
mybatis-generator官方给出的解决方法如下:
https://github.com/mybatis/generator/pull/311
2、再次运行插件会覆盖上一次的xml文件数据,可以采用备份的方式。