逆向工程
逆向工程是mybatis官方为我们提供的一个特别方便的技术
所谓有逆向就有正向,什么是正向呢?
我们根据一个数据表 ----> 创建对应的javaBean类 -----> 创建Mapper接口操作数据表 -----> 创建xml
这个过程就是一个正向的操作过程,而逆向就是根据这张数据表,mybatis可以逆向的分析数据表,根据数据表创建对应的javaBean类,以及Mapper接口跟xml文件
即Mybatis Generator,简称MBG,是一个专门为Mybatis框架使用者定制的代码生成器
使用
要使用首先得导包
如果使用maven可以如下导入依赖
<!-- 导入mybatis generator相关依赖 --> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.7</version> </dependency>
配置
接下来就是书写配置文件了
编写配置文件需要以下几个属性:
- jdbcConnection:这个属性是配置要连接的数据库的相关属性的,有username、password、url、classDriver
-
javaModelGenerator:指定实体类的生成策略,位置信息等
-
sqlMapGenerator:定义sql映射文件的生成规则,位置信息等
-
javaClientGenerator:定义Mapper接口生成策略
-
table:定义要逆向分析的表,以及生成的实体类名
配置文件的编写如下
<?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> <context id="DB2Tables" targetRuntime="MyBatis3"> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/mybatis" userId="root" password="123"> </jdbcConnection> <javaTypeResolver > <!-- forceBigDecimals:是否强制转换BigDecimal --> <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <javaModelGenerator targetPackage="main.java.com.jx.mbg.bean" targetProject=".\src"> <property name="enableSubPackages" value="true" /> <property name="trimStrings" value="true" /> </javaModelGenerator> <sqlMapGenerator targetPackage="main.resources.mybatis" targetProject=".\src"> <property name="enableSubPackages" value="true" /> </sqlMapGenerator> <javaClientGenerator type="XMLMAPPER" targetPackage="main.java.com.jx.mbg.mapper" targetProject=".\src"> <property name="enableSubPackages" value="true" /> </javaClientGenerator> <table tableName="tb1_dept" domainObjectName="Department"></table> <table tableName="tb1_employee" domainObjectName="Employee"></table> </context> </generatorConfiguration>
下面对配置文件中出现的一些标签进行解释
context: 指定mybatis的代码生成器的环境
id:必须属性,给这个context一个唯一标识
targetRuntime:此属性用于指定生成代码的运行时目标, MyBatis3Simple:生成简单的CRUD(不带有if这些动态标签)。 MyBatis3:可以生成带动态where标签的CRUD
jdbcConnection:指定如何连接到目标数据库
driverClass: 指定数据库驱动,com.mysql.jdbc.Driver
connectionURL:数据库连接地址,即jdbc:mysql://localhost:3306/database
uerId:数据库用户名
password:数据库密码
javaTypeResolver:使用什么样的java类型解析器
例:
<javaTypeResolver > <!-- forceBigDecimals:是否强制转换BigDecimal --> <property name="forceBigDecimals" value="false" /> </javaTypeResolver>
javaModelGenerator:指定javaBean的生形成策略
targetPackage:目标的包名,即javaBean生成的表名
targetProject:目标工程, .\src:当前工程的src下
sqlMapGenerator:sql映射生成策略
targetPackage:映射文件的生成目录
targetProject:目标工程, .\conf:当前工程的config下
javaClientGenerator:指定Mapper接口所在位置
targetPackage:接口生成的包名
targetProject:目标工程, .\src:当前工程的src下
table:指定要逆向分析哪些表,根据表创建javaBean
tableName:指定要分析表的名字
domainObjectName:指定要生成对象的名字
例:
<table tableName="tb1_dept" domainObjectName="Department"></table> <table tableName="tb1_emp" domainObjectName="Employee"></table>
运行
在写好配置文件后,就可以将MBG跑起来逆向生成了
执行下面的代码即可:
@Test public void test() throws Exception { List<String> warnings = new ArrayList<String>(); boolean overwrite = true; File configFile = new File("generatorConfig.xml"); // 书写配置文件的位置 ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = cp.parseConfiguration(configFile); DefaultShellCallback callback = new DefaultShellCallback(overwrite); MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); myBatisGenerator.generate(null); }
使用复杂类型查询
我们在书写配置文件的时候会给context的targetRuntime设置值,这个属性表示我们要生成怎样的查询语句,使用MyBatis3Simple只会生成简单的CRUD,但是如果使用MyBatis3则会生成复杂的带动态标签的CRUD,使用MyBatis3生成bean时还会生成对应的Example类
这种Example类是用于封装查询条件的
例如:
现在要查询员工中名字有e字母的,和员工性别是1的数据
@Test public void test2() throws IOException { String configPath = "mybatis/mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(configPath); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession session = sqlSessionFactory.openSession(true); try { EmployeeMapper mapper = session.getMapper(EmployeeMapper.class); // 查询员工中名字有e字母的,和员工性别是1的 // 封装查询条件的example EmployeeExample employeeExample = new EmployeeExample(); // 创建Creteria, 这个Criteria就是瓶装查询条件的 EmployeeExample.Criteria criteria = employeeExample.createCriteria(); criteria.andLastNameLike("%e%"); criteria.andGenderEqualTo("1"); List<Employee> employees = mapper.selectByExample(employeeExample); employees.forEach((e) -> System.out.printf("%d %s %s,", e.getdId(), e.getGender(), e.getLastName())); } finally { session.close(); } }
现在有一个问题,如果在SQL查询中想要表达或的关系应该怎样做?
例如:现在要查询员工中名字有e字母的,和员工性别是1的,或者是email中带有1的
在表达或的时候,并不能使用criteria.orxxx(),如果要表达或的关系,应该再创建一个criteria,然后用example.or()将新创建的criteria或进去即可
@Test public void test2() throws IOException { String configPath = "mybatis/mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(configPath); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession session = sqlSessionFactory.openSession(true); try { EmployeeMapper mapper = session.getMapper(EmployeeMapper.class); // 查询员工中名字有e字母的,和员工性别是1的 // 封装查询条件的example EmployeeExample employeeExample = new EmployeeExample(); // 创建Creteria, 这个Criteria就是瓶装查询条件的 EmployeeExample.Criteria criteria = employeeExample.createCriteria(); criteria.andLastNameLike("%e%"); criteria.andGenderEqualTo("1"); // 如果想要表达或的关系,可以使用两个Criteria,两个Criteria之间就是或的关系 EmployeeExample.Criteria criteria1 = employeeExample.createCriteria(); criteria1.andEmailLike("%1%"); employeeExample.or(criteria1); // 将新创建的criteria1或进去即可 List<Employee> employees = mapper.selectByExample(employeeExample); employees.forEach((e) -> System.out.printf("%d %s %s,", e.getdId(), e.getGender(), e.getLastName())); } finally { session.close(); } }