在一般应用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
<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>
<mappers>
<mapper resource="conf/mapper/PersonMapper.xml"/>
mappers>
configuration>
三、在工程目录下创建MBG的配置文件,用于自动生成代码
配置文件自定义命名为mbg.xml:
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3">
<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 targetPackage="com.lzj.mybaits.bean"
targetProject=".\src">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
javaModelGenerator>
<sqlMapGenerator targetPackage="mapper"
targetProject=".\conf">
<property name="enableSubPackages" value="true" />
sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER" targetPackage="com.lzj.mybatis.dao"
targetProject=".\src">
<property name="enableSubPackages" value="true" />
javaClientGenerator>
<table tableName="person" domainObjectName="Person">table>
context>
generatorConfiguration>
四、创建生成代码的方法
public static void testMbg() throws Exception {
List warnings = new ArrayList();
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 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]]