MyBatis的逆向工程是指根据数据库表结构自动生成对应的Java实体类、Mapper接口和XML映射文件的过程。逆向工程可以帮助开发人员快速生成与数据库表对应的代码,减少手动编写重复代码的工作量。
我们在MyBatis中通过逆向工具来帮我简化繁琐的搭建框架,减少我们对实体类的创建和mapper接口等,包括生产xml映射文件,不过一般开发中,我们不怎么使用映射文件生成的东西,因为生成的xml文件并不符合我们实际开发中使用的,所以我们一般通过逆向工具帮我们创建相关文件之后,然后我们在根据创建的文件进行处理。
逆向工程的好处
-
提高开发效率:逆向工程可以自动生成实体类、Mapper接口和XML映射文件,减少了手动编写这些代码的时间和工作量。开发人员可以专注于业务逻辑的实现,提高开发效率。
-
保持代码一致性:逆向工程生成的代码与数据库表结构保持一致,避免了手动编写代码时可能出现的拼写错误、字段类型不匹配等问题。这样可以确保代码的准确性和一致性。
-
易于维护和更新:当数据库表结构发生变化时,可以通过重新运行逆向工程来更新生成的代码,而不需要手动修改和调整代码。这样可以减少维护工作的复杂性和风险。
-
提供基础代码框架:逆向工程生成的代码提供了基础的增删改查操作,开发人员可以在此基础上进行扩展和定制,快速构建具体业务功能。
-
避免重复劳动:逆向工程可以自动生成大量的基础代码,避免了开发人员重复编写相似的代码的劳动,提高了开发效率和代码质量。
创建逆向工程的步骤
正向工程:先创建Java实体类,由框架负责根据实体类生成数据库表。 Hibernate是支持正向工程的。
逆向工程:先创建数据库表,由框架负责根据数据库表,反向生成如下资源:
- Java实体类
- Mapper接口
- Mapper映射文件
逆向完毕后实现相关功能的完整目录:
添加逆向工程的依赖和插件
<?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"><parent><artifactId>SSM</artifactId><groupId>com.miaow</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>MyBatis-generator</artifactId><name>MyBatis-generator</name><description>MyBatis</description><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.7</maven.compiler.source><maven.compiler.target>1.7</maven.compiler.target></properties><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><!-- log4j日志 --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><!-- 逆向工程的核心依赖 --><dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><version>1.3.6</version></dependency></dependencies><!-- 控制Maven在构建过程中相关配置 --><build><!-- 构建过程中用到的插件 --><plugins><!-- 具体插件,逆向工程的操作是以构建过程中插件形式出现的 --><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.6</version><!-- 插件的依赖 --><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><!-- 逆向工程的核心依赖 --><dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><version>1.3.6</version></dependency></dependencies></plugin></plugins></build>
</project>
创建MyBatis核心配置文件
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--MyBatis核心配置文件中,标签的顺序:properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?--><!--引入properties文件--><properties resource="jdbc.properties" /><!--设置类型别名--><typeAliases><!--typeAlias:设置某个类型的别名属性:type:设置需要设置别名的类型alias:设置某个类型的别名,若不设置该属性,那么该类型拥有默认的别名,即类名且不区分大小写--><!--<typeAlias type="com.atguigu.mybatis.pojo.User"></typeAlias>--><!--以包为单位,将包下所有的类型设置默认的类型别名,即类名且不区分大小写--><package name="com.miaow.mybatis.bean"/></typeAliases><!-- 该死的Mybatis 分页插件还有顺序 导入配置还要按照顺序进行--><plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin></plugins><!--environments:配置多个连接数据库的环境属性:default:设置默认使用的环境的id--><environments default="development"><!--environment:配置某个具体的环境属性:id:表示连接数据库的环境的唯一标识,不能重复--><environment id="development"><!--transactionManager:设置事务管理方式属性:type="JDBC|MANAGED"JDBC:表示当前环境中,执行SQL时,使用的是JDBC中原生的事务管理方式,事务的提交或回滚需要手动处理MANAGED:被管理,例如Spring--><transactionManager type="JDBC"/><!--dataSource:配置数据源属性:type:设置数据源的类型type="POOLED|UNPOOLED|JNDI"POOLED:表示使用数据库连接池缓存数据库连接UNPOOLED:表示不使用数据库连接池JNDI:表示使用上下文中的数据源--><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><!-- 配置多个数据源 --><environment id="test"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/test?serverTimezone=UTC"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><!--引入映射文件--><mappers><!--xml引入配置文件 --><!--<mapper resource="mappers/UserMapper.xml"/>--><!--以包为单位引入映射文件要求:1、mapper接口所在的包要和映射文件所在的包一致2、mapper接口要和映射文件的名字一致--><package name="com.miaow.mybatis.mapper"/></mappers>
</configuration>
创建逆向工程配置文件
文件名必须是:generatorConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfigurationPUBLIC "-//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="mybatisGenerator" targetRuntime="MyBatis3"><commentGenerator><!-- 是否去除自动生成的注释 true:是 : false:否 --><property name="suppressAllComments" value="true" /></commentGenerator><!-- 数据库的连接信息 --><jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useSSL=false"userId="root"password="123456"></jdbcConnection><!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和NUMERIC 类型解析为java.math.BigDecimal --><javaTypeResolver><property name="forceBigDecimals" value="false" /></javaTypeResolver><!-- javaBean的生成策略--><javaModelGenerator targetPackage="com.miaow.mybatis.pojo" targetProject=".\src\main\java"><property name="enableSubPackages" value="true" /><property name="trimStrings" value="true" /></javaModelGenerator><!-- SQL映射文件的生成策略 --><sqlMapGenerator targetPackage="com.miaow.mybatis.mapper" targetProject=".\src\main\resources"><property name="enableSubPackages" value="true" /></sqlMapGenerator><!-- Mapper接口的生成策略 --><javaClientGenerator type="XMLMAPPER" targetPackage="com.miaow.mybatis.mapper" targetProject=".\src\main\java"><property name="enableSubPackages" value="true" /></javaClientGenerator><!-- 逆向分析的表 --><!-- tableName设置为*号,可以对应所有表,此时不写domainObjectName --><!-- domainObjectName属性指定生成出来的实体类的类名 -->
<!-- <table tableName="user" domainObjectName="User"/>--><table tableName="book" domainObjectName="BookVO"><!-- 用于指定生成实体类时是否使用实际的列名作为实体类的属性名 --><property name="useActualColumnNames" value="false" /></table></context>
</generatorConfiguration>
创建你的MySQL数据库表,我的数据库表很简单
CREATE TABLE `book` (`uid` int(11) NOT NULL COMMENT '用户id',`book` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '用户借的书的名称',`cool` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'cool星级',PRIMARY KEY (`uid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
接下来我们就通过MBG插件的generate构建我们的相关文件
双击运行,然后我们就可以等待看到我们的目录下,出现了相关生成的文件了。
其他文件
log4j.properties
log4j.rootLogger=WARN, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="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>
测试我们的QBC查询
public class AppTest
{/*** Rigorous Test :-) QBC查询*/@Testpublic void shouldAnswerWithTrue() throws IOException {
// assertTrue( true );InputStream is = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession sqlSession = sqlSessionFactory.openSession();BookVOMapper bookVOMapper = sqlSession.getMapper(BookVOMapper.class);//查询所所有数据
// List<BookVO> list = bookVOMapper.selectByExample(null);
// list.forEach(book -> System.out.println(book));//根据条件查询BookVOExample example = new BookVOExample();// 查询条件或者更新条件example.createCriteria().andBookEqualTo("张珊").andCoolEqualTo("我很酷");//example.or().andUidIsNotNull();List<BookVO> list1 = bookVOMapper.selectByExample(example); //select uid, book, cool from book WHERE ( book = 'JWkQo3pTqV' and cool = 'hMzeUlRCrJ(String) ' ) (BaseJdbcLogger.java:137)list1.forEach(book -> System.out.println(book));// bookVOMapper.updateByExampleSelective(new BookVO(214,"张珊","我很酷"),example); //update book SET uid = 214, book = '张珊', cool = '我很酷' WHERE ( book = 'JWkQo3pTqV' and cool = 'hMzeUlRCrJ(String) ' ) (BaseJdbcLogger.java:137)}
}
其他拓展
关于QBC查询是提供基于XML映射文件和注解的方式来对SQL进行查询。
什么是QBC
QBC(Query By Criteria)是一种查询方式,用于根据一组条件来构建查询语句,而不是直接编写SQL语句。它是一种面向对象的查询方式,通过使用条件对象来描述查询条件,从而实现动态和灵活的查询。
在QBC中,查询条件通常由一组条件对象(Criteria)组成,每个条件对象表示一个查询条件。条件对象包含属性名、操作符和值等信息,用于描述查询的约束条件。通过组合和连接多个条件对象,可以构建复杂的查询语句。
QBC的优点包括:
- 灵活性:QBC允许根据不同的查询需求动态构建查询语句,可以根据条件的组合和连接来灵活地生成不同的查询条件。
- 可读性:使用条件对象来描述查询条件,使查询语句更加直观和易于理解,减少了直接编写SQL语句的复杂性。
- 可维护性:由于查询条件是通过条件对象来描述的,当查询需求变化时,只需修改条件对象的属性,而不需要修改底层的SQL语句,提高了查询的可维护性。
QBC查询的步骤:
-
创建一个查询条件对象(Criteria): 创建一个Java类,用于封装查询条件。这个类可以包含各种属性,用于表示查询的条件,例如字段名、操作符和值等。
-
在Mapper接口中定义查询方法: 在Mapper接口中定义一个方法,该方法接受Criteria对象作为参数,并返回查询结果。方法的实现可以通过XML映射文件或注解来编写SQL语句,根据Criteria对象的属性动态生成查询条件。
-
编写XML映射文件或注解: 在XML映射文件或注解中,根据Criteria对象的属性动态生成查询条件。可以使用MyBatis提供的动态SQL标签(如if、choose、when、otherwise等)来根据条件生成不同的查询语句。
-
调用查询方法: 在业务代码中,创建一个Criteria对象,设置查询条件,然后调用Mapper接口中定义的查询方法进行查询。查询结果将根据条件动态生成的SQL语句进行查询,并返回符合条件的结果。
QBC在许多ORM(对象关系映射)框架中得到广泛应用,例如Hibernate和MyBatis。这些框架提供了API和工具,用于构建和执行QBC查询,简化了查询的编写和执行过程。
ps:国内一般开发很少采用QBC模式,当然也有公司采用这种模式,但绝大多数还是传统的开发方式。按照我们正常的开发方式就行,这个模式了解就可。