Mybatis—逆向工程
一、概念
起初我们是根据数据库建表来对应的编写我们的实体类bean,类的属性要和数据库表一一对应。
现在我们可以使用逆向工程来根据数据库表自动的生成我们的实体类bean。除此之外,逆向工程还能生成Dao层接口的基本的增删改查方法,并且生成Mapper接口代理中的基本增删改查方法的SQL实现。
原来这些功能需要我们手动编写,现在可以使用逆向工程帮我们自动生成,不过逆向工程只能生成简单的增删改查操作,许多复杂的sql语句仍然需要我们根据业务逻辑手动编写。
二、使用
1、导入pom依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>mybatis_0625</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
</dependencies>
</project>
2、数据库连接、日志、Mybatis全局配置文件
db.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/demo?serverTimezone=UTC
jdbc.username=root
jdbc.password=123456
log4j.properties
# 全局日志配置
log4j.rootLogger=ERROR, stdout
# MyBatis 日志配置
log4j.logger.com.mjt=TRACE
# 控制台输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
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">
<!--在填写标签的时候,一定要注意标签的位置-->
<configuration>
<properties resource="db.properties"></properties>
<environments default="development">
<!--environment:对当前环境进行配置-->
<environment id="development">
<transactionManager type="JDBC"/>
<!--使用数据库连接池,一般只配置4个,其实还可以配置很多,用到时官网去查-->
<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>
</configuration>
3、在项目目录下创建mybatis-generator.xml
从mybatis官网复制粘贴并根据自己项目架构修改配置
mybatis-generator.xml
<!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="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/demo?serverTimezone=UTC"
userId="root"
password="123456"
/>
<!--生成对应的实体类
targetPackage:指定存放的路径
targetProject:指定当前工程的目录
-->
<javaModelGenerator targetPackage="com.mjt.bean" targetProject="src/main/java"/>
<!--生成Dao对应的Mapper代理映射文件-->
<sqlMapGenerator targetPackage="com.mjt.dao" targetProject="src/main/resources"/>
<!--生成对应的DAO接口-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.mjt.dao" targetProject="src/main/java"/>
<!--指定需要反向生成的表-->
<table tableName="emp" />
<table tableName="dept" />
</context>
</generatorConfiguration>
4、启动逆向工程
从官网粘贴的代码,只要对照自己项目修改即可
package com.mjt;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
class MyTest {
public static void main(String[] args) throws Exception {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
File configFile = new File("mybatis-generate.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);
}
}
5、生成的sql实现
EmpMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mjt.dao.EmpMapper">
<resultMap id="BaseResultMap" type="com.mjt.bean.Emp">
<!--
WARNING - @mbg.generated
This element is automatically generated by MyBatis Generator, do not modify.
This element was generated on Sun Jun 28 12:46:14 CST 2020.
-->
<id column="EMPNO" jdbcType="INTEGER" property="empno" />
<result column="ENAME" jdbcType="VARCHAR" property="ename" />
<result column="JOB" jdbcType="VARCHAR" property="job" />
<result column="MGR" jdbcType="INTEGER" property="mgr" />
<result column="HIREDATE" jdbcType="DATE" property="hiredate" />
<result column="SAL" jdbcType="DOUBLE" property="sal" />
<result column="COMM" jdbcType="DOUBLE" property="comm" />
<result column="DEPTNO" jdbcType="INTEGER" property="deptno" />
</resultMap>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
<!--
WARNING - @mbg.generated
This element is automatically generated by MyBatis Generator, do not modify.
This element was generated on Sun Jun 28 12:46:14 CST 2020.
-->
delete from emp
where EMPNO = #{empno,jdbcType=INTEGER}
</delete>
<insert id="insert" parameterType="com.mjt.bean.Emp">
<!--
WARNING - @mbg.generated
This element is automatically generated by MyBatis Generator, do not modify.
This element was generated on Sun Jun 28 12:46:14 CST 2020.
-->
insert into emp (EMPNO, ENAME, JOB,
MGR, HIREDATE, SAL, COMM,
DEPTNO)
values (#{empno,jdbcType=INTEGER}, #{ename,jdbcType=VARCHAR}, #{job,jdbcType=VARCHAR},
#{mgr,jdbcType=INTEGER}, #{hiredate,jdbcType=DATE}, #{sal,jdbcType=DOUBLE}, #{comm,jdbcType=DOUBLE},
#{deptno,jdbcType=INTEGER})
</insert>
<update id="updateByPrimaryKey" parameterType="com.mjt.bean.Emp">
<!--
WARNING - @mbg.generated
This element is automatically generated by MyBatis Generator, do not modify.
This element was generated on Sun Jun 28 12:46:14 CST 2020.
-->
update emp
set ENAME = #{ename,jdbcType=VARCHAR},
JOB = #{job,jdbcType=VARCHAR},
MGR = #{mgr,jdbcType=INTEGER},
HIREDATE = #{hiredate,jdbcType=DATE},
SAL = #{sal,jdbcType=DOUBLE},
COMM = #{comm,jdbcType=DOUBLE},
DEPTNO = #{deptno,jdbcType=INTEGER}
where EMPNO = #{empno,jdbcType=INTEGER}
</update>
<select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
<!--
WARNING - @mbg.generated
This element is automatically generated by MyBatis Generator, do not modify.
This element was generated on Sun Jun 28 12:46:14 CST 2020.
-->
select EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO
from emp
where EMPNO = #{empno,jdbcType=INTEGER}
</select>
<select id="selectAll" resultMap="BaseResultMap">
<!--
WARNING - @mbg.generated
This element is automatically generated by MyBatis Generator, do not modify.
This element was generated on Sun Jun 28 12:46:14 CST 2020.
-->
select EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO
from emp
</select>
</mapper>
DeptMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mjt.dao.DeptMapper">
<resultMap id="BaseResultMap" type="com.mjt.bean.Dept">
<!--
WARNING - @mbg.generated
This element is automatically generated by MyBatis Generator, do not modify.
This element was generated on Sun Jun 28 12:46:14 CST 2020.
-->
<id column="DEPTNO" jdbcType="INTEGER" property="deptno" />
<result column="DNAME" jdbcType="VARCHAR" property="dname" />
<result column="LOC" jdbcType="VARCHAR" property="loc" />
</resultMap>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
<!--
WARNING - @mbg.generated
This element is automatically generated by MyBatis Generator, do not modify.
This element was generated on Sun Jun 28 12:46:14 CST 2020.
-->
delete from dept
where DEPTNO = #{deptno,jdbcType=INTEGER}
</delete>
<insert id="insert" parameterType="com.mjt.bean.Dept">
<!--
WARNING - @mbg.generated
This element is automatically generated by MyBatis Generator, do not modify.
This element was generated on Sun Jun 28 12:46:14 CST 2020.
-->
insert into dept (DEPTNO, DNAME, LOC
)
values (#{deptno,jdbcType=INTEGER}, #{dname,jdbcType=VARCHAR}, #{loc,jdbcType=VARCHAR}
)
</insert>
<update id="updateByPrimaryKey" parameterType="com.mjt.bean.Dept">
<!--
WARNING - @mbg.generated
This element is automatically generated by MyBatis Generator, do not modify.
This element was generated on Sun Jun 28 12:46:14 CST 2020.
-->
update dept
set DNAME = #{dname,jdbcType=VARCHAR},
LOC = #{loc,jdbcType=VARCHAR}
where DEPTNO = #{deptno,jdbcType=INTEGER}
</update>
<select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
<!--
WARNING - @mbg.generated
This element is automatically generated by MyBatis Generator, do not modify.
This element was generated on Sun Jun 28 12:46:14 CST 2020.
-->
select DEPTNO, DNAME, LOC
from dept
where DEPTNO = #{deptno,jdbcType=INTEGER}
</select>
<select id="selectAll" resultMap="BaseResultMap">
<!--
WARNING - @mbg.generated
This element is automatically generated by MyBatis Generator, do not modify.
This element was generated on Sun Jun 28 12:46:14 CST 2020.
-->
select DEPTNO, DNAME, LOC
from dept
</select>
</mapper>
可以发现逆向工程知识简单的根据数据库表生成了对应的实体类,生成了Dao接口,以及Mapper代理。在Mapper代理中实现了简单的增删改查功能。
后续的复杂的增删改查逻辑,仍然需要自己手动编写SQL语句。
三、总结
到此为止,我们的SSM的基础入门已经结束了,我们可以发现使用SSM进行开发的时候,需要配置的东西实在是太多了,所以现在开发中更常用的还是Spring Boot——约定大于配置。
我们将在下个专栏学习Spring Boot的基本使用。
最后送你也送我,送所有做技术的可爱的人一句话:热爱可抵岁月漫长。