一、Mybatis逆向工程简介
我们在使用Mybatis框架时一般都是先创建数据库表然后创建POJO对象,然后导入Mybatis依赖包,再创建Mybatis全局配置文件,再创建Mapper映射文件和接口。而Mybatis逆向工程就实现了根据表生成相应的映射文件,接口以及POJO;
二、准备工作
1.导入依赖包
2.创建逆向工程配置文件
代码示例如下:
<!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="simple" targetRuntime="MyBatis3Simple">
<jdbcConnection driverClass="org.hsqldb.jdbcDriver"
connectionURL="jdbc:hsqldb:mem:aname" />
<javaModelGenerator targetPackage="example.model" targetProject="src/main/java"/>
<sqlMapGenerator targetPackage="example.mapper" targetProject="src/main/resources"/>
<javaClientGenerator type="XMLMAPPER" targetPackage="example.mapper" targetProject="src/main/java"/>
<table tableName="FooTable" />
</context>
</generatorConfiguration>
三、运行
代码示例如下:
@Test
public void test() {
try {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
File configFile = new File("mbg-conf.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);
} catch (Exception e) {
e.printStackTrace();
}
}
代码运行后将会根据配置文件中的策略来生成业务逻辑模型、mapper映射文件、mapper接口
四、逆向工程配置文件解析:
1.properties标签
该标签用来引入外部配置信息,如数据库连接信息,当配置完成后可以使用${}方式来获取properties文件中的信息,示例如下:
<!-- resource:配置资源加载地址,使用resource,MBG从classpath开始找,比如com/myproject/generatorConfig.propertie
url:配置资源加载地质,使用URL的方式,比如file:///C:/myfolder/generatorConfig.properties.-->
<properties resource="jdbc.properties"/>
2.context标签
该标签用来配置整个逆向工程的生成策略信息,示例如下:
<!-- 配置逆向工程 -->
<context id="simple" targetRuntime="MyBatis3Simple">
<!-- 配置连接属性 -->
<jdbcConnection driverClass="${mysql.driver}"
connectionURL="${mysql.url}"
userId="${mysql.username}"
password="${mysql.password}" />
<!-- 配置业务逻辑模型创建的位置
targetProject:指定项目,后接源码包;
targetPackage: 指定当源码包下的哪一个Javapackage
-->
<javaModelGenerator targetPackage="com.lazy.bean" targetProject="./src">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- 配置sql映射文件 -->
<sqlMapGenerator targetPackage="com.lazy.mapper" targetProject="./conf">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- javaClientGenerator:指定mapper接口所在的位置 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.lazy.mapper" targetProject="./src"/>
<!-- 配置数据库表:对应的JavaBean -->
<table tableName="employee" domainObjectName="Employee" />
</context>
其中必须的两个属性为,id属性用来表示该标签,targetRuntime用来指明使用何种方式进行逆向生成,比如有简单生成MyBatis3Simple,也有高级生成MyBatis3;
3.javaModelGenerator标签
该标签用来指定java数据模型的生成策略,
targetProject用来指定生成在项目中的哪个文件夹,targetPackage用来指定哪一个Java的package下;
4.sqlMapGenerator标签
用来指定javaMapper映射文件生成策略;
5.javaClientGenerator标签
用来指定与Mapper映射文件对应的Mapper接口的生成策略;
type属性:
选择怎么生成mapper接口(在MyBatis3/MyBatis3Simple下):
1,ANNOTATEDMAPPER:会生成使用Mapper接口+Annotation的方式创建(SQL生成在annotation中),不会生成对应的XML;
2,MIXEDMAPPER:使用混合配置,会生成Mapper接口,并适当添加合适的Annotation,但是XML会生成在XML中;
3,XMLMAPPER:会生成Mapper接口,接口完全依赖XML;
注意,如果context是MyBatis3Simple:只支持ANNOTATEDMAPPER和XMLMAPPER
五、java逆向工程中使用Mybatis生成后的QBC风格查询操作
1.使用Mybatis3方式来生成
<!-- 配置逆向工程 -->
<context id="simple" targetRuntime="MyBatis3">
2.操作代码
@Test
public void testQBC(){
SqlSession sqlSession = null;
try {
String resource = "mybatis-conf.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
sqlSession = factory.openSession();
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
<!-- 指定连接条件 -->
EmployeeExample employeeExample = new EmployeeExample();
EmployeeExample.Criteria criteria = employeeExample.createCriteria();
<!-- 指定and条件 -->
criteria.andIdBetween(1, 4);
List<Employee> employees = mapper.selectByExample(employeeExample);
for (Employee employee : employees) {
System.out.println(employee.getId());
}
} catch (IOException e) {
e.printStackTrace();
} finally {
sqlSession.close();
}
}
yee.getId());
}
} catch (IOException e) {
e.printStackTrace();
} finally {
sqlSession.close();
}
}