在一般应用mybatis框架时,一般先手动创建数据库表对应的bean,然后手动创建DAO接口,然后手动写mapper文件,最后在应用中调用mapper接口。本篇博客中介绍如何自动创建bean、DAO、mapper文件,以上三种不用手动创建,只需要自动生成,然后在应用中直接调用即可,这就是Mybatis的逆向工程(MyBatis Generator,简称MBG)。MBG是一个专门为MyBatis框架使用者定制的代码生成器,可以快速的根据表生成对应的映射文件,接口,以及bean类。支持基本的增删改查,以及QBC风格的条件查询。但是表连接、存储过程等这些复杂sql的定义需要我们手工编写。
下面以创建一个java工程,操作mysql的PERSON数据库表为例。PERSON库表如下:
在演示mybatis的逆向工程之前除了导入mybatis的jar包,mysql的jar包,还要导入自动生成bean、dao、mapper的逆向工程jar包(该jar包下载位置)。
步骤
一、创建工程结构
在工程src目录下创建放bean的空包com.lzj.mybaits.bean
;在src目录下创建放DAO接口的包com.lzj.mybatis.dao
;在src目录下创建放mapper文件的包conf.mapper
。
二、在src目录下创建mybatis的配置文件
conf.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<!-- 配置数据源 -->
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/lzj_database" />
<property name="username" value="root" />
<property name="password" value="lzjlzj" />
</dataSource>
</environment>
</environments>
<!-- 指定sql的映射文件,如果有多个,都可以加进来 -->
<mappers>
<mapper resource="conf/mapper/PersonMapper.xml"/>
</mappers>
</configuration>
三、在工程目录下创建MBG的配置文件,用于自动生成代码
配置文件自定义命名为mbg.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>
<!--
targetRuntime="MyBatis3Simple":生成简单版的CRUD
MyBatis3:复杂版CURD
-->
<context id="DB2Tables" targetRuntime="MyBatis3">
<!-- jdbcConnection:指定如何连接到目标数据库 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/lzj_database"
userId="root"
password="lzjlzj">
</jdbcConnection>
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- javaModelGenerator:指定javaBean的生成策略
targetPackage="test.model":目标包名
targetProject="\MBGTestProject\src":目标工程
-->
<javaModelGenerator targetPackage="com.lzj.mybaits.bean"
targetProject=".\src">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- sqlMapGenerator:sql映射生成策略: -->
<sqlMapGenerator targetPackage="mapper"
targetProject=".\conf">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- javaClientGenerator:指定mapper接口所在的位置 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.lzj.mybatis.dao"
targetProject=".\src">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!-- 指定要逆向分析哪些表:根据表要创建javaBean -->
<table tableName="person" domainObjectName="Person"></table>
</context>
</generatorConfiguration>
四、创建生成代码的方法
public static void testMbg() throws Exception {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
File configFile = new File("mbg.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);
}
运行该方法,生成了bean、DAO、mapper代码,com.lzj.mybaits.bean
、com.lzj.mybatis.dao
和 conf.mapper
包下分别有了内容
其中MybaitsTest为测试类,放生成代码的方法和测试方法。
测试:
从上面4步已经生成了需要的bean、DAO、mapper,下面进行测试
测试1:通过主键查询一条记录
public static void testInsertPerson(){
String resource = "conf.xml";
InputStream in = MybaitsTest.class.getClassLoader().getResourceAsStream(resource);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
SqlSession session = factory.openSession();
PersonMapper personDao = session.getMapper(PersonMapper.class);
Person person = personDao.selectByPrimaryKey(1);
System.out.println("person : " + person);
}
运行该测试方法,输出结果如下(在生成的Person bean中手动加了toString方法):
person : Person [id=1, name=lzj, phoneBrand=iphone]
测试二:模糊查询
查询name中含有”z”字母,或者主键id大于2的记录
public static void testInsertPerson2(){
String resource = "conf.xml";
InputStream in = MybaitsTest.class.getClassLoader().getResourceAsStream(resource);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
SqlSession session = factory.openSession();
PersonMapper personDao = session.getMapper(PersonMapper.class);
PersonExample example = new PersonExample();
Criteria criteria1 = example.createCriteria();
criteria1.andNameLike("%z%");
Criteria criteria2 = example.createCriteria();
criteria2.andIdGreaterThan(2);
example.or(criteria2);
List<Person> persons = personDao.selectByExample(example);
System.out.println("persons : " + persons);
}
运行该测试方法,输出内容如下:
persons : [Person [id=1, name=lzj, phoneBrand=iphone], Person [id=3, name=Jerry, phoneBrand=Xxiaomi], Person [id=4, name=Bob, phoneBrand=iphone]]