Mybatis详解
1.什么是框架
框架(Framework)就是你在实际开发中,重要的组成部分,可以让使用者减少很多重复的代码、让代码的结构更加清晰,耦合度更低,后期维护方便。简而言之,框架其实就是某种应用的半成品,就是一组组件,供你选用完成自己的系统(它是我们软件开发中的一套解决方案)
2.三层架构(MVC)和web-service-dao
表现层:是用于展示数据的
业务层:是处理业务需求的
持久层:是和数据库交互的
M:Model,模型,封装数据(javabean)
V:View,视图,展示界面(jsp)
C:Controller,控制器,控制程序流程
3.持久层技术解决方案
JDBC技术:(规范)
三大对象:
Connection,PreparedStatement,ResultSet
Spring的JdbcTemplate:(工具类),Spring中对jdbc的简单封装
Apache的DBUtils(工具类):它是和Spring的JdbcTemplate像,也是对jdbc的简单封装
但是以上都不是框架
2.什么是 MyBatis?
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
采用ORM(Object Relational Mappging 对象关系映射)思想解决实体类和数据库映射的问题,简单的说,就是把数据库表和实体类的属性对应起来,让我们可以操作实体类就实现操作数据库表。
JAVASE项目: 在项目下新建 lib 目录,将 jar 导入该目录
WEB项目: 在 WEB-INF下新建 lib 目录,将 jar 导入该目录
Maven项目:在pom.xml中添加相关依赖即可
下载地址: https://github.com/mybatis/mybatis-3/releases
准备:
1.安装mysql (5.7)
2.安装jdk (1.8)
3.添加到项目中(图示)
4.新建 Mybatis 核心配置文件
<!--环境配置-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!--数据源-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 配置映射文件 -->
<mappers>
<mapper resource="Department.xml"/>
</mappers>
5.新建 映射文件(编写 sql 语句)
<!--
namespace: 命名空间,唯一标识,可以自定义
-->
<mapper namespace="com.mapper.EmpMapper">
<!--SQL语句
id: 唯一标识,方便调用
name: 不唯一,可以多个
resultType: 返回类型
-->
<select id="selectEmpById" resultType="string">
select name from emp where id = #{id}
</select>
</mapper>
6.执行
在测试类中
// Mybatis 核心配置文件路径
String resource = "mybatis-config.xml";
// 读取配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建 SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//SqlSession 完全包含了面向数据库执行 SQL 命令所需的所有方法
SqlSession session = sqlSessionFactory.openSession();
String str = (String)session.selectOne("com.mapper.EmpMapper.selectEmpById", 1001);
System.out.println(str);
session.close();
2.1、使用接口形式编写 Mybatis
1.创建接口 (xxxMapper)
public interface DepartmentMapper {
//查询指定部门信息
Department selectDeptById(Integer id);
}
2.接口绑定映射文件 (xxxMapper.xml)
<mapper namespace="com.mapper.DepartmentMapper">
<select id="selectDeptById" resultType="com.hxzy.bean.Department">
select * from department where deptId = #{deptId}
</select>
</mapper>
绑定接口中的方法:让映射文件的中 id 与 接口方法名一致即可
3.调用接口
测试类中测试
//使用接口方式操作
EmpMapper mapper = session.getMapper(EmpMapper.class);//获取到一个代理对象
Emp emp = mapper.selectEmp(1003);
System.out.println(emp);
3、Mybatis 核心配置
configuration(配置)
-
- 外部配置且可动态替换的
-
- MyBatis 中极为重要的调整设置,会改变 MyBatis 的运行时行为
-
environments(环境配置)
-
environment(环境变量)
-
transactionManager(事务管理器)
-
dataSource(数据源)
MyBatis 可以配置成适应多种环境
-
-
尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
-
[mappers(映射器)](
Mybatis 映射文件
insert – 映射插入语句 — 插入语句
update – 映射更新语句 — 更新语句
delete – 映射删除语句 — 删除语句
select – 映射查询语句 — 查询语句
映射文件参数问题
在 Mybatis 里通过 #{} 来获取参数值 (占位符)
1.一个普通参数 (基本数据类型,string)
可以写任意名 #{xxx}
2.两个或多个
update emp set name=?,salary=? where id=?
Caused by: org.apache.ibatis.binding.BindingException: Parameter 'name' not found. Available parameters are [arg2, arg1, arg0, param3, param1, param2]
Mybatis 内部会对多个参数进行封装,封装为Map集合, 键默认 arg0… 或者 param1…若 使用 #{name} 格式, 则接口中参数必须取名
updateEmp(@Param("name") String name, @Param("salary") Double salary)
多个参数建议使用 实体类型 或者 Map 集合
实体类型: 使用 #{} 时,需要与属性名保持一致
Map 集合: 使用 #{} 时,需要与键保持一致
#{} 与 ${} 区别:
#{} : 以占位符出现
${}: 以字符拼接,(存在SQL注入问题)
4、结果映射
查询语句 (以前在 JDBC 中 ResultSet ),在Mybatis 中是自动映射(字段名一致,开启驼峰命名)
默认,自动映射,前提 字段名与属性名一致
当 字段名与属性名不一致时, 需要自定义 resultMap 结果映射
<!-- 自定义映射 resultMap: 默认会将没有指定的字段,自动映射(属性名与字段名一致)
id: 自定义,唯一标识,方便调用
type: 映射为指定的那种类型
-->
<resultMap id="deptMap" type="com.hxzy.entity.Dept">
<!--
property: 实体类的属性
column: 查询结果的列名
jdbcType: 数据库的数据类型 可省略
javaType: java的数据类型 可省略
-->
<result property="dName" column="dept_name"/>
</resultMap>
实例:接口类
public interface DepartmentMapper {
//根据指定部门信息,及其所有改部门的员工信息
Department getDeptById(Integer id);
List<Department> selectDeptAndEmpById(Integer deptId);//部门id
List<Department> selectDeptAndEmpById2(Integer deptId);//部门id
}
实例: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.mapper.DepartmentMapper">
<!--根据指定部门信息,及其所有改部门的员工信息
Department getDeptById(Integer id);
List<Department> selectDeptAndEmpById(Integer deptId);//部门id-->
<resultMap id="deptAndEmp" type="com.bean.Department" autoMapping="true">
<id property="deptId" column="deptId"></id>
<result property="deptName" column="deptName"></result>
<!-- 设置一对多的值
ofType:设置集合的保存类型
-->
<collection property="emps" ofType="com.bean.Employee" autoMapping="true">
<id property="empId" column="empId"></id>
<result property="deptId" column="deptId"></result>
</collection>
</resultMap>
<select id="selectDeptAndEmpById" resultMap="deptAndEmp">
select e.*, d.deptId deptId, d.deptName, d.deptAddress from department d
left join employee e on d.deptId = e.deptId
where d.deptId = #{deptId}
</select>
<!--根据指定部门信息,及其所有改部门的员工信息
Department getDeptById(Integer id);
List<Department> selectDeptAndEmpById2(Integer deptId);//部门id-->
<resultMap id="deptAndEmp2" type="com.bean.Department" autoMapping="true">
<id property="deptId" column="deptId" />
<result property="deptName" column="deptName" />
<!--设置 一对多 的值
select: 调用指定的SQL语句
column: 参数,当前SQL语句中查询的列
-->
<!--使用分步查询 ==>延迟加载
默认立即加载
eager:立即记载
lazy:延迟加载
-->
<collection property="emps"
select="com.mapper.EmployeeMapper.selectEmpByDeptId"
column="empId"
fetchType="lazy">
</collection>
</resultMap>
<!-- List<Department> selectDeptAndEmpById2(Integer deptId);//部门id-->
<select id="selectDeptAndEmpById2" resultMap="deptAndEmp2">
select * from department where deptId = #{deptId}
</select>
实例:测试类
@Test
public void testOneToMany(){
SqlSession sqlSession = sqlSessionFactory.openSession();
// DepartmentMapper mapper = sqlSession.getMapper(DepartmentMapper.class);
// List<Department> departments = mapper.selectDeptAndEmpById(10);
// for (Department department : departments) {
// System.out.println(department);
// }
// EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
// List<Employee> employees = mapper.selectEmpByeptId(10);
//
// for (Employee employee : employees) {
// System.out.println(employee);
// }
DepartmentMapper mapper = sqlSession.getMapper(DepartmentMapper.class);
List<Department> departments = mapper.selectDeptAndEmpById2(10);
sqlSession.close();
}
5、一对一关系
例: 一个员工对应一个部门 (emp — dept)
需求: 查询员工的同时查询部门信息
级联关系 : 在实体类中设置
<!--//查询员工信息同时查询部门信息
Emp queryEmpAndDeptById(Integer id);
-->
<select id="queryEmpAndDeptById" resultMap="empAndDept">
select e.*,d.id did,dept_name,loc from emp e
left join dept d on e.dept_id = d.id
where e.id = #{id}
</select>
<resultMap id="empAndDept" type="com.hxzy.entity.Emp">
<!--数据映射-->
<id property="id" column="id" />
<!--其他属性名一致的省略-->
<!-- 级联映射 以下两种选择其一即可 -->
<!-- 1 -->
<!--不一致: did,dept_name,loc-->
<result property="dept.id" column="did" />
<result property="dept.dName" column="dept_name" />
<result property="dept.loc" column="loc" />
<!--2-->
<!--association
property: 指定级联属性
javaType: 设置实体类型
-->
<association property="dept" javaType="com.hxzy.entity.Dept">
<id property="id" column="did" />
<result property="dName" column="dept_name" />
<result property="loc" column="loc" />
</association>
</resultMap>
<!--方法3 操作 分步查询-->
<!--Emp queryEmpAndDeptByIdMethod(Integer id);-->
<select id="queryEmpAndDeptByIdMethod" resultMap="method3">
select e.* from emp e where e.id = #{id}
</select>
<resultMap id="method3" type="com.hxzy.entity.Emp">
<id property="id" column="id" />
<!--
select 属性: 调用指定的 SQL语句
命名空间 + 映射文件中的指定 id
column 属性: 参数(当前查询语句中的字段)
-->
<association property="dept"
select="com.hxzy.mapper.DeptMapper.selectDeptById"
column="dept_id" >
</association>
</resultMap>
6、一对多关系
例: 一个部门有对个员工
1.实体类设置
@Getter
@Setter
@ToString(exclude = {"emps"})
public class Dept {
private Integer id;
private String dName;
private String loc;
private List<Emp> emps;
}
2.映射文件配置
<!--Dept selectDeptAndEmps(Integer id);//id : 部门id-->
<select id="selectDeptAndEmps" resultMap="deptEmps">
select d.id did,dept_name,loc,e.* from dept d
left join emp e on d.id = e.dept_id
where d.id = #{id}
</select>
<resultMap id="deptEmps" type="com.hxzy.entity.Dept" autoMapping="true">
<id property="id" column="did" />
<result property="dName" column="dept_name" />
<!--
collection: 封装集合数据
property: 设置集合属性名
autoMapping: 设置自动映射
-->
<collection property="emps" ofType="com.hxzy.entity.Emp" autoMapping="true">
<id property="id" column="id" />
</collection>
</resultMap>
<!-- 分步查询 -->
<!--Dept selectDeptById(Integer id);-->
<select id="selectDeptById" resultMap="deptEmps2">
select * from dept where id = #{id}
</select>
<resultMap id="deptEmps2" type="com.hxzy.entity.Dept" autoMapping="true">
<id property="id" column="id" />
<result property="dName" column="dept_name" />
<!-- 分步查询
select: 调用的SQL语句
column: 参数(当前SQL语句查询结果中的字段)
-->
<collection property="emps"
select="com.hxzy.mapper.EmpMapper.selectEmpsByDeptId"
column="id"></collection>
</resultMap>
<!-- EmpMapper 映射文件 -->
<!--根据部门id查询
List<Emp> selectEmpsByDeptId(Integer id);//id:部门id-->
<select id="selectEmpsByDeptId" resultType="com.hxzy.entity.Emp">
select * from emp where dept_id = #{id}
</select>
7.分步查询
若数据表数量较多,不建议使用
好处: 可以实现延迟加载 ( 使用时才查询 ),降低查询数据库的次数
局部设置
fetchType属性: 设置延迟加载
eager: 立即加载,默认
lazy: 延迟加载
<!-- 开启全局的延迟加载 -->
<setting name="lazyLoadingEnabled" value="true" />
8、缓存
本地缓存(一级缓存) (开启),不能关闭的
会话缓存,在 SqlSession 中实现
哪些情况会使用到一级缓存
同一会话查询同一信息
失效
1.不是同一个 SqlSession
2.清空缓存
3.执行了增删改操作
二级缓存(3之前默认关闭) 现在使用版本默认开启
Mapper级别,使用该Mapper映射文件查询,都会存在二级缓存
<!--开启全局二级缓存 在mybatis配置文件中 -->
<!--全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存。-->
<setting name="cacheEnabled" value="true" />
要启用全局的二级缓存,只需要在你的 SQL 映射文件中添加一行:
<cache/>
二级缓存属性
eviction: 设置清除策略
LRU – 最近最少使用:移除最长时间不被使用的对象。
FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
SOFT – 软引用:基于垃圾回收器状态和软引用规则移除对象。
WEAK – 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。
flushInterval(刷新间隔 毫秒)属性可以被设置为任意的正整数, 默认情况是不设置,也就是没有刷新间隔
size(引用数目)属性可以被设置为任意正整数,要注意欲缓存对象的大小和运行环境中可用的内存资源。默认值是 1024。
readOnly(只读)属性可以被设置为 true 或 false。
异常
Caused by: java.io.NotSerializableException: com.entity.Emp
说明 Emp 类没有序列化
修改
public class Emp implements Serializable {}
失效:
1.缓存被清空
2.执行增删改操作,会自动清除缓存, (数据会发生变化,以前的缓存信息就没有实际价值)
flushCache: 是否刷新缓存
9、动态 SQL
MyBatis 的强大特性之一便是它的动态 SQL
MyBatis 采用功能强大的基于 OGNL 的表达式来淘汰其它大部分元素
OGNL: 表达式,类似以前学习 EL
简单的运算…
能使用 +, -, *, /, ++, --, ==, !=, = 等操作符之外,还能使用 mod, in, not in等。
-
if
-
choose (when, otherwise)
-
trim (where, set)
-
foreach
Mybatis 动态SQL 与 (JSTL类似)
if
判断,相当于 java 中 if(){ }
<!--根据参数来更新数据 Integer updateEmpById(Emp emp);-->
<update id="updateEmpById">
UPDATE emp SET
<!-- 需要判断 ,传入什么就更新什么
test: 判断条件
-->
<if test="name != null">
name = #{name} ,
</if>
<if test="bonus != null">
bonus = #{bonus}
</if>
WHERE id = #{id}
</update>
choose - when - otherwise
判断,相当于 java 中 if(){ }else if(){ }else{ }
<!-- 有选择结构的判断 -->
<choose>
<when test="bonus > 800"><!-- if(){} -->
bonus = 800
</when>
<when test="bonus > 600"><!-- else if(){} -->
bonus = 600
</when>
<otherwise><!-- else{} -->
bonus = 100
</otherwise>
</choose>
foreach
循环
<!--Integer deleteByIds(@Param("ids") List<Integer> ids);-->
<delete id="deleteByIds" >
DELETE FROM emp WHERE id in
<!--
collection: 集合,指定遍历那个集合
item: 接收数据的变量
separator: 间隔符
open: 开始符号
close: 关闭的内容
index: 下标
(1015,1016,1017)
-->
<foreach collection="ids" item="id" separator="," open="(" close=")" index="">
#{id}
</foreach>
</delete>
where
用于条件判断
where — and/or …
去掉 前面 多余的 and/or 关键字,自动条件 where 关键字
<delete id="deleteEmpByWhere" >
DELETE FROM emp
<where>
<if test="id != null">
AND id = #{id}
</if>
<if test="name != null">
AND name = #{name}
</if>
</where>
</delete>
set
用于更新
去掉 后面 多余的 逗号 ,自动条件 set关键字
<update id="updateEmpById">
UPDATE emp
<set>
<!-- 需要判断 ,传入什么就更新什么
test: 判断条件
-->
<if test="name != null">
name = #{name},
</if>
<if test="bonus != null">
bonus = #{bonus},
</if>
</set>
WHERE id = #{id}
</update>
trim
替换指定的前后缀
<trim suffix="" suffixOverrides="," prefixOverrides="," prefix="">
<if test="name != null">
,name = #{name},
</if>
<if test="bonus != null">
bonus = #{bonus},
</if>
</trim>
SQL片段
可以写映射文件中的任意内容
可以被引用
声明
<!--声明SQL片段
id : 唯一标识
-->
<sql id="fields">
id,name,salary,bonus,dept_id
</sql>
引用
<select id="selectEmpsByDeptId" resultType="com.hxzy.entity.Emp">
select <include refid="fields" /> from emp where dept_id = #{id}
</select>
bind
<!-- List<Emp> selectEmpByLikeName(@Param("name")String name);
模糊查询:
% : 表示任意个字符
_ : 表示一个字符
-->
<select id="selectEmpByLikeName" resultType="com.hxzy.entity.Emp">
<bind name="n" value="'%'+name+'%'"/>
SELECT * FROM emp WHERE name LIKE #{n}
</select>
10、注解版 Mybatis
注解加哪里: 添加到接口上面
注解 和 xml 可以混用
将方法与SQL语句的绑定写在接口内部
对应的操作有对应的注解
@Select : 查询
@Select("select * from dept where id = #{id}")
//自定义映射规则 相当于 resultMap
@Results(id = "aa",
value = {
@Result(property = "id",column = "id"),
@Result(property = "dName",column = "dept_name"),
@Result(property = "loc",column = "loc"),
@Result(property = "emps",column = "id",
many = @Many(select = "com.hxzy.mapper.EmpMapper.selectEmpsByDeptId")) //一对多映射查询
}
)
Dept queryById(Integer id);
@Insert : 插入
@Insert("insert into dept values( #{id}, #{dName}, #{loc} )")
Integer insertDept(Dept dept);
@Update : 更新
@Update("update dept set dept_name = #{dName} where id = #{id}")
Integer update(Dept dept);
@Delete : 删除
@Delete("delete from dept where id = #{id}")
Integer delete(Integer id);
注 : 复制的查询语句一般不建议使用注解查询,而是使用 xml 映射文件编写
11.插件
分页插件 - Mybatis-PageHelper
引入插件
1.引入 Jar 包
你可以从下面的地址中下载最新版本的 jar 包
- https://oss.sonatype.org/content/repositories/releases/com/github/pagehelper/pagehelper/
- http://repo1.maven.org/maven2/com/github/pagehelper/pagehelper/
由于使用了sql 解析工具,你还需要下载 jsqlparser.jar(需要和PageHelper 依赖的版本一致) :
2.使用 maven
在 pom.xml 中添加如下依赖:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.8</version>
</dependency>
5.1.8 : 需要 Mybatis 版本在 3.4.6 之上
配置拦截器插件
特别注意,新版拦截器是 com.github.pagehelper.PageInterceptor
。 com.github.pagehelper.PageHelper
现在是一个特殊的 dialect
实现类,是分页插件的默认实现类,提供了和以前相同的用法
在 Mybatis 配置文件中
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- 使用下面的方式配置参数,后面会有所有的参数介绍 -->
<property name="param1" value="value1"/>
</plugin>
</plugins>
如何在代码中使用
//第二种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.startPage(1, 10);
List<User> list = userMapper.selectIf(1);
//第三种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.offsetPage(1, 10);
List<User> list = userMapper.selectIf(1);
**重要提示**
`PageHelper.startPage`**方法重要提示*
只有紧跟在`PageHelper.startPage`方法后的**第一个**Mybatis的**查询(Select)**方法会被分页。
**分页插件不支持嵌套结果映射**
**注 : ** startPage() / offsetPage() 两个方法选择其一即可
使用PageInfo
的用法
//获取第1页,10条内容,默认查询总数count
PageHelper.startPage(1, 10);
List<User> list = userMapper.selectAll();
//用PageInfo对结果进行包装
PageInfo page = new PageInfo(emps,5);
//页码
System.out.println("pageNum: "+ page.getPageNum());
//每页显示条数
System.out.println("pageSize: "+ page.getPageSize());
//查询条数
System.out.println("size: "+ page.getSize());
//查询的开始行数
System.out.println("startRow: "+ page.getStartRow());
//查询的结束行数
System.out.println("endRow: "+ page.getEndRow());
//下一页页码
System.out.println("nextPage: "+ page.getNextPage());
//是否是第一页
System.out.println("isFirstPage: "+page.isIsFirstPage());
//是否是最后一页
System.out.println("isLastPage: "+page.isIsLastPage());
//是否有上一页
System.out.println("HasPreviousPage: "+page.isHasPreviousPage());
//是否有下一页
System.out.println("HasNextPage: "+page.isHasNextPage());
//页面显示页码的个数
System.out.println("getNavigatePages: "+page.getNavigatePages());
//展示页码
int[] navigatepageNums = page.getNavigatepageNums();
System.out.println("navigatepageNums: ");
System.out.println(Arrays.toString(navigatepageNums));
12、逆向工程 MyBatis Generator
将数据库中的数据库表生成对应的实体类,及其映射文件和接口
MyBatis生成器(MBG)是MyBatis MyBatis的代码生成器。它将为MyBatis的所有版本生成代码。它将对一个(或多个)数据库表进行内部检查,并将生成可用于访问表的工件。这减轻了设置对象和配置文件以与数据库表进行交互的麻烦。MBG试图对简单CRUD(创建,检索,更新,删除)的大部分数据库操作产生重大影响。您仍将需要手工编写SQL和对象代码以进行联接查询或存储过程。
引入依赖
1.直接引入 jar 包
mybatis-generator-core.jar
2.maven
<!-- MBG 逆向工程-->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.4.0</version>
</dependency>
运行方式:
1.使用 java 命名运行
需要找到 jar 的路径
java -jar mybatis-generator-core-x.x.x.jar -configfile 逆向工程配置文件路径 -overwrite
注: 添加数据库驱动位置
<!-- 数据库驱动包位置 -->
<classPathEntry location="数据库驱动地址" />
2.通过 java 代码运行
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
File configFile = new File("逆向工程配置文件路径");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
3.通过 maven 插件运行
<project>
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.0</version>
</plugin>
</plugins>
</build>
</project>
注: 添加数据库驱动位置
<!-- 数据库驱动包位置 -->
<classPathEntry location="数据库驱动地址" />
逆向工程配置
<?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>
<!-- 数据库驱动包位置 -->
<classPathEntry location="mysql-connector-java-5.1.46.jar" />
<!--上下文整体配置 :指定生成一组对象的环境
targetRuntime:
MyBatis3: 使用该值,MBG将生成与MyBatis 3.0版及更高版本以及JSE 5.0版及更高版本兼容的
对象(例如,Java模型和映射器接口将使用通用类型)。这些生成的对象中的“示例”
方法实际上支持无限的动态where子句
复杂版本 -- 不建议使用
MyBatis3Simple: 用此目标运行时生成的映射器是非常基本的CRUD操作,仅没有“示例”方法且动态SQL很少
简单版
-->
<context id="DB2Tables" targetRuntime="MyBatis3">
<!--是否需要注释
如果属性为false或未指定,则所有生成的元素将包括注释,指示该元素是生成的元素。
如果该属性为true,则不会将注释添加到任何生成的元素。
-->
<commentGenerator>
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!-- jdbcConnection: 数据库连接信息-->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/test"
userId="root"
password="123456">
</jdbcConnection>
<!-- javaTypeResolver : Java类型解析器用于根据数据库列信息计算Java类型-->
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- javaModelGenerator : Java模型生成(生成实体类的位置)
targetPackage: 指定包路径
targetProject: 指定项目路径
-->
<javaModelGenerator targetPackage="com.hxzy.entity2" targetProject="./20200205-mybatis-03/src/main/java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- sqlMapGenerator: 映射文件生成 -->
<sqlMapGenerator targetPackage="com.hxzy.mapper2" targetProject="./20200205-mybatis-03/src/main/resources">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- javaClientGenerator: 接口文件生成 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.hxzy.mapper2" targetProject="./20200205-mybatis-03/src/main/java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!-- 表与实体类的对应设置
tableName: 表名
domainObjectName: 实体类名
-->
<table schema="DB2ADMIN" tableName="emp" domainObjectName="Employee" >
<!--是否使用驼峰命名-->
<property name="useActualColumnNames" value="true"/>
<!--注解自动生成-->
<generatedKey column="ID" sqlStatement="DB2" identity="true" />
<!--字段名与属性名的对应-->
<columnOverride column="JOB_ID" property="jId" />
<!--忽略字段-->
<ignoreColumn column="DEPT_ID" />
</table>
</context>
</generatorConfiguration>
注: 不能级联,不能够生成多表联查
转载:https://blog.csdn.net/weixin_43244120/article/details/106144039