文章目录
- 1、简介
- 2、创建逆向工程的步骤
1、简介
MBG :MyBatis Generator
MyBatis逆向工程指的是根据一张sql表单,借助Maven和MBG直接创建pojo、mapper接口(xxxMapper)、映射文件(xxxMapper.xml)。就不需要我们自己一个一个创建文件去配置啦~
2、创建逆向工程的步骤
准备工作:SQL表单
示例:t_dept和t_emp
(1)添加依赖和插件
在pom.xml中添加依赖和插件,更新maven
<?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_MBG</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<!-- 依赖MyBatis核心包 -->
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- junit测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.3</version>
</dependency>
<!-- log4j日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
<!-- 控制Maven在构建过程中相关配置 -->
<build>
<!-- 构建过程中用到的插件 -->
<plugins>
<!-- 具体插件,逆向工程的操作是以构建过程中插件形式出现的 -->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.0</version>
<!-- 插件的依赖 -->
<dependencies>
<!-- 逆向工程的核心依赖 -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.2</version>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.8</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
(2)创建MyBatis的核心配置文件
在src/main/resources下创建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="jdbc.properties"></properties>
<!--设置连接数据库的环境-->
<environments default="development">
<environment id="development">
<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>
</configuration>
创建jdbc.properties文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8
jdbc.username=root
jdbc.password=写你的数据库密码
创建log4j.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jakarta.apache.org/log4j/ ">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS}
%m (%F:%L) \n"/>
</layout>
</appender>
<logger name="java.sql">
<level value="debug"/>
</logger>
<logger name="org.apache.ibatis">
<level value="info"/>
</logger>
<root>
<level value="debug"/>
<appender-ref ref="STDOUT"/>
</root>
</log4j:configuration>
(3)创建逆向工程的配置文件
文件名必须是:generatorConfig.xml
⭕️ "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"
这条报红不用管。
⭕️ 注意:mac环境下,\要修改为/,windows才是targetProject="./src/main/java
<?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>
<!--
targetRuntime: 执行生成的逆向工程的版本
MyBatis3Simple: 生成基本的CRUD(清新简洁版)
MyBatis3: 生成带条件的CRUD(奢华尊享版)
-->
<context id="DB2Tables" targetRuntime="MyBatis3Simple"> <!-- 数据库的连接信息 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mybatis"
userId="root"
password="这里改成你自己的数据库密码">
</jdbcConnection>
<!-- javaBean的生成策略-->
<javaModelGenerator targetPackage="com.atguigu.mybatis.pojo"
targetProject=".\src\main\java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- SQL映射文件的生成策略 -->
<sqlMapGenerator targetPackage="com.atguigu.mybatis.mapper"
targetProject=".\src\main\resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- Mapper接口的生成策略 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.atguigu.mybatis.mapper" targetProject=".\src\main\java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 逆向分析的表 -->
<!-- tableName设置为*号,可以对应所有表,此时不写domainObjectName --> <!-- domainObjectName属性指定生成出来的实体类的类名 -->
<table tableName="t_emp" domainObjectName="Emp"/>
<table tableName="t_dept" domainObjectName="Dept"/>
</context>
</generatorConfiguration>
(4)执行MBG插件的generate目标
步骤:
操作前的文件目录:
操作后的文件目录:
pojo中自动生成属性和get/set方法
Mapper接口中自动生成基础增删改查功能
此时逆向工程的配置文件generatorConfig.xml
中:targetRuntime=“MyBatis3Simple"
public interface EmpMapper {
int deleteByPrimaryKey(Integer eid);
int insert(Emp record);
Emp selectByPrimaryKey(Integer eid);
List<Emp> selectAll();
int updateByPrimaryKey(Emp record);
}
Mapper映射文件中自动生成相对应方法的配置信息
自动生成的内容如下:
<?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.atguigu.mybatis.mapper.EmpMapper" >
<resultMap id="BaseResultMap" type="com.atguigu.mybatis.pojo.Emp" >
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
This element was generated on Wed Mar 02 16:05:18 CST 2022.
-->
<id column="eid" property="eid" jdbcType="INTEGER" />
<result column="emp_name" property="empName" jdbcType="VARCHAR" />
<result column="age" property="age" jdbcType="INTEGER" />
<result column="sex" property="sex" jdbcType="CHAR" />
<result column="email" property="email" jdbcType="VARCHAR" />
<result column="did" property="did" jdbcType="INTEGER" />
</resultMap>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
This element was generated on Wed Mar 02 16:05:18 CST 2022.
-->
delete from t_emp
where eid = #{eid,jdbcType=INTEGER}
</delete>
<insert id="insert" parameterType="com.atguigu.mybatis.pojo.Emp" >
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
This element was generated on Wed Mar 02 16:05:18 CST 2022.
-->
insert into t_emp (eid, emp_name, age,
sex, email, did)
values (#{eid,jdbcType=INTEGER}, #{empName,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER},
#{sex,jdbcType=CHAR}, #{email,jdbcType=VARCHAR}, #{did,jdbcType=INTEGER})
</insert>
<update id="updateByPrimaryKey" parameterType="com.atguigu.mybatis.pojo.Emp" >
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
This element was generated on Wed Mar 02 16:05:18 CST 2022.
-->
update t_emp
set emp_name = #{empName,jdbcType=VARCHAR},
age = #{age,jdbcType=INTEGER},
sex = #{sex,jdbcType=CHAR},
email = #{email,jdbcType=VARCHAR},
did = #{did,jdbcType=INTEGER}
where eid = #{eid,jdbcType=INTEGER}
</update>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
This element was generated on Wed Mar 02 16:05:18 CST 2022.
-->
select eid, emp_name, age, sex, email, did
from t_emp
where eid = #{eid,jdbcType=INTEGER}
</select>
<select id="selectAll" resultMap="BaseResultMap" >
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
This element was generated on Wed Mar 02 16:05:18 CST 2022.
-->
select eid, emp_name, age, sex, email, did
from t_emp
</select>
</mapper>
(5)更常用:更改参数为MyBatis3: 生成带条件的CRUD
自动生成的Mapper接口中的方法
public interface EmpMapper {
// 根据条件计数
int countByExample(EmpExample example);
//根据条件删除
int deleteByExample(EmpExample example);
//根据主键删除
int deleteByPrimaryKey(Integer eid);
//普通插入
int insert(Emp record);
//选择性插入:没写的就是null
int insertSelective(Emp record);
//根据条件查询
List<Emp> selectByExample(EmpExample example);
//根据主键查询
Emp selectByPrimaryKey(Integer eid);
//根据条件选择性修改:
int updateByExampleSelective(@Param("record") Emp record, @Param("example") EmpExample example);
//根据条件修改
int updateByExample(@Param("record") Emp record, @Param("example") EmpExample example);
//根据主键选择性修改
int updateByPrimaryKeySelective(Emp record);
//根据主键修改
int updateByPrimaryKey(Emp record);
}
测试方法自动生成的Mapper接口中的方法:查询
如果报错Cannot find class: com.mysql.jdbc.Driver
测试
给Emp和Dept 的pojo重写toString(),再加一个空参构造器、一个有参构造器,然后就可以开始测试了。
测试代码汇总:
@Test
public void test(){
try {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = sqlSessionFactory.openSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
//查询所有数据
System.out.println("\n--------->查询所有数据");
List<Emp> emps = mapper.selectByExample(null); // 没有查询条件就相当于查询所有数据
emps.forEach(emp -> System.out.println(emp));
//根据条件查询 QBC: Query by Criteria
EmpExample example = new EmpExample();
//名字叫Bela的
System.out.println("\n--------->根据条件查询");
example.createCriteria().andEmpNameEqualTo("Bela");
List<Emp> emps1 = mapper.selectByExample(example);
emps1.forEach(emp -> System.out.println(emp));
//链式添加条件
System.out.println("\n--------->链式添加条件");
example.createCriteria().andEmpNameEqualTo("Bela").andAgeEqualTo(33);
List<Emp> emps2 = mapper.selectByExample(example);
emps2.forEach(emp -> System.out.println(emp));
//两个条件用or连接
System.out.println("\n--------->两个条件用or连接");
example.createCriteria().andAgeLessThan(30);
example.or().andDidIsNotNull();
List<Emp> emps3 = mapper.selectByExample(example);
emps3.forEach(emp -> System.out.println(emp));
} catch (IOException e) {
e.printStackTrace();
}
}
查询所有数据
根据条件查询
链式添加条件
两个条件用or连接
测试方法自动生成的Mapper接口中的方法:修改
@Test
public void test2(){
try {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = sqlSessionFactory.openSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
// 原始id=2的数据
System.out.println("原始id=1的数据"+mapper.selectByPrimaryKey(2));
// 根据主键修改
mapper.updateByPrimaryKey(new Emp(2,"改1",55,"男","6789@gamil.com",null));
System.out.println("\n-----> 根据主键修改----->" + mapper.selectByPrimaryKey(1));
// 根据主键选择性修改
mapper.updateByPrimaryKeySelective(new Emp(2,"改2",55,null,"6789@gamil.com",null));
System.out.println("\n-----> 根据主键选择性修改----->" + mapper.selectByPrimaryKey(1));
} catch (IOException e) {
e.printStackTrace();
}
}