逆向工程
简单的理解,MyBatis逆向工程,就是通过相应插件,自动生成MyBatis数据库连接的一些文件。
mybatis跟Hibernate这样的全自动框架不一样。它需要编写sql语句,因此mybatis官方提供了逆向工程,可以针对单表自动生成mybatis执行所需要的代码(包括mapper.java、带增删改查的mapper.xml、pojo…),提高工作效率。
使用插件
该逆向工程所需的jar包就是org.mybatis.generator。
第一步. 创建maven-archetype-webapp模板工程(创建空的Maven工程也差不多)。修改pom.xml文件,添加依赖(版本根据自己的来也可以):
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
</dependencies>
因为是插件嘛,继续在pom.xml
中的<build>
下面一行回车,插入以下代码(同样文件名版本号可修改):
<!-- mybatis逆向工程插件开始 -->
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<configuration>
<configurationFile>${basedir}/src/main/resources/mybatis-generator.xml</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
<dependencies>
<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>
</plugin>
</plugins>
<!-- mybatis逆向工程插件结束 -->
第二步. resources资源目录添加mybatis-generator.xml
,dbconfig.properties
,mybatis-config.xml
。
mybatis-generator.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>
<properties resource="dbconfig.properties"/>
<context id="Mysql" targetRuntime="MyBatis3" defaultModelType="flat">
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<!--支持序列化-->
<plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>
<!--
<plugin type="${mapper.plugin}">
<property name="mappers" value="${mapper.Mapper}"/>
<property name="forceAnnotation" value="${mapper.forceAnnotation}" />
</plugin>
-->
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<jdbcConnection driverClass="${jdbc.driver}"
connectionURL="${jdbc.url}"
userId="${jdbc.username}"
password="${jdbc.password}">
</jdbcConnection>
<javaModelGenerator targetPackage="${targetModelPackage}" targetProject="${targetJavaProject}">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<sqlMapGenerator
targetPackage="${targetXMLPackage}"
targetProject="${targetResourcesProject}">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<javaClientGenerator
targetPackage="${targetMapperPackage}"
targetProject="${targetJavaProject}"
type="XMLMAPPER">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!--全部表参与逆向工程-->
<!--以下example为false,表示不会生成example类,否则将自动生成example类-->
<table schema="" tableName="%"
enableCountByExample="false"
enableUpdateByExample="false"
enableDeleteByExample="false"
enableSelectByExample="false"
selectByExampleQueryId="false">
</table>
<!--指定某些表参与逆向工程-->
<!--<table tableName="user"-->
<!--enableCountByExample="false"-->
<!--enableUpdateByExample="false"-->
<!--enableDeleteByExample="false"-->
<!--enableSelectByExample="false"-->
<!--selectByExampleQueryId="false">-->
<!--</table>-->
</context>
</generatorConfiguration>
dbconfig.properties
com.yoyling、jdbc连接都要改的啊,数据库是随便的一个,我就拿最近的库来生成并测试。
jdbc.url =jdbc:mysql://localhost:3306/bbs_ssm
jdbc.driver=com.mysql.jdbc.Driver
jdbc.username=root
jdbc.password=root
# 通用Mapper固定配置
mapper.plugin=tk.mybatis.mapper.generator.MapperPlugin
mapper.Mapper=tk.mybatis.mapper.common.Mapper
mapper.forceAnnotation=true
# 生成文件保存位置
#javabean生成位置
targetModelPackage=com.yoyling.domain
#xml映射文件的位置,这里的值是文件夹名字
targetXMLPackage=mapper
# 这里写的是mapper文件夹所在位置,写成src/main/resources
targetResourcesProject=src/main/resources/com/yoyling/
#dao接口存放的包位置
targetMapperPackage=com.yoyling.mapper
#目标工程,写main下的src即可
targetJavaProject=src/main/java
mybatis-config.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">
<!-- mybatis的主配置文件 -->
<configuration>
<properties resource="dbconfig.properties"/>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 -->
<mappers>
<package name="com.yoyling.mapper"/>
</mappers>
</configuration>
第三步. 点击IDEA右边Maven里面的Plugins里面多出来的一个mybatis-generator。
然后你会看到一些神奇的文件就被创建了。分别是src/main/java/com/yoyling/domain/*.java
还有src/main/java/com/yoyling/mapper/*Mapper.java
还有src/main/resources/com/yoyling/mapper.*Mapper.xml
。
第四步. 测试,在src/test/com/yoyling目录创建个AppTest测试类(看你自己数据库有啥测啥)。
package com.yoyling;
import com.yoyling.domain.User;
import com.yoyling.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
public class AppTest {
@Test
public void test() throws IOException {
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSession session = factory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectByPrimaryKey(26);
System.out.println(user.getPassword());
}
}