Mybatis配置

概述

Mybatis配置_第1张图片

Mybatis的配置项的顺序不能颠倒,如果颠倒了它们的顺序,那么在mybatis启动阶段就会发生异常,导致无法运行。其中properties、settings、typeAliases、typeHandler、plugin、environments、mappers是常用内容。

Properties属性

Properties属性可以给系统配置一些运行参数,可放在xml或者properties文件中,不可放在java编码中,这样的好处在于方便参数的修改,而不会引起代码的重新编译。

有三种方式使用properties:

1.Property子元素

2.Properties文件

3.程序代码传递

Property子元素


使用property子元素将数据库连接的相关配置

代码见书

这里使用了元素下的子元素定义,用字符串database.username定义数据库用户名,然后就可以在数据库定义中引用这个已经定义好的属性参数,这样配置一次就可以到处引用了,但是如果属性参数有成百上千,显然使用这样的方式不是一个很好的选择,这时候就可以使用properties文件。

使用properties文件

这个文件非常简单,其逻辑就是键值对应,我们可以配置多个键值对应放在一个properties文件中,也可以把多个键值放到多个properties文件中。这种方式方便日后维护和修改。

创建一个文件jdbc.properties放到classpath下

database.driver=com.mysql.jdbc.Driver


database.url=jdbc:mysql://localhost:3306/ssm


database.username=root


database.password=123456

在mybatis中,通过的属性resource来引用properties文件。

按照${database.username}的方法引用properties文件属性到mybatis文件中,这个时候我们维护properties文件就可以维护我们的配置内容了。

程序传递方式传递参数

代码见书

首先使用Resourcs对象读取一个jdbc.properties文件,然后获取了它原来配置的用户名和密码,进行解密并重置,最后使用sqlsessionfactoryBuilder的builder的方法,传递多个properties参数。这将覆盖之前的密文,这样就能连接数据库了。

总结

Mybatis使用properties有三种方式。是有优先级的,最优先的是使用程序传递方式,其次是properties文件,最后properties子元素方式,mybatis会根据优先级来覆盖原先配置的属性值。建议使用propertis文件方式,管理简易,可以从XML文件中剥离出来独立维护。

Setting设置

它能深刻影响Mybatis的底层运行,但是大部分情况使用默认值便可以运行,只需要修改一些常用规则:比如 自动映射(autoMappingBehaviror)(mapUnderscoreToCameCase)、驼峰命名映射()、级联映射(lazyLoadingEnabled)(aggressiveLazyLoading)、是否启动缓存(acheEnabled)、执行器(defaultExecutorType)等。

例如:

Mybatis配置_第2张图片

typeAliases别名

在Mybatis中允许定义一个简写来代表这个,这就是别名,别名分别为系统别名自定义别名。别名由类TypeAliasRegistry(org.apache.ibatis.type.TypeAliasRegistry)去定义。别名不区分大小写。

有时候要通过代码来实现注册别名,例如:

public TypeAliasRegistry(){

registerAlias("string",String.class);        //别名为string

}

事实上Configuration对象也对一些常用的配置项配置了别名。

代码见书

以上就是系统命名,但是不要出现重复命名

自定义别名

比如一个对象(User)需要大量的使用,因此Mybatis也提供了用户自定义别名的规则,我们可以通过TypeAliasRegistry类的registerAlias方法注册,也可以采用配置和扫描的方式来定义。

使用配置文件定义:但是有很多类需要定义别名,不采用这种方式。

如果两个类都在同一包下,可以使用扫描方式:

这样Mybatis将扫描这个包里的类,将其第一个字母变成小写作为别名,比如类Role的别名变成role。有时候会出现重名,比如com.learn.ssm.chapter4.pojo.User这个类,同时我们还增加了对包com.learn.ssm.chapter3.pojo的扫描,那么就会出现异常,这个使用可以使用Mybatis提供的注解@Alias("user3")进行区分。

package com.learn.ssm.chapter3.pojo;

@Alias("user3")

public Class User{

...

}

这样就能避免因为重命名导致扫描失败的问题。

typeHandler类型转换器

在JDBC中,需要在PreparedStatement对象中设置那些已经预编译过的SQL语句的参数。

执行SQL后,会通过ResultSet对象获取到数据库中的数据。

在TypeHandler中分为javaTypejdbcType。前者用于定义java类型,后者用于定义数据库类型。而typeHandler的作用就是承担jdbctype和javatype之间的互相转换。

和别名一样,存在系统定义自定义typehandler。打开源码会发现了他们都继承了BaseTypeHandler。

系统定义TypeHandler

Mybatis使用最多的是StringTypeHandler,它用于字符串转换。

自定义TypeHandler

枚举有特殊的转化规则,这个时候就需要自定义TypeHandler进行处理。

要实现typeHandler就需要去实现接口typehandler,或者继承BaseTypeHandler。

自定义一个————MyTypeHandler:

import java.sql.CallableStatement;


import java.sql.PreparedStatement;


import java.sql.ResultSet;


import java.sql.SQLException


;import org.apache.ibatis.type.JdbcType;


import org.apache.ibatis.type.TypeHandler;import org.apache.log4j.Logger;


public class MyTypeHandler implements TypeHandler{


Logger logger=Logger.getLogger(MyTypeHandler.class);


@Override


public void setParameter(PreparedStatement ps, int i, String parameter,


JdbcType jdbctype) throws SQLException {


logger.info("设置String参数["+parameter+"]");


ps.setString(i, parameter);


}


@Override


public String getResult(ResultSet rs, String columnName) throws SQLException {


String result=rs.getString(columnName);


logger.info("读取String参数1["+result+"]");


return result;


}


@Override


public String getResult(ResultSet rs, int columnIndex) throws SQLException {


String result=rs.getString(columnIndex);


logger.info("读取String参数2["+result+"]");


return result;


}


@Override


public String getResult(CallableStatement cs, int columnIndex)


throws SQLException {


String result=cs.getString(columnIndex);


logger.info("读取String参数3["+result+"]");


return result;


}


}

定义的泛型为String,显然我们要把数据库类型转换为String型。然后实现设置参数和获取结果集的方法。但是需要开启

配置typeHandler:



使用自定义TypeHandler的有两种方法。

这里只能是在select的时候才会使用自定义的TypeHandler

如果要在insert或者update时使用则需要在sql定义中添加相应的内容。如下:

有时候枚举类型很多,我们可以使用包扫描的形式

只是这样我们没法指定jdbctype和javatype,我们需要使用注解方式处理:

@MappedType(String.class)

@MappedjdbcType(jdbcType.VARCHAR)

public class MyTypeHandler implement TypeHandler{

.......

}

枚举typehandler

TypeHandler因为枚举而使用,Mybatis已经定义两个枚举类型支持,

EnumOrdinalTypeHandler:  默认转换类,是按Mybatis根据枚举数组下标索引的方式进行匹配的,它要求数据库返回一个整数作为下标,它会根据下标找到对应的枚举类型。

EnumTypeHandler:  会把使用的名称转换为对应的枚举

ObjectFactory(对象工厂)

当创建结果集时,Mybatis会使用对象工厂来完成创建结果集实例。如果需要自定义,则需要实现接口org.apache.ibatis.relection.factory.factory.ObjectFactory  大部分情况下不需要自定义返回规则。

environments(运行环境)

你可能感兴趣的:(Mybatis配置)