Mybatis入门 (含过程debug)

这篇博客详细介绍了Mybatis的配置和使用,包括全局配置文件、映射文件、动态SQL、缓存机制以及整合ehcache和Spring。内容涵盖了从properties、settings到mappers的配置,深入讲解了$和#的区别、动态SQL的各种元素,还涉及了一级和二级缓存的原理与配置,并给出了常见的debug记录及解决方案。
摘要由CSDN通过智能技术生成

https://www.bilibili.com/video/BV1mW411M737

前言

连接数据库的工具:
JDBC —> Dbutils(QueryRunner) —> JdbcTemplate

连接数据库主要流程:

  • 编写sql
  • 预编译
  • 设置参数
  • 执行sql
  • 封装结果

Hibernate:全自动ORM(Object Relation Mapping)框架:旨在消除sql,HQL
缺点:

  • 长难复杂SQL,对Hibernate而言处理也不容易
  • 难以进行sql优化(sql由框架自动生成)
  • 全映射,无法选取部分字段(一些场景,mysql选取部分字段效率更优)

mybatis:半自动化的持久化层框架(轻量级)

  • 把sql和java编码分离,sql由开发人员编写
  • 原是apache的一个开源项目ibatis(Internet和abatis的组合),后迁移至Google code旗下

全局配置文件

mybatis的配置文件包含了影响mybatis行为甚深的设置(settings)和属性(properties)信息。文档的顶层结构如下:

  • configuration
    • properties 属性
    • settings 设置
    • typeAliases 类型命名
    • typeHandlers 类型处理器
    • objectFactory 对象工厂
    • plugins 插件
    • environments 环境
      • environment 环境变量
      • transactionManager 事务管理器
      • dataSource 数据源
    • databaseIdProvider 数据库厂商标识
    • mappers 映射器
<?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>
    <!--
        1. mybatis可以用properties引入外部properties配置文件的内容
        resource引入类路径下的资源 resource="application.properties"
        url 引入网络路径或磁盘路径下的资源 url="src/main/resources/application.properties"
     -->
    <properties resource="application.properties" />
    <settings>
        <setting name="cacheEnabled" value="false"/>
        <setting name="" value=""/>
    </settings>
    <!--
            3. 别名处理器:为java类起别名,不区分大小写
     -->
    <typeAliases>
<!--        type: java类-->
<!--        alias: 别名,不指定就是默认别名(类名小写)-->
        <typeAlias alias="Employee" type="com.km.mpdemo001.pojo.Employee"/>
<!--        package 为某个包下的所有类起批量别名
            name:  指定包名(为当前包以及下面所有后代包的每一个类都起一个默认别名(类名小写)
            -->
        <package name="com.km.mpdemo001.pojo" />
    </typeAliases>
    <typeHandlers>
<!--        类型转换器,版本高自动配置-->
<!--        <typeHandler handler="org.apache.ibatis.type.InstantTypeHandler"/>-->
    </typeHandlers>
    <objectFactory type=""/>
    <plugins>
        <plugin interceptor="Executor"/>
    </plugins>

    <!--
                可配置多种环境,default: 指定使用环境的id,可以达到快速切换环境的效果
    -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <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>
        <!--
                id: 环境的唯一标识
                transactionManager  type:有两种取值JDBC/MANAGED;
                            或自定义事务管理器,实现TransactionFactory接口,type指定为全类名
                dataSource type: 支持 UNPOOLED / POOLED/ JNDI

        -->
        <environment id="exclude">
            <transactionManager type="MANAGED"/>
            <dataSource type="UNPOOLED"/>
        </environment>
    </environments>

    <databaseIdProvider type="DB_VENDOR">
<!--        为不同的数据库厂商起别名
        在sql语句中指定数据库别名 databaseId,当语句的id名相同时,优先选取databaseId对应的
         <select id="selectEmployee" resultType="com.km.mpdemo001.pojo.Employee"
            databaseId="mysql">
            select * from employee where id = #{id}
          </select>
-->
        <property name="MySQL" value="mysql"/>
        <property name="SQL Server" value="sql_server"/>
    </databaseIdProvider>
    <mappers>
<!--        resource 引用类路径下的sql映射文件-->
        <mapper resource="EmployeeMapper.xml"/>
<!--        url 引用网络路径或磁盘路径下的sql映射文件-->
        <mapper url="file://c/xxx.xml"/>
<!--        class 注册接口-->
        <mapper class="com.km.mpdemo001.pojo.EmployeeImpl" />
<!--        package 批量注册,需要映射文件与类同包下,package写包名-->
        <package name=""/>
    </mappers>
</configuration>

引入dtd约束

mybatis jar包中有两个dtd文件 (eclipse需要引入,idea添加依赖后自动引入了)
http://mybatis.org/dtd/mybatis-3-config.dtd
http://mybatis.org/dtd/mybatis-3-mapper.dtd
引入会有标签提示。

properties

mybatis可以用properties引入外部properties配置文件的内容

  • resource引入类路径下的资源 resource=“application.properties” (当一个文件夹是
  • url 引入网络路径或磁盘路径下的资源

在这里插入图片描述
当idea中文件夹出现上面root相关的标识时,表示是idea管理下的根目录,那么写类路径的时候可以直接从根目录的下一级目录开始写。

settings

这是mybatis中的极为重要的调整设置

设置参数 描述 有效值 默认值
cacheEnabled 设置影响的所有映射器中设置的缓存的全局开关 true/false TRUE
lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态 true/false FALSE
useColumnLabel 使用列标签来代替列名。不同的驱动在这方面会有不同的表现。具体可参考驱动文档或测试这两种不同的模式来观察所用驱动的结果。 true/false TRUE
defaultStatementTimeout 设置超时时间。它决定驱动等待数据库响应的秒数。 Any positive integer Not Set(null)
mapUnderscoreToCamelCase 是否开启自动驼峰命名规则 true/false FALSE

typeAliases

别名处理器:对应全类名和别名

	<typeAliases>
<!--        type: java类-->
<!--        alias: 别名,不指定就是默认别名(类名小写)-->
        <typeAlias alias="Employee" type="com.km.mpdemo001.pojo.Employee"/>
<!--        package 为某个包下的所有类起批量别名
            name:  指定包名(为当前包以及下面所有后代包的每一个类都起一个默认别名(类名小写)
            -->
        <package name="com.km.mpdemo001.pojo"/>
    </typeAliases>

也可以使用注解

@Alias("emp")
public class Employee {
   
}

另外:起别名不要与java默认的重复
int --> _int , byte --> _byte …
Integer --> integer , Byte --> byte …

typeHandlers

解决数据库和java变量数据类型兼容问题
jsr310:时间日期API,mybatis-typehandlers-jsr310.
mybatis3.4以前需要手动注册,之后支持自动注册

objectFactory

plugins

插件可以拦截方法 intercept calls to at certain points with the execution of a mapped statement。

  • Executor
  • ParameterHandler
  • ResultSetHandler
  • StatementHandler

environments

可配置多环境

  • transactionManager
    • type:
      • JDBC: 连接数据库
      • MANAGED:不提交事务也不回滚,让容器管理transaction的生命周期。e.g. JEE Application Server Context
      • 或自定义
  • dataSource type
    • UNPOOLED() : 不使用连接池技术
    • POOLED
    • JNDI(JndiDataSourceFactory):
    • 自定义:实现DataSourceFactory接口

databaseIdProvider

驱动getDatabaseProductName() 得到数据库厂商标识
支持多数据库厂商

  • DB_VENDOR(VendorDatabaseIdProvider):
<databaseIdProvider type="DB_VENDOR">
<!--        为不同的数据库厂商起别名
        在sql语句中指定数据库别名 databaseId,当语句的id名相同时,优先选取databaseId对应的
         <select id="selectEmployee" resultType="com.km.mpdemo001.pojo.Employee"
            databaseId="mysql">
            select * from employee where id = #{id}
          </select>
-->
        <property name="MySQL" value="mysql"/>
        <property name="SQL Server" value="sql_server"/>
    </databaseIdProvider>

mappers

  • resource 引用类路径下的sql映射文件
  • url 引用网络路径或磁盘路径下的sql映射文件
  • class 注册接口
    • 若有sql映射文件,映射文件名必须和接口同名,并且放在与接口同一目录下
    • 没有sql映射文件,利用注解写在接口上
  • package 批量注册

推荐

  • 比较重要的和复杂的DAO接口来写sql映射文件
  • 不太重要的和简单的可以使用注解来映射。

src和conf都会被加载到bin路径下,bin路径才是类路径 那么当src和conf中存在 相同的包路径,它们将会被合并。
那么使用批量注册时,则不需要sql与java文件放在一起,只须它们的包路径相同即可。

映射文件

  • cache 命名空间的二级缓存配置

  • cache-ref 其它命名空间缓存配置的引用。

  • resultMap 自定义结果集映射

  • parameterMap (已废弃)老式风格的参数映射

  • sql 抽取可重用语句块

  • insert

  • update

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值