Mybatis逆向⼯程配置与⽣成
使用基础版本
前置准备
项目结构
创建一个空的模块,此时java目录里面没有代码,mapper映射文件也没有。
导入依赖
在pom中添加逆向⼯程插件
<!--定制构建过程-->
<build>
<!--可配置多个插件-->
<plugins>
<!--mybatis逆向⼯程插件-->
<plugin>
<!--插件的GAV坐标-->
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.1</version>
<!--允许覆盖-->
<!--如果存在pojo实体类使用逆向工程时候,是清空然后在写入,如果不覆盖可能是追加的模式,会出错-->
<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>
注:
GAV坐标是指在软件开发中常用的一种标识方式,用于唯一确定一个软件插件或库。它由三个部分组成:Group ID(组织ID)、Artifact ID(项目ID)和Version(版本号),因此又称为GAV坐标。
- Group ID(组织ID):代表开发插件或库的组织或团队的唯一标识符。
- Artifact ID(项目ID):代表插件或库的名称或项目的唯一标识符。
- Version(版本号):代表插件或库的特定版本。
配置generatorConfig.xml
该⽂件名必须叫做:generatorConfig.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/hqyj03"
userId="root"
password="yjg">
</jdbcConnection>
<!-- ⽣成pojo包名和位置 -->
<javaModelGenerator targetPackage="com.yjg.mybatis.pojo" targetProject="src/main/java">
<!--是否开启⼦包-->
<!--如果为false会把com.yjg.mybatis.pojo当成一个目录造出来-->
<property name="enableSubPackages" value="true"/>
<!--是否去除字段名的前后空⽩-->
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- ⽣成SQL映射⽂件的包名和位置 -->
<sqlMapGenerator targetPackage="com.yjg.mybatis.mapper" targetProject="src/main/resources">
<!--是否开启⼦包-->
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- ⽣成Mapper接⼝的包名和位置 -->
<javaClientGenerator
type="xmlMapper"
targetPackage="com.yjg.mybatis.mapper"
targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 表名和对应的实体类名-->
<table tableName="user" domainObjectName="User"/>
</context>
</generatorConfiguration>
数据库表
CREATE TABLE `user` (
`id` int(11) NOT NULL,
`username` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
使用逆向工程
点击插件使用
双击之后效果
双击之后就会出现,对应得实体类和mapper映射文件。
UserMapper.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.yjg.mybatis.mapper.UserMapper">
<resultMap id="BaseResultMap" type="com.yjg.mybatis.pojo.User">
<id column="id" jdbcType="INTEGER" property="id" />
<result column="username" jdbcType="VARCHAR" property="username" />
<result column="password" jdbcType="VARCHAR" property="password" />
</resultMap>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
delete from user
where id = #{id,jdbcType=INTEGER}
</delete>
<insert id="insert" parameterType="com.yjg.mybatis.pojo.User">
insert into user (id, username, password
)
values (#{id,jdbcType=INTEGER}, #{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}
)
</insert>
<update id="updateByPrimaryKey" parameterType="com.yjg.mybatis.pojo.User">
update user
set username = #{username,jdbcType=VARCHAR},
password = #{password,jdbcType=VARCHAR}
where id = #{id,jdbcType=INTEGER}
</update>
<select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
select id, username, password
from user
where id = #{id,jdbcType=INTEGER}
</select>
<select id="selectAll" resultMap="BaseResultMap">
select id, username, password
from user
</select>
</mapper>
UserMapper接口的内容
package com.yjg.mybatis.mapper;
import com.yjg.mybatis.pojo.User;
import java.util.List;
public interface UserMapper {
int deleteByPrimaryKey(Integer id);
int insert(User row);
User selectByPrimaryKey(Integer id);
List<User> selectAll();
int updateByPrimaryKey(User row);
}
测试逆向工程
使用接口里面的方法看是否能够成功操作数据库
测试一
@Test
public void test01() throws Exception{
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> users = userMapper.selectAll();
users.forEach(user -> System.out.println(user));
}
测试结果
能够查出结果,没有问题
测试二
@Test
public void test02() throws Exception{
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int i = userMapper.deleteByPrimaryKey(0);
System.out.println(i);
}
测试结果
能够删除数据库数据,没有问题
使用增强版
在配置generatorConfig.xml的时候
targetRuntime有两个值:
MyBatis3Simple:⽣成的是基础版,只有基本的增删改查。
MyBatis3:⽣成的是增强版,除了基本的增删改查之外还有复杂的增删改查。
只需要把上面的generatorConfig.xml文件的targetRuntime值换一下即可。
项目结构
当使用增强版本的时候,就会出现除了User实体类的其他两个类
UserExample和UserWithBLOBs
UserExample
:UserExample
是一个用于构建查询条件的辅助类。它提供了一系列的方法,用于设置查询条件,比如等于、大于、小于、排序等。通过使用UserExample
,可以方便地构建复杂的查询条件,并将其传递给MyBatis的查询接口进行数据库查询操作。UserWithBLOBs
:UserWithBLOBs
是生成的包含大字段(BLOBs)的实体类。如果表中存在大字段类型(如TEXT、BLOB等),MyBatis逆向工程会为这些字段生成对应的实体类,并在原有的实体类(比如User
)基础上扩展,以支持大字段的获取和设置。
总的来说,UserExample
和UserWithBLOBs
在MyBatis逆向工程中的作用如下:
UserExample
帮助构建复杂的查询条件,提供了灵活的方法来指定查询规则和约束条件。UserWithBLOBs
是对包含大字段的表生成的实体类,它扩展了原有实体类的功能,使得对大字段的操作更加方便。
UserMapper接口
会比基础的版本多一些方法,相应的UserMapper.xml映射文件也会增多语句
package com.yjg.mybatis.mapper;
import com.yjg.mybatis.pojo.User;
import com.yjg.mybatis.pojo.UserExample;
import java.util.List;
import org.apache.ibatis.annotations.Param;
public interface UserMapper {
long countByExample(UserExample example);
int deleteByExample(UserExample example);
int deleteByPrimaryKey(Integer id);
int insert(User row);
int insertSelective(User row);
List<User> selectByExample(UserExample example);
User selectByPrimaryKey(Integer id);
int updateByExampleSelective(@Param("row") User row, @Param("example") UserExample example);
int updateByExample(@Param("row") User row, @Param("example") UserExample example);
int updateByPrimaryKeySelective(User row);
int updateByPrimaryKey(User row);
}
测试方法
@org.junit.Test
public void test01() throws Exception{
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行查询
//查询一个
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.selectByPrimaryKey(1);
System.out.println(user);
System.out.println("===============================================");
//查询所有(selectByExample根据条件查询,如果条件为空,则表示没有条件)
List<User> users = userMapper.selectByExample(null);
users.forEach(user1 -> System.out.println(user1));
System.out.println("===============================================");
//按照条件进行查询
//多条件查询
// QBC ⻛格:Query By Criteria ⼀种查询⽅式,⽐较⾯向对象,看不到sql语句。
UserExample userExample = new UserExample();
userExample.createCriteria().andPasswordLike("%d%").andIdBetween(3, 5);
List<User> userList = userMapper.selectByExample(userExample);
userList.forEach(u-> System.out.println(u));
}
测试结果
查询一个成功
查询所有成功
根据条件查询成功