Mybatis 配置

本章目标

掌握Mybatis的各种配置

我们先来看一下mybatis可以配置哪些
在这里插入图片描述
最顶端是 configuration 标签 各种配置标签需要写在其中

properties

properties 标签 这个标签用来设置动态的属性值
在这里插入图片描述
我们可以使用 property 标签 设置动态的值
也可通过 resource属性 引入 properties 文件来设置
还有一个url属性 用来引用网络上的资源
在这里插入图片描述

属性的格式是键值对 key = value 所以我们使用${key}来引用动态的属性值
在这里插入图片描述
也可以在 SqlSessionFactoryBuilder.build() 方法中传入属性值 如
在这里插入图片描述
如定义多个相同的属性(一样的key)
方法传参 优先级最高 属性文件 次之 property设置的属性 最低

从 MyBatis 3.4.2 开始,你可以为(${})占位符指定一个默认值
在这里插入图片描述

如果 ${username} 为空时 此时值为 “root”

在这里插入图片描述
默认值这个特性 默认是关闭的
在这里插入图片描述
我们需要在properties标签里添加这个开启默认值

注意如果你的属性名中保护了关键符号: 如${db:username}
在这里插入图片描述

那么需要自定义分割符
在这里插入图片描述

settings

settings标签 关于Mybatis运行时的重要设置
在这里插入图片描述
有点多 挑重点讲吧

Mybatis 懒加载
lazyLoadingEnabled 开启全局懒加载,所有关联对象都会延迟加载
aggressiveLazyLoading 开启时 懒加载对象 调用任意的方法 都会让立刻加载关联对象
lazyLoadTriggerMethods 当aggressiveLazyLoading关闭时 指定对象的哪些方法触发一次延迟加载。
默认有 equals,clone,hashCode,toString 方法名用,隔开
proxyFactory 指定Mybatis创建可延迟加载对象所用到的代理工具
有cglib和javassist两种 懒加载的方式都是通过代理模式实现AOP的切面拦截
默认javassist(Mybatis 3.3以上)

useColumnLabel 是否支持使用列标题(依赖驱动) 列标题 其实就是别名 默认开启
useGeneratedKeys 是否自动生成主键(不依赖驱动) 默认关闭
autoMappingBehavior 三种模式 NONE, PARTIAL, FULL 默认 PARTIAL
NONE 关闭自动映射 当没有resultMap显示的映射字段,便无法得到结果集,resultType不可用
PARTIAL 映射不包含嵌套结果集的resultMap

这种的可以 相当于 两个查询
在这里插入图片描述
这种不可以
FULL 会自动映射任何复杂的结果集

defaultFetchSize 建议驱动返回的一个数据量 一般用于查询大量数据时的优化

mybatis日志
logImpl 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。默认不指定
一般使用 log4j 和 STDOUT_LOGGING
如果调试的话用 STDOUT_LOGGING 标准输出 直接输出在控制台 不要需要依赖

比较常用的就这些

typeAliases 类型别名

当我们在写映射语句是 返回类型需要写全限名 一个两个还好 多了的话就挺麻烦的
所以我们取个别名就简单了
在这里插入图片描述
当有多个需要多个类型时 且在一个包中时我们可以使用
在这里插入图片描述
注意 指定一个包中的所有类时 别名类首字母小写 如果类中有别名注解 采取注解

typeHandlers 类型处理器

众所周知 mybatis为我们封装了许多的jdbc代码 如参数设置(PreparedStatement),还有从结果集取值 等等

mybatis是如何准确的把jdbc类型和java类型关联起来的呢 没错是typeHandlers 类型处理器
虽然mybatis内置的类型处理器已经足够我们的日常使用 但是还是有用到的时候(现在还没用到)

在这里插入图片描述
关键点 重写 新建 :实现 org.apache.ibatis.type.TypeHandler 接口
继承类 org.apache.ibatis.type.BaseTypeHandler
可以可选地将它映射到一个 JDBC 类型

TypeHandler 是所有类型处理器的接口 有4个方法
第一个是设置参数
第二个是根据列名取值
第三个根据索引取值
第四个是存储过程用的
在这里插入图片描述
我们来实现一下

package typehandlers;
import org.apache.ibatis.type.*;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


public class StringHandler implements TypeHandler<String>{
   
    @Override
    public void setParameter(PreparedStatement preparedStatement, int i, String s, JdbcType jdbcType) throws SQLException {
   
        System.out.println("StringHandler 参数:"+s+",索引:"+i);
        preparedStatement.setString(i,s);
    }

    /**
     * 根据列名得到值
     * @param resultSet
     * @param s
     * @return
     * @throws SQLException
     */
    @Override
    public String getResult(ResultSet resultSet, String s) throws SQLException {
   
        System.out.println("StringHandler 列名:"+s);
        //返回值
        return resultSet.getString(s);
    }

    /**
     * 根据列索引得到值
     * @param resultSet
     * @param i
     * @return
     * @throws SQLException
     */
    @Override
    public String getResult(ResultSet resultSet, int i) throws SQLException {
   
        System.out.println("StringHandler 索引:"+i);
        //返回值
        return resultSet.getString(i);
    }

    /**
     *
     * @param callableStatement
     * @param i
     * @return
     * @throws SQLException
     */
    @Override
    public String getResult(CallableStatement callableStatement, int i) throws SQLException {
   
        System.out.println("StringHandler 索引:"+i);
        //返回值
        return callableStatement.getString(i);
    }
}

此时一个实现TypeHandler接口的类型处理器就写好了
此时我们还需要指定 javaType 和 jdbcType
首先是javaType
如果你选择实现TypeHandler接口 那么有两种方式
typeHandler元素上的javaType属性 最优先
@MappedTypes 注解 次之
如果你选择了继承BaseTypeHandler抽象类 除了以上的两种方式 还有第三种方式 第三种方式是默认实现的 具体是通过TypeReference实现的 在BaseTypeHandler抽象类可以看到继承了TypeReference
在这里插入图片描述

指定了类型之后我们需要把类型处理器注册到Mybatis(注意这种操作是全局的 即只要是 javaType 和 jdbcType 跟处理器一样的字段都会被处理)

<typeHandlers>
   	<typeHandler handler="typehandlers.StringHandler" javaType="String" jdbcType="VARCHAR"/>
</typeHandlers>

这是单个

<typeHandlers>
    <package name="typehandlers"/>
</typeHandlers>

这是多个注册 注意这种方式 只能使用注解来指定类型

注册之后我们来执行一个简单的查询语句
对了贴上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">
<!-- 将xml映射器的namespace属性设置为完整的接口类名称 -->
<mapper namespace="StudentMapper">
    <resultMap id="StudentMap" type="Student">
        <id property="id" column="id"></id>
        <collection property="scoreList" column="id" ofType="Score" select="ScoreMapper.selectByStuid" />
    </resultMap>
    <resultMap id="StudentMaps" type="Student">
        <collection property="scoreList" column="id" ofType="Score"  />
    <
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值