mybatis与其逆向工程

时间:2022-07-22
本文章向大家介绍mybatis与其逆向工程,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。myBatis在目前在SSM框架中做为持久层在使用。

MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

Mybatis处理流程

(1)加载配置并初始化

触发条件:加载配置文件 处理过程:将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。

(2)接收调用请求

触发条件:调用Mybatis提供的API 传入参数:为SQL的ID和传入参数对象 处理过程:将请求传递给下层的请求处理层进行处理。

(3)处理操作请求

触发条件:API接口层传递请求过来 传入参数:为SQL的ID和传入参数对象 处理过程: (A)根据SQL的ID查找对应的MappedStatement对象。 (B)根据传入参数对象解析MappedStatement对象,得到最终要执行的SQL和执行传入参数。 (C)获取数据库连接,根据得到的最终SQL语句和执行传入参数到数据库执行,并得到执行结果。 (D)根据MappedStatement对象中的结果映射配置对得到的执行结果进行转换处理,并得到最终的处理结果。 (E)释放连接资源。

(4)返回处理结果将最终的处理结果返回。

Mybatis核心组件

配置关系

SqlSessionFactoryBuilder(构造器)

(1)作用:根据配置信息或者代码来生成SqlSessionFactory

SqlSessionFactory(工厂接口)

(1)作用:生产SqlSession会话 实例代码:sqlSession = sqlSessionFactory.openSession();

SqlSession(会话)

(1)作用:1)获取映射器,让映射器通过命名空间和方法名称找到对应的SQL,发送给数据库执行后返回结果;2)通过update、insert、select、delete等方法,带上SQL的id来操作在XML中配置好的SQL,从而完成工作,与此同时它也支持事务,通过commit、rollback方法提交或者回滚事务。

(2)四大对象:

1)执行器(Executor):调度StatementHandler、ParameterHandler、ResultHandler等来执行对应的SQL。

种类:SIMPLE:简易执行器,默认执行器

REUSE:一种执行器重用预处理语句

BATCH:执行器重用语句和批量更新,针对批量专用的执行器。

执行过程:步骤一,MyBatis根据Configuration来构建StatementHandler

步骤二,使用prepareStatement方法,对SQL编译并对参数进行初始化

步骤三,调用prepareStatement的prepare()进行预编译和基础设置,再通过StatementHandler的parameterize()来设置参数并执行

步骤四,resultHandler再组装查询结果返回给调用者。

2)数据库会话器(StatementHandler):使用数据库的Statement(PrepareStatement)执行操作,四大对象的核心,起到承上启下的作用。

种类:SimpleStatementHandler:对应SIMPLE执行器

PrepareStatementHandler:对应REUSE执行器

CallableStatementHandler:对应BATCH执行器

3)参数处理器(ParameterHandler):用于SQL对参数的处理
4)结果处理器(ResultSetHandler):进行最后数据集(ResultSet)的封装返回处理。
运行原理:SqlSession通过Executor(执行器)创建StatementHandler来运行的
Sql Mapper(映射器)

(1) 作用:1)定义参数、2)描述缓存、3)描述SQL语句、4)定义查询结果和POJO的映射关系

mybatis.png

逆向工程

MyBatis的一个主要的特点就是需要程序员自己编写sql,那么如果表太多的话,难免会很麻烦,所以mybatis官方提供了一个逆向工程,可以针对单表自动生成mybatis执行所需要的代码(包括mapper.xml、mapper.java、po..)。一般在开发中,常用的逆向工程方式是通过数据库的表生成代码。

使用MyBatis的逆向工程,需要导入逆向工程的jar包,我用的是mybatis-generator-core-1.3.2.jar。

下载逆向工程地址:

https://github.com/mybatis/generator/releases

<?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>
    <context id="testTables" targetRuntime="MyBatis3">
        <commentGenerator>
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
            connectionURL="jdbc:mysql://localhost:3306/taotao" userId="root"
            password="root">
        </jdbcConnection>
        <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和 
            NUMERIC 类型解析为java.math.BigDecimal -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <!-- targetProject:生成PO类的位置 -->
        <javaModelGenerator targetPackage="com.taotao.pojo"
            targetProject=".src">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false" />
            <!-- 从数据库返回的值被清理前后的空格 -->
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!-- targetProject:mapper映射文件生成的位置 -->
        <sqlMapGenerator targetPackage="com.taotao.mapper" 
            targetProject=".src">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>
        <!-- targetPackage:mapper接口生成的位置 -->
        <javaClientGenerator type="XMLMAPPER"
            targetPackage="com.taotao.mapper" 
            targetProject=".src">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>
        <!-- 指定数据库表 -->
        <table schema="" tableName="tb_content"></table>
        <table schema="" tableName="tb_content_category"></table>
        <table schema="" tableName="tb_item"></table>
        <table schema="" tableName="tb_item_cat"></table>
        <table schema="" tableName="tb_item_desc"></table>
        <table schema="" tableName="tb_item_param"></table>
        <table schema="" tableName="tb_item_param_item"></table>
        <table schema="" tableName="tb_order"></table>
        <table schema="" tableName="tb_order_item"></table>
        <table schema="" tableName="tb_order_shipping"></table>
        <table schema="" tableName="tb_user"></table>
    </context>
</generatorConfiguration>

配置自己的信息,在java代码中加载,并运行java代码即可生成逆向工程代码。

数据库驱动、地址、用户名、密码
POJO类、mapper接口、mapper映射文件生成的位置
指定数据表

配置完成之后运行GeneratorSqlmap.java中的main方法就会生成对应数据表的代码,生成后记得右键项目名刷新。如果需要再次生成,一定要记得先把原来生成的删除。