MyBatis配置

前言

        在上一篇中已经介绍了MyBatis的基本结构及简单的实现方法,想要用好MyBatis我们还需要更进一步对它进行配置,接下来将介绍如何对MyBatis进行进一步配置。

Mybatis配置XML文件的层次结构

0a21e472c57fd58c5bdc7485969433c3abe.jpg

接下来我们对XML文件中这些元素进行一一介绍

properties元素

        作用:配置属性的元素,属性能够在配置文件的上下文中使用。

        配制方法:

                a、property子元素

                b、properties配置文件

                c、程序参数传递

        property子元素配置

            配置

           08873012b894f6d48b396bcf947d8705570.jpg

            使用

            ff6f7ab135975898ff326cba2f16a58be9d.jpg

        properties配置文件

            配置文件

            5290e30d9ff2d5c206be07dd82064d63ea0.jpg

            使用,需要在配置文件用引入

            caecdda98daaf68cf5fc75656566442df58.jpg

        程序参数传递

        当开发过程中,一些参数如数据库的登录密码等需要加密,在创建SqlSessionFactory的时候需要解码,手动创建SqlSessionFactory,将参数传递进去。

        代码如下:

        e91db43283335105997b5768bcaf58de1e6.jpg

        优先级

                三种配置方式可能同时出现,而且属性还有可能重复,这个时候就涉及到三种方式的优先级。

                加载顺序如下:

                    1、在properties元素体内指定的属性首先被加载

                    2、properties文件中的属性被加载,并覆盖同名的属性

                    3、读取作为方法参数传递的属性,并覆盖已读取的同名属性

               注:a、实际操作中尽量避免使用混合方式  b、首选方式为properties文件   c、如果要对数据进行特殊操作,将数据存在文件中,用方法参数传递,进行特殊处理,如加密。

设置-settings

        作用:在MyBatis中是比较复杂的排至,比较重要,通过它可以改变MyBatis的行为。即使不配置settings,MyBatis也可以正常工作。

        配置内容表格如下

            09b691eebda5cf444141a5012d678ea1743.jpg

            58c6a7ed13c6295f56a6f473135564a9927.jpg

            7617f8a8be7729cc17fdd828d389f2e6b21.jpg

        代码实例如下:

            e4c9a6ad58ae3f24ca2aee0b18e2485b925.jpg

别名-typeAliases

        作用:当类全称过长的时候,可以给这个类取一个别名,方便引用。

        分类:系统定义别名,自定义别名

        作用域:别名是不分大小写的,并且长期保存在Configuration对象中,当我们使用时,再拿出来。

        系统定义别名在API里面都有详细介绍,这里我们着重讲解自定义方法

        配置方法:

            为每个类单独配置别名

                5d6c6e865c8f2c3bad45a0c49c8af5af086.jpg

                缺点:如果类过多,会造成XML文档复杂。

            自动扫描的形式定义别名

                定义扫描:

             fb785e3814b1e0ea1c8e9c2ee130a18d98b.jpg

               配置别名,使用@Alias注解

            538ed0e942b76d48ce2cf3c9e80d95334ce.jpg

                注:当不使用@Alias的时候,将会默认别名为类名首字母小写。

typeHandler类型处理器

        作用:将参数从javaType转换为jdbcType,或者从数据库中取出数据,将jdbcType转换成javaType。当从预处理语句中获取参数或从结果集中取出参数时,都会使用到注册的typeHandler进行处理。

        分类:系统定义和自定义。

        系统自定义的typeHandler在这里我们多描述,具体请看API。需要注意:数值类型的精度和java的精度长度是不一样的。

        自定义typeHandler

            第一步:实现自定义的typeHandler,实现接口org.apache.ibatis.type.TypeHandler或继承org.apache.ibatis.type.BaseTypeHandler来实现

            代码如下

            a、继承BaseTypeHandler实现

             @MappedTypes定义的是JavaType类型,可以指定那些Java类型被拦截

             @MappedJdbcTypes定义的是JdbcType类型,它需要满足枚举类org.apache.ibatis.type.JdbcType所列的枚举类型

@MappedTypes({Date.class})
@MappedJdbcTypes(JdbcType.VARCHAR)
public class MyStringTypeHandler extends BaseTypeHandler<String> {
    /**
     * 将时间戳字符串存入数据库
     */
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Date parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, String.valueOf(parameter.getTime()));
    }

    /**
     * 把时间戳类型的字符串取出转换为Date
     */
    @Override
    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return new Date(rs.getLong(columnName));
    }

    /**
     * 把时间戳类型的字符串取出转换为Date
     */
    @Override
    public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return new Date(rs.getLong(columnIndex));
    }

    /**
     * 把时间戳类型的字符串取出转换为Date
     */
    @Override
    public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return cs.getDate(columnIndex);
    }
}

            b、实现TypeHandler接口  

@MappedTypes({String.class})
@MappedJdbcTypes(JdbcType.VARCHAR)
public class MyStringTypeHandler implements TypeHandler<String>{

    @Override
    public String getResult(ResultSet rs, String colName) throws SQLException{
        return rs.getString(colName);
    }

    @Override
    public Calendar getResult(ResultSet rs, int index) throws SQLException{
        
        return re.getString(index);
    }

    @Override
    public Calendar getResult(CallableStatement cs, int index) throws SQLException{
        
        return cs.getString(index);
    }

    @Override
    public void setParameter(PreparedStatement ps, int index, String values, JdbcType jt) throws SQLException {
        ps.setTimestamp(index, values);
    }

}

            第二步、在XML中配置

            2a5e3385bbcf62f062db8b5ba39cfe4ef76.jpg 

            第三步、使用typeHandler,应用三种不同的方法使用。

            88e1511881ec57dd234c9d076b96ed7f789.jpg 

            33b7ae87fb36d9bf6007a3b8d2141be81b6.jpg     

        枚举类型typeHandler

            MyBatis内部提供了两个转化枚举类型的typeHandler ,分别是org.apache.ibatis.type.EnumTypeHandler和org.apache.ibatis.type.EnumOrdinalTypeHandler(默认的处理器)

            EnumTypeHandler是使用枚举字符串名称作为参数传递,传递进去的是一个字符串并保存在数据库中,EnumOrdinalTypeHandler是使用整数下标作为参数传递的,保存在数据库中是整数参数。

            系统自带的枚举类型typeHandler和普通和typeHandler用法上是一样的。

            一个简单的性别枚Sex   

public enum Sex{
    MALE(1,"男"),FEMALE(2,"女");
    private int id;
    private String name;
    privae Sex(int id, String name){
        this.id = id;
        this.name = name;
    }
    public int getId(){
        return id;
    }
    public void setId(int id){
        this.id = id;
    }
    public String getName(){
        return name;
    }
    public void setName(String name){
        this.name = name;
    }
    public static Sex getSex(int id){
        if(id == 1){
            return MALE;
        }else if(id == 2){
            return FEMALE;
        }
        return null;
    }
}

        自定义枚举类型typeHandler

            第一步:给出自定义源码

            d76b77ea3fddc1fb80c22bdfd36d513fcef.jpg

            第二步:在Mapper-configer.xml中进行配置

                3be5ef82527413fcb665b1e3e0c4065726b.jpg

ObjectFactory

        作用:当结果返回时,使用ObjectFactory(对象工厂)去构建POJO,可以定制自己的工厂对象,默认是org.apache.ibatis.reflection.factory.DefaultObjectFactory。

        还可以自定义对象工厂,自定义的时候需要继承DefaultObjectFactory类,然后在配置文件中声明。

environments配置环境

        作用:用来注册数据源,可以注册多个数据源,每个数据源分为两大部分,一个是数据源的配置,另外一个是数据库事务的配置。

        示例:

        d0366e44643a5f8da6998714f58e8f5e85e.jpg

        数据库事务中type属性的取值

            a、JDBC,采用JDBC方式管理事务,经常使用在独立编码中

            b、MANAGED,采用容器方式管理事务,在JNDI数据源中常用

            c、自定义,自定义事务管理方法

       dataSource标签中,type属性的取值(数据库连接方式)

            a、UNPOOLED,非连接池数据库

            b、POOLED,连接池数据库

            c、JNDI,JNDI数据源

            d、自定义数据源

       使用自定义数据源,必须实现org.apache.ibatis.datasource.DataSourceFactory接口。

databaseIdProcider数据库厂商标识

        作用:指定SQL到对应的数据库厂商提供的数据库中运行。

        系统默认配置

        d54343ec614b3c2f818b01cc29353d7c197.jpg

        type=“DB_VENDOR”是启动MyBatis内部注册的策略器:

            ①MyBatis会将你的配置读入Configuration类里面。

            ②在连接数据库后调用getDatabaseProductName()方法去获取数据库的信息。

            ③用配置的name去做匹配得到DatabaseId

       在mapper中应用

            036c794595c0dd32f8d804851f8f09daf3a.jpg

        不使用系统默认规则

        自定义需要实现databaseIdProvider接口,并且实现配置。

        第一步、实现接口

            6df7f14ce3de3b681713e37a93cea98efc2.jpg

            第二步、配置

            53eff3d2463354c285c43b62a33b1b81ee8.jpg

引入映射器的方法

        第一种,用文件路径引入映射器

        d1d691351f172e8a18e233cb9f805ee4949.jpg

        第二种,用包名引入映射器

        632526273ebac3cfe5a9abd434b1a47c26e.jpg

        第三种,用类注册引入映射

        7dde4077e4d48c9445954503e6c795b2114.jpg

        第四种,userMapper.xml引入映射器

        6ac8bad1c92072111369899496d2d1aa4ef.jpg

总结

        到现在为止,我们已经较全面介绍了mybatis-config.xml配置文件中的内容,剩下插件我们没有介绍,插件应用比较复杂,也比较危险,我们在后期专门介绍。上面介绍的内容中着重掌握数据源的配置,和引入映射器的方法,这两个是核心。下一篇着重介绍映射器的配置。

        

转载于:https://my.oschina.net/u/3942106/blog/1935993

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值