10.框架MyBatis

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

一、基本概念

        MyBatis 是一个开源、轻量级的数据持久化框架是 JDBC 和 Hibernate 的替代方案。MyBatis 前身为 IBatis2002 年由 Clinton Begin 发布。2010 年从 Apache 迁移到 Google并改名为 MyBatis2013 年又迁移到了 Github。MyBatis 内部封装了 JDBC简化了加载驱动、创建连接、创建 statement 等繁杂的过程开发者只需要关注 SQL 语句本身。MyBatis 支持定制化 SQL、存储过程以及高级映射可以在实体类和 SQL 语句之间建立映射关系是一种半自动化的 ORM 实现。

        导入依赖

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.5</version>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.7</version>
</dependency>

二、配置

        mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--mybatis-config.xml文件中的元素节点是有一定顺序的,节点位置必须按以上位置排序,否则会编译错误-->
    <properties resource="classpath:jdbc.properties"/><!-- 指定外部资源文件 -->
    <settings><!-- 配置 MyBatis 的运行时行为,它能深刻的影响 MyBatis 的底层运行,一般不需要大量配置,大部分情况下使用其默认值即可 -->
        <setting name="" value=""/>
    </settings>
    <typeAliases /><!-- 为了不在任何地方都指定类的全限定名我们可以使用 typeAliases 标签定义一个别名 -->
    <typeHandlers /><!-- typeHandlers 主要将获取的数据合理地转化为 Java 类型 -->
    <objectFactory type=""/><!-- 对象工厂 -->
    <plugins><!-- 插件 -->
        <plugin interceptor=""/>
    </plugins>
    <environments default=""><!-- 配置 MyBatis 的多套运行环境将 SQL 映射到多个不同的数据库上 -->
        <environment id=""><!-- 环境变量 -->
            <transactionManager type=""/><!-- 事务管理器 -->
            <dataSource  type=""><!-- 数据源 -->
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <databaseIdProvider  type=""/><!-- 数据库厂商标识 -->
    <mappers/><!-- 指定 MyBatis SQL 映射文件的路径 -->

</configuration>

        配置类

public class MybatisConfig {

    @Bean//配置sqlSessionFactory
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {

        SqlSessionFactoryBean factory=new SqlSessionFactoryBean();
        factory.setConfigurationProperties(new Properties());
        factory.setConfiguration(new Configuration());//设置
        factory.setTypeAliasesPackage("");//别名
        factory.setTypeHandlersPackage("");
        factory.setObjectFactory(new DefaultObjectFactory());
        factory.setPlugins();//插件
        factory.setTransactionFactory(new JdbcTransactionFactory());
        factory.setDataSource(dataSource);//数据源
        factory.setEnvironment("");
        factory.setDatabaseIdProvider(new VendorDatabaseIdProvider());
        factory.setMapperLocations(new ClassPathResource(""));//mapper路径
        return factory.getObject();

    }

}

三、Mapper

        Mapper 映射器是 MyBatis 中最重要的文件文件中包含一组 SQL 语句例如查询、添加、删除、修改这些语句称为映射语句或映射 SQL 语句。在 dao 层 MyBatis 将 mapper 接口和mapper.xml 文件建立起联系接口方法和 SQL 语句对应调用接口方法即可执行 SQL 。

        在 java 目录创建 mapper 接口并声明 @Mapper 注册为 bean 在 resources 目录创建 mapper.xml 注意使两者的类路径相同。

        Mapper 映射器的主要元素

元素名称描述备注
mapper映射文件的根节点只有 namescape 一个属性namescape 作用如下
  • 用于区分不同的 mapper全局唯一
  • 绑定DAO接口即面向接口编程。当 namescape 绑定某一接口后可以不用写该接口的实现类MyBatis 会通过接口的完整限定名查找到对应的 mapper 配置来执行 SQL 语句。因此 namescape 的命名必须要跟接口同名。
select查询语句最常用、最复杂的元素之一可以自定义参数返回结果集等
insert插入语句执行后返回一个整数代表插入的条数
update更新语句执行后返回一个整数代表更新的条数
delete删除语句执行后返回一个整数代表删除的条数
parameterMap定义参数映射关系即将被删除的元素不建议使用
sql允许定义一部分的 SQL然后在各个地方引用它例如一张表列名我们可以一次定义在多个 SQL 语句中使用
resultMap用来描述数据库结果集与对象的对应关系它是最复杂、最强大的元素提供映射规则
cache配置给定命名空间的缓存-
cache-ref其它命名空间缓存配置的引用-

        ​select 标签常用属性

属性名称描 述备注
id它和 Mapper 的命名空间组合起来使用是唯一标识符供 MyBatis 调用如果命名空间+id不唯一那么 MyBatis 抛出异常
parameterType表示传入 SQL 语句传入参数类型的全限定名或别名。它是一个可选属性MyBatis 能推断出具体传入语句的参数支持基本数据类型和 JavaBean、Map 等复杂数据类型
resultTypeSQL 语句执行后返回的类型全限定名或者别名。如果是集合类型返回的是集合元素的类型返回时可以使用 resultType 或 resultMap 之一-
resultMap它是映射集的引用与 <resultMap> 元素一起使用返回时可以使用 resultType 或 resultMap 之一是 MyBatis 最复杂的元素可以配置映射规则、级联、typeHandler 等
flushCache用于设置在调用 SQL 语句后是否要求 MyBatis 清空之前查询的本地缓存和二级缓存默认值为 false如果设置为 true则任何时候只要 SQL 语句被调用都将清空本地缓存和二级缓存
useCache启动二级缓存的开关默认值为 true表示将査询结果存入二级缓存中-
timeout用于设置超时参数单位是秒s超时将抛出异常-
fetchSize获取记录的总条数设定默认值是数据库厂商提供的 JDBC 驱动所设置的条数
statementType告诉 MyBatis 使用哪个 JDBC 的 Statement 工作取值为 STATEMENTStatement、 PREPAREDPreparedStatement、CALLABLECallableStatement-
resultSetType这是针对 JDBC 的 ResultSet 接口而言其值可设置为 FORWARD_ONLY只允许向前访问、SCROLL_SENSITIVE双向滚动但不及时更新、SCROLLJNSENSITIVE双向滚动及时更新-

        insert update 标签常用属性

属性名称描述备注
id它和 Mapper 的命名空间组合起来使用是唯一标识符供 MyBatis 调用如果命名空间+ id 不唯一那么 MyBatis 抛出异常
parameterType传入 SQL 语句的参数类型的全限定名或别名它是一个可选属性。支持基本数据类型和 JavaBean、Map 等复杂数据类型
keyProperty该属性的作用是将插入操作的返回值赋给 PO 类的某个属性通常为主键对应的属性。如果是联合主键可以将多个值用逗号隔开。-
useGeneratedKeys该属性用来设置是否使用 JDBC 提供的 getGenereatedKeys() 方法获取数据库内部产生的主键并赋值到 keyProperty 属性设置的请求对象的属性中例如 MySQL、SQL Server 等自动递增的字段其默认值为 false。该属性值设置为 true 后会将数据库生成的主键回填到请求对象中以供其他业务使用。
flushCache该属性用于设置执行该操作后是否会清空二级缓存和本地缓存默认值为 true。-
timeout该属性用于设置执行该操作的最大时限如果超时就抛异常。-
databaseId取值范围 oracle、mysql 等表示数据库厂家元素内部可通过 <if test="_databaseId = 'oracle'"> 来为特定数据库指定不同的 sql 语句。MyBatis 可以根据不同的数据库厂商执行不同的语句这种多厂商的支持是基于映射语句中的 databaseId 属性。 MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。 如果同时找到带有 databaseId 和不带 databaseId 的相同语句则后者会被舍弃。
keyColumn该属性用于设置第几列是主键当主键列不是表中的第 1 列时就需要设置该属性。如果是联合主键可以将多个值用逗号隔开。-

        delete 标签常用属性

属性名称描述备注
id它和 Mapper 的命名空间组合起来使用是唯一标识符供 MyBatis 调用 如果命名空间+ id 不唯一那么 MyBatis 抛出异常
parameterType传入 SQL 语句的参数类型的全限定名或别名它是一个可选属性。支持基本数据类型和 JavaBean、Map 等复杂数据类型
flushCache该属性用于设置执行该操作后是否会清空二级缓存和本地缓存默认值为 true。-
timeout该属性用于设置 SQL 执行的超时时间如果超时就抛异常。-
statementType执行 SQL 时使用的 statement 类型, 默认为 PREPARED可选值STATEMENTPREPARED 和 CALLABLE。 -

        resultMap 元素的构成

<resultMap id="" type="">
    <constructor><!-- 类再实例化时用来注入结果到构造方法 -->
        <idArg/><!-- ID参数结果为ID -->
        <arg/><!-- 注入到构造方法的一个普通结果 --> 
    </constructor>
    <id/><!-- 用于表示哪个列是主键 -->
    <result/><!-- 注入到字段或JavaBean属性的普通结果 -->
    <association property=""/><!-- 用于一对一关联 -->
    <collection property=""/><!-- 用于一对多、多对多关联 -->
    <discriminator javaType=""><!-- 使用结果值来决定使用哪个结果映射 -->
        <case value=""/><!-- 基于某些值的结果映射 -->
    </discriminator>
</resultMap>

四、动态SQL

        动态 SQL 是 MyBatis 的强大特性之一。在 JDBC 或其它类似的框架中开发人员通常需要手动拼接 SQL 语句。动态 SQL 大大减少了编写代码的工作量更体现了 MyBatis 的灵活性、高度可配置性和可维护性。

        动态 SQL 包括以下几种元素

元素作用备注
if判断语句单条件分支判断
choose,when,otherwise相当于 Java 中的 switch case 语句多条件分支判断
trim,where辅助元素用于处理一些SQL拼装问题
foreach循环语句在in语句等列举条件常用
bind辅助元素拼接参数
<if test="判断条件">
    SQL语句
</if>

<choose>
    <when test="判断条件1">
        SQL语句1
    </when >
    <when test="判断条件2">
        SQL语句2
    </when >
    <when test="判断条件3">
        SQL语句3
    </when >
    <otherwise>
        SQL语句4
    </otherwise>
</choose>

<where>
    <if test="判断条件">
        AND/OR ...
    </if>
</where>

<foreach item="item" index="index" collection="list|array|map key" open="(" separator="," close=")">
    参数值
</foreach>

<bind name="" value="" />

<trim prefix="前缀" suffix="后缀" prefixOverrides="忽略前缀字符" suffixOverrides="忽略后缀字符">
    SQL语句
</trim>

 

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6