MyBatis的逆向工程
一.MyBatis逆向工程概述
MyBatis是目前很流行的持久层框架,很多企业都在采用。但是其复杂繁琐的配置,重复性的实体类创建等等,消耗了程序员大量的精力,同时有些地方如果一个细小的疏忽,可能导致最终功能运行失败。例如:在几十个字段的表中,某一列的列名配置疏忽。基于此,mybatis 推出了一套 jar 包,可以依据我们设计好的数据库表,自动生成 pojo、mapper 以及mapper.xml。有了逆向工程,便大大缩减了我们的开发时间。
官网:http://www.mybatis.org/generator/index.html
二.使用逆向工程
1.第一步:创建maven工程并导入依赖
<!-- 导入依赖坐标 -->
<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
</dependencies>
2.第二步:编写连接数据库的配置(jdbc.properties)
# mysql驱动jar包的磁盘绝对路劲
jdbc.path=G:\\repository\\mysql\\mysql-connector-java\\5.1.6\\mysql-connector-java-5.1.6.jar
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/shdb
jdbc.username=sh
jdbc.password=sh123
3.第三步:编写配置文件(mybatis-generator-config.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>
<!-- 1.导入属性配置 -->
<properties resource="jdbc.properties"></properties>
<!-- 2.指定特定数据库的jdbc驱动jar包的位置 -->
<classPathEntry location="${jdbc.path}"/>
<!-- 3.全局配置 -->
<context id="context" targetRuntime="MyBatis3">
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<commentGenerator>
<property name="suppressAllComments" value="false"/>
<property name="suppressDate" value="true"/>
</commentGenerator>
<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="${jdbc.driver}"
connectionURL="${jdbc.url}"
userId="${jdbc.username}"
password="${jdbc.password}"/>
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 配置生成文件的保存位置:★★★★★★★★★★★★★★★ -->
<!--指定包名生成实体类 以及生成的地址 (可以自定义地址,如果路径不存在会自动创建) -->
<javaModelGenerator targetPackage="cn.dintalk.domain.system"
targetProject="G:\dintalk\project\generator\src\main\java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false"/>
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!--Mapper映射文件生成所在的目录 为每一个数据库的表生成对应的mapper文件 -->
<sqlMapGenerator targetPackage="cn.dintalk.dao.system"
targetProject="G:\dintalk\project\generator\src\main\resources">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
<!-- 客户端代码,生成易于使用的针对Model对象和XML配置文件 的代码
type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象
type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象
type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口
-->
<javaClientGenerator targetPackage="cn.dintalk.dao.system"
targetProject="G:\dintalk\project\generator\src\main\java" type="XMLMAPPER">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false"/>
</javaClientGenerator>
<!-- 指定数据库表:可同时指定多张表 -->
<table schema="dintalkdb" tableName="dintalktable" domainObjectName="User"
mapperName="UserDao"
enableCountByExample="false" enableDeleteByExample="false"
enableSelectByExample="true" enableUpdateByExample="false"/>
</context>
</generatorConfiguration>
4.第四步:编写运行类生成文件(参见官网)
public class GeneratorSqlMapTest {
// 官网提供的
public void generator() throws Exception{
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
//指定 逆向工程配置文件
InputStream in = GeneratorSqlMapTest.class.getClassLoader()
.getResourceAsStream("mybatis-generator-config.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(in);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,
callback, warnings);
myBatisGenerator.generate(null);
in.close();
}
//运行生成器方法,生成文件
public static void main(String[] args) throws Exception {
try {
GeneratorSqlMapTest generatorSqlmap = new GeneratorSqlMapTest();
generatorSqlmap.generator();
} catch (Exception e) {
e.printStackTrace();
}
}
}
5.第五步:将生产的文件拷贝到项目中即可
Tips: 需要注意的有两点
逆向工程的实体类没有实现序列化接口(Serializable)
生成的实体类查询特例类也没有实现序列化接口(有内部类,特例类和内部类都要实现才行:GeneratedCriteria 和 Criterion 内部类)。
三.主要API简介
逆向工程在生成pojo的同时会生成一个配套的pojoExample类。该类是根据不同的数据库表字段生成的查询特例类。使用示例如下(以Factory实体为例):
//1.测试查询一个:根据主键id
@Test
public void testFindAll(){
Factory factory = factoryDao.selectByPrimaryKey("1");
System.out.println(factory.getFactoryName());
}
/**2.使用特例进行查询
* select * from co_factory
* where 这里的内容是靠criteria对象补全的
* group by having
* order by 这里的内容是靠exmaple对象补全的
*/
@Test
public void testFindByCondition(){
//1.创建例子,进行特例查询
FactoryExample ex = new FactoryExample();
//2.进行查询(传入ex对象),查询所有
List<Factory> factories = factoryDao.selectByExample(ex);
System.out.println(factories.size());
}
//3.使用特例配置条件查询
@Test
public void testFindByCondition1(){
//1.创建例子,进行特例查询
FactoryExample ex = new FactoryExample();
//2.创建例子中的条件对象
FactoryExample.Criteria criteria = ex.createCriteria();
//3.设置查询条件:这里的方法是和对应数据库中的字段名称有关的
criteria.andCtypeEqualTo("货物");
//4.加入排序: clause:从句的意思
ex.setOrderByClause("create_time desc");
//5.进行查询(传入ex对象)
List<Factory> factories = factoryDao.selectByExample(ex);
System.out.println(factories.size());
}
Tips: 若是在实体类中有一对多和多对一的关系存在,则需要相应的修改实体类,并在dao接口中编写相应的方法。在xml文件中使用collection和association标签配置关联查询即可。
赞 (0)