MyBatis的逆向工程教程

MyBatis逆向工程是指根据数据库表结构自动生成对应的实体类、Mapper接口以及SQL映射文件的过程。这个过程可以通过MyBatis提供的逆向工程工具来完成,极大地方便了开发人员,避免了重复的代码编写,提高了开发效率。

创建逆向工程的步骤

1、添加依赖&插件

<!-- 控制Maven在构建过程中配置相关配置 -->
<build>
	<!-- 构建过程中的使用的插件 -->
	<plugins>
		<!-- MyBatis逆向工程操作插件 -->
		<plugin>
			<groupId>org.mybatis.generator</groupId>
			<artifactId>mybatis-generator-maven-plugin</artifactId>
			<version>1.3.7</version>
			<!-- 逆向工程生成配置 -->
			<configuration>
				<!-- 配置逆向工程文件路径 -->
				<configurationFile>
					src/main/resources/generatorConfig.xml
				</configurationFile>
			</configuration>
			<!-- 插件的依赖 -->
			<dependencies>
				<!-- 逆向工程的核心依赖包 -->
				<dependency>
					<groupId>org.mybatis.generator</groupId>
					<artifactId>mybatis-generator-core</artifactId>
					<version>1.3.7</version>
				</dependency>
				<!-- MySQL驱动 -->
				<dependency>
					<groupId>mysql</groupId>
					<artifactId>mysql-connector-java</artifactId>
					<version>8.0.32</version>
				</dependency>
			</dependencies>
		</plugin>
	</plugins>
</build>

构建完成以后,Maven插件管理列表:

2、创建逆向工程配置文件generatorConfig.xml

resources目录下创建。

<?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">
        <!-- 表示生成文件不带注释 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <!-- 数据库的连接信息 -->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/dbtest1?serverTimezone=GMT%2B8"
                        userId="root"
                        password="123456">
        </jdbcConnection>
        <!-- javaBean的生成策略-->
        <javaModelGenerator targetPackage="com.evan.mybatis.entity"
                            targetProject=".\src\main\java">
            <!-- 开启子包识别 -->
            <property name="enableSubPackages" value="true" />
            <!-- 将数据表中字段前后的空格清除,生成实体类属性 -->
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!-- SQL映射文件的生成策略 -->
        <sqlMapGenerator targetPackage="com.evan.mybatis.mapper"
                         targetProject=".\src\main\resources">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>
        <!-- Mapper接口的生成策略,即DAO接口 -->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="com.evan.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>

生成简易版本逆向工程结构

双击逆向工程插件生成工程结构。


最终生成的Mavne工程的整体结构:

注意:构建过程中出现问题,先删除构建中生成的文件在进行重新构建。

创建MyBatis核心配置文件 & properties文件

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文件,此后就可以在当前文件的数据源连接信息使用${}的方式访问value -->
    <properties resource="jdbc.properties"/>

    <!-- 全局配置 -->
    <settings>
        <!-- 将数据表中字段下划线映射为驼峰命名规则 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

    <!-- 设置类型别名 -->
    <typeAliases>
        <!--以包为单位,将包下所有的类型设置默认的类型别名,即类名且不区分大小写-->
        <package name="com.evan.mybatis.entity"/>
    </typeAliases>
    <!--配置多个连接数据库的环境-->
    <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>
    <!-- 引入mybatis的映射文件 -->
    <mappers>
        <!--
            以包为单位引入映射文件
            要求:
            1、mapper接口所在的包要和映射文件所在的包一致
            2、mapper接口要和映射文件的名字一致
        -->
        <package name="com.evan.mybatis.mapper"/>
    </mappers>
</configuration>

jdbc.properties

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/dbtest1?serverTimezone=GMT%2B8
jdbc.username=root
jdbc.password=123456

测试

创建SqlSessionUtil工具类

public class SqlSessionUtil {
    private static final Logger LOGGER = LoggerFactory.getLogger(SqlSessionUtil.class);

    public static SqlSession getSession() {
        SqlSession sqlSession = null;
        try {
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            sqlSession = new SqlSessionFactoryBuilder().build(is).openSession(true);
        } catch (IOException e) {
            LOGGER.error("SqlSessionUtil.getSession方法出现异常:{0}",e);
        }
        return sqlSession;
    }
}
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyBatisTest {
    private static final Logger LOGGER = LoggerFactory.getLogger(MyBatisTest.class);

    /**
     * 删除操作测试
     */
    @Test
    public void test1() {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        int result = mapper.deleteByPrimaryKey(12);
        LOGGER.info("删除操作结果:{}",result);
        sqlSession.close();
    }

    /**
     * 添加操作测试
     */
    @Test
    public void test2() {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        int result = mapper.insert(new Emp(0, "lisi", 10, "男", 2));
        LOGGER.info("添加操作结果:{}",result);
        sqlSession.close();
    }

    /**
     * 根据主键id查询信息测试
     */
    @Test
    public void test3() {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        Emp emp = mapper.selectByPrimaryKey(3);
        LOGGER.info("查询结果:{}",emp);
        sqlSession.close();
    }

    /**
     * 查询所有信息测试
     */
    @Test
    public void test4() {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        List<Emp> emps = mapper.selectAll();
        emps.forEach(System.out::println);
        sqlSession.close();
    }

    /**
     * 修改操作测试
     */
    @Test
    public void test5() {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        Emp emp = new Emp(9,"evan",20,"男",3);
        int result = mapper.updateByPrimaryKey(emp);
        LOGGER.info("修改操作结果:{}",result);
        sqlSession.close();
    }
}

生成标准版本逆向工程结构

修改generatorConfig.xml中的逆向工程版本生成策略:

<!-- 生成标准版本逆向工程结构 -->
<context id="DB2Tables" targetRuntime="MyBatis3">
</context>

双击逆向工程插件生成工程结构。
标准版本最后生成结构:

测试

public class MyBatisTest {
    private static final Logger LOGGER = LoggerFactory.getLogger(MyBatisTest.class);
    
    @Test
    public void test1() {
        SqlSession sqlSession = SqlSessionUtil.getSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        EmpExample empExample = new EmpExample();
        /*
        根据条件查询数据:
        创建条件对象,通过andXXX方法为SQL添加查询添加,每个条件之间是and关系
         */
        empExample.createCriteria()
                .andEmpNameLike("e")
                .andAgeGreaterThan(20).andDeptIdIsNotNull();
        //将之前添加的条件通过or拼接其他条件
        empExample.or().andGenderEqualTo("男");
        List<Emp> emps = mapper.selectByExample(empExample);
        emps.forEach(System.out::println);

        Emp emp = new Emp(11,"haha",12,"女",null);
        //普通修改功能,根据主键修改同时属性值null也会被修改
        //int result = mapper.updateByPrimaryKey(emp);
        //选择性修改,当属性值为null不会被修改
        int result = mapper.updateByPrimaryKeySelective(emp);
        LOGGER.info("修改操作结果:{}",result);
        sqlSession.close();
    }
}

热门相关:重开地狱   神医嫁到   与校花同居:高手风流   龙组使命   公子风流