1. MyBatis的逆向工程详细步骤操作
@[toc]
所谓的逆向工程:会/可以根据数据库表逆向生成Java的 POJO类,SqlMapper.xml (对应SQL映射文件),以及Mapper 接口类等。
思考:使用这个插件的话,需要给这个插件配置哪些信息?
- POJO类名,包名以及要生成的所在位置
- SqlMapper.xml 文件名以及生成位置
- Mapper 接口名以及生成位置
- 连接数据库的信息
- 指定哪些表参与逆向工程
- ......
关于 MyBatis 的逆向工程有两个版本: 对应在 targetRuntime 的两个值:
- MyBatis3Simple:生成的是基础版,只有基本的增删改查。
- MyBatis3:生成的是增强版,除了基本的增删改查之外还有复杂的增删改查。
2. 逆向工程配置与生成
下面我们进行逆向工程配置,让其为我们自动生成va的 POJO类,SqlMapper.xml (对应SQL映射文件),以及Mapper 接口类等。
整理了一份面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题
需要全套面试笔记的【点击此处即可】即可免费获取
2.1 MyBatis3Simple:基础版,只有基本的增删改查
2.1.1 第一步:在pom.xml
中添加逆向工程插件
大家直接复制就好了,不用修改的。
xml
复制代码
<!--定制构建过程--> <build> <!--可配置多个插件--> <plugins> <!--其中的一个插件:mybatis逆向工程插件--> <plugin> <!--插件的GAV坐标--> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.4.1</version> <!--允许覆盖--> <configuration> <overwrite>true</overwrite> </configuration> <!--插件的依赖--> <dependencies> <!--mysql驱动依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.30</version> </dependency> </dependencies> </plugin> </plugins> </build>
xml
复制代码
<?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>com.rainbowsea</groupId> <artifactId>mybatis-012-generator2</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> </properties> <dependencies> <!-- mybatis 的依赖--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.10</version> </dependency> <!-- mysql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.30</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> <!-- 引入 logback的依赖,这个日志框架实现了slf4j 规范--> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.11</version> </dependency> </dependencies> <!--定制构建过程--> <build> <!--可配置多个插件--> <plugins> <!--其中的一个插件:mybatis逆向工程插件--> <plugin> <!--插件的GAV坐标--> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.4.1</version> <!--允许覆盖--> <configuration> <overwrite>true</overwrite> </configuration> <!--插件的依赖--> <dependencies> <!--mysql驱动依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.30</version> </dependency> </dependencies> </plugin> </plugins> </build> </project>
2.1.2 第二步:配置 generatorConfig.xml
注意:该文件必须配置到类的根路径下,并且该文件名必须是为 generatorConfig.xml
不可以是其它的。
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> <!-- targetRuntime有两个值: MyBatis3Simple:生成的是基础版,只有基本的增删改查。 MyBatis3:生成的是增强版,除了基本的增删改查之外还有复杂的增删改查。 --> <context id="DB2Tables" targetRuntime="MyBatis3Simple"> <!--防止生成重复代码--> <plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/> <commentGenerator> <!--是否去掉生成日期--> <property name="suppressDate" value="true"/> <!--是否去除注释--> <property name="suppressAllComments" value="true"/> </commentGenerator> <!--连接数据库信息--> <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/powernode" userId="root" password="root"> </jdbcConnection> <!-- 生成pojo包名和位置 --> <javaModelGenerator targetPackage="com.powernode.mybatis.pojo" targetProject="src/main/java"> <!--是否开启子包--> <property name="enableSubPackages" value="true"/> <!--是否去除字段名的前后空白--> <property name="trimStrings" value="true"/> </javaModelGenerator> <!-- 生成SQL映射文件的包名和位置 --> <sqlMapGenerator targetPackage="com.powernode.mybatis.mapper" targetProject="src/main/resources"> <!--是否开启子包--> <property name="enableSubPackages" value="true"/> </sqlMapGenerator> <!-- 生成Mapper接口的包名和位置 --> <javaClientGenerator type="xmlMapper" targetPackage="com.powernode.mybatis.mapper" targetProject="src/main/java"> <property name="enableSubPackages" value="true"/> </javaClientGenerator> <!-- 表名和对应的实体类名--> <table tableName="t_car" domainObjectName="Car"/> </context> </generatorConfiguration>
下面,我们先使用 MyBatis3Simple:生成的是基础版,只有基本的增删改查
注意:需要将其中的一些信息修改为你自己的比如(数据库的账号密码,以及你所想的包名的路径名称等等)
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> <!-- targetRuntime有两个值: MyBatis3Simple:生成的是基础版,只有基本的增删改查。 MyBatis3:生成的是增强版,除了基本的增删改查之外还有复杂的增删改查。 --> <context id="DB2Tables" targetRuntime="MyBatis3Simple"> <!--防止生成重复代码--> <plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/> <commentGenerator> <!--是否去掉生成日期--> <property name="suppressDate" value="true"/> <!--是否去除注释--> <property name="suppressAllComments" value="true"/> </commentGenerator> <!--连接数据库信息--> <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/powernode" userId="root" password="MySQL123"> </jdbcConnection> <!-- 生成pojo包名和位置 --> <javaModelGenerator targetPackage="com.rainbowsea.mybatis.pojo" targetProject="src/main/java"> <!--是否开启子包--> <property name="enableSubPackages" value="true"/> <!--是否去除字段名的前后空白--> <property name="trimStrings" value="true"/> </javaModelGenerator> <!-- 生成SQL映射文件的包名和位置 --> <sqlMapGenerator targetPackage="com.rainbowsea.mybatis.mapper" targetProject="src/main/resources"> <!--是否开启子包--> <property name="enableSubPackages" value="true"/> </sqlMapGenerator> <!-- 生成Mapper接口的包名和位置 --> <javaClientGenerator type="xmlMapper" targetPackage="com.rainbowsea.mybatis.mapper" targetProject="src/main/java"> <property name="enableSubPackages" value="true"/> </javaClientGenerator> <!-- 表名和对应的实体类名--> <table tableName="t_car" domainObjectName="Car"/> </context> </generatorConfiguration>
2.1.3 第三步:运行插件
我们可以打开项目看看。
2.1.4 第四步:测试运行
别忘记了,运行MyBatis 还是需要导入关于 MyBatis 的相关依赖的 jar 包的
- 依赖:mybatis依赖、mysql驱动依赖、junit依赖、logback依赖
- jdbc.properties
- mybatis-config.xml
- logback.xml
编写测试程序:
java
复制代码
package com.rainbowsea.mybatis.test; import com.rainbowsea.mybatis.mapper.CarMapper; import com.rainbowsea.mybatis.pojo.Car; 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; public class CarMapperTest { // CarExample类负责封装查询条件的 @Test public void testSelect() throws IOException { SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis"); SqlSession sqlSession = sqlSessionFactory.openSession(); CarMapper mapper = sqlSession.getMapper(CarMapper.class); // 执行查询 // 1. 查询一个 Car car = mapper.selectByPrimaryKey(118L); System.out.println(car); sqlSession.close(); } }
2.2 MyBatis3:生成的是增强版
升级为 MyBatis3 增强版,只需要在 generatorConfig.xml
配置文件当中的targetRuntime="MyBatis3" 的值,设置为:myBatis3 即可。其它的和上面 MyBatis3Simple 的操作是一样的。
注意:MyBatis3 增强版,多出来的这个
CarExample
实体类对象,是封装了条件,通过CarExample 对象来封装查询条件的
如下运行测试:
java
复制代码
package com.rainbowsea.mybatis.test; import com.rainbowsea.mybatis.mapper.CarMapper; import com.rainbowsea.mybatis.pojo.Car; import com.rainbowsea.mybatis.pojo.CarExample; 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.math.BigDecimal; import java.util.List; public class CarMapperTest { @Test public void testDeleteByPrimaryKey() throws IOException { SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "mybatis"); SqlSession sqlSession = sqlSessionFactory.openSession(); CarMapper mapper = sqlSession.getMapper(CarMapper.class); // 执行查询 // 1. 查询一个 Car car = mapper.selectByPrimaryKey(118L); System.out.println(car); // 2. 查询所有(selectByExample 根据条件查询,如果条件是null表示没有条件) List<Car> cars = mapper.selectByExample(null); cars.forEach(car1 -> { System.out.println(car1); }); // 3. 按照条件进行查询 // 封装条件,通过CarExample 对象来封装查询条件 CarExample carExample = new CarExample(); // 调用carExample.createCriteria()方法来创建查询条件 carExample.createCriteria() .andBrandLike("小米") .andGuidePriceGreaterThan(new BigDecimal(30.0)); // 添加 or carExample.or().andCarTypeEqualTo("燃油车"); // 执行查询 List<Car> cars2 = mapper.selectByExample(carExample); cars2.forEach(car2->{ System.out.println(car2); }); sqlSession.close(); } }
java
复制代码
package com.powernode.mybatis.test; import com.powernode.mybatis.mapper.CarMapper; import com.powernode.mybatis.pojo.Car; import com.powernode.mybatis.pojo.CarExample; 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.math.BigDecimal; import java.util.List; public class GeneratorTest { @Test public void testGenerator() throws Exception{ SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml")); SqlSession sqlSession = sqlSessionFactory.openSession(); CarMapper mapper = sqlSession.getMapper(CarMapper.class); // 增 /*Car car = new Car(); car.setCarNum("1111"); car.setBrand("比亚迪唐"); car.setGuidePrice(new BigDecimal(30.0)); car.setProduceTime("2010-10-12"); car.setCarType("燃油车"); int count = mapper.insert(car); System.out.println("插入了几条记录:" + count);*/ // 删 /*int count = mapper.deleteByPrimaryKey(83L); System.out.println("删除了几条记录:" + count);*/ // 改 // 根据主键修改 /*Car car = new Car(); car.setId(89L); car.setGuidePrice(new BigDecimal(20.0)); car.setCarType("新能源"); int count = mapper.updateByPrimaryKey(car); System.out.println("更新了几条记录:" + count);*/ // 根据主键选择性修改 /*car = new Car(); car.setId(89L); car.setCarNum("3333"); car.setBrand("宝马520Li"); car.setProduceTime("1999-01-10"); count = mapper.updateByPrimaryKeySelective(car); System.out.println("更新了几条记录:" + count);*/ // 查一个 Car car = mapper.selectByPrimaryKey(89L); System.out.println(car); // 查所有 List<Car> cars = mapper.selectByExample(null); cars.forEach(c -> System.out.println(c)); // 多条件查询 // QBC 风格:Query By Criteria 一种查询方式,比较面向对象,看不到sql语句。 CarExample carExample = new CarExample(); carExample.createCriteria() .andBrandEqualTo("丰田霸道") .andGuidePriceGreaterThan(new BigDecimal(60.0)); carExample.or().andProduceTimeBetween("2000-10-11", "2022-10-11"); mapper.selectByExample(carExample); sqlSession.commit(); } }
3. 总结:
- 所谓的逆向工程:会/可以根据数据库表逆向生成Java的 POJO类,SqlMapper.xml (对应SQL映射文件),以及Mapper 接口类等。
- 关于 MyBatis 的逆向工程有两个版本:对应在 targetRuntime 的两个值:
java
复制代码
1. MyBatis3Simple:生成的是基础版,只有基本的增删改查。 2. MyBatis3:生成的是增强版,除了基本的增删改查之外还有复杂的增删改查。
- 注意:MyBatis3 增强版,多出来的这个
CarExample
实体类对象,是封装了条件,通过CarExample 对象来封装查询条件的