飞道的博客

Java框架中对于Mybatis教程详解

382人阅读  评论(0)

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(配置)

尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。

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(只读)属性可以被设置为 truefalse

异常

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 包

由于使用了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.PageInterceptorcom.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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场