Mybatis全局配置文件
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的
POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
mybatis和hibernate的比较
mybatis | hibernate |
---|---|
半自动ORM框架 | 全自动ORM框架 |
必须写SQL | 可以不写SQL |
事务处理 | 事务处理 |
缓存都支持 | 缓存都支持,二级缓存比mybatis更好 |
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置(settings)和属性(properties)信息。
文档的顶层结构如下:
configuration 配置
properties 属性
settings 设置
typeAliases 类型别名
typeHandlers 类型处理器
objectFactory 对象工厂
plugins 插件
environments 环境
environment 环境变量
transactionManager 事务管理器
dataSource 数据源
databaseIdProvider 数据库厂商标识
mappers 映射器
configuration:包裹所有配置标签,是整个配置文件的顶级标签。
properties:属性,该标签可以引入外部配置的属性,也可以自己配置。该配置标签所在的同一个配置文件中的其他配置均可引用此配置中的属性。
setting:全局配置参数,用来配置一些改变运行时行为的信息,例如是否使用缓存机制,是否使用延迟加载,是否使用错误处理机制等。并且可以设置最大并发请求数量、最大并发事务数量,以及是否启用命令空间等。
typeAliases:类型别名,用来设置一些别名来代替 Java 的长类型声明,如 java.lang.int 变为 int,减少配置编码的冗余。
typeHandlers:类型处理器,将 sql 中返回的数据库类型转换为相应 Java 类型的处理器配置。
objectFactory:对象工厂,实例化目标类的工厂类配置。
plugins:插件,可以通过插件修改 MyBatis 的核心行为,例如对语句执行的某一点进行拦截调用。
environments:环境集合属性对象,数据库环境信息的集合。在一个配置文件中,可以有多种数据库环境集合,这样使 MyBatis 将 sql 同时映射至多个数据库。
environment:环境子属性对象,数据库环境配置的详细配置。
transactionManager:事务管理,指定 MyBatis 的事务管理器。
dataSource:数据源,使其中的 type 指定数据源的连接类型,在标签对中可以使用 property 属性指定数据库连接池的其他信息。
mappers:映射器,配置 sql 映射文件的位置,告知 MyBatis 去哪里加载 sql 映射配置。
完整示例:
<?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.properties属性引入外部配置文件 -->
<properties resource="org/mybatis/example/config.properties">
<!-- property里面的属性全局均可使用 -->
<property name="username" value="root"/>
<property name="password" value="root"/>
</properties>
<!-- 2.全局配置参数 -->
<settings>
<!-- 设置是否启用缓存 -->
<setting name="cacheEnabled" value="true"/>
<!-- 设置是否启用懒加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
<!-- 3.别名设置 -->
<typeAliases>
<typeAlias alias="student" type="cn.com.mybatis.student"/>
<typeAlias alias="teacher" type="cn.com.mybatis.teacher"/>
<typeAlias alias="integer" type="java.lang.Integer"/>
</typeAliases>
<!-- 4.类型转换器 -->
<typeHandlers>
<!-- 一个简单类型转换器 -->
<typeHandler handler="org.mybatis.example.ExampleTypeHandler"/>
</typeHandlers>
<!-- 5.对象工厂 -->
<objectFactory type="org.mybatis.example.ExampleObjectFactory">
<!-- 对象工厂注入的参数 -->
<property name="someProperty" value="100"/>
</objectFactory>
<!-- 6.插件 -->
<plugins>
<plugin interceptor="org.mybatis.example.ExamplePlugin">
<property name="someProperty" value="100"/>
</plugin>
</plugins>
<!-- 7.environments数据库环境配置 -->
<!-- 和Spring整合后environments配置将被废除 -->
<environments default="development">
<environment id="development">
<!-- 使用JDBC事务管理 -->
<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>
</environments>
<!-- 加载映射文件 -->
<mappers>
<mapper resource="com/i/mapper/StudentMapper.xml"/>
<mapper resource="com/i/mapper/TeacherMapper.xml"/>
</mappers>
</configuration>
设置(settings)
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。 下表描述了设置中各项的意图、默认值等。
设置名 | 描述 | 有效值 | 默认值 |
---|---|---|---|
cacheEnabled | 全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存 | true/false | true |
lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。 | true/false | false |
aggressiveLazyLoading | 当开启时,任何方法的调用都会加载该对象的所有属性。 否则,每个属性会按需加载(参考 lazyLoadTriggerMethods) | true/false | false (在 3.4.1 及之前的版本默认值为 true) |
multipleResultSetsEnabled | 是否允许单一语句返回多结果集(需要驱动支持) | true/false | true |
useColumnLabel | 使用列标签代替列名。 不同的驱动在这方面会有不同的表现,具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果。 | true/false | true |
useGeneratedKeys | 允许 JDBC 支持自动生成主键,需要驱动支持。 如果设置为 true 则这个设置强制使用自动生成主键,尽管一些驱动不能支持但仍可正常工作(比如 Derby) | true/false | False |
autoMappingBehavior | 指定 MyBatis 应如何自动映射列到字段或属性。NONE 表示取消自动映射;PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。FULL 会自动映射任意复杂的结果集(无论是否嵌套)。 | NONE, PARTIAL, FULL | PARTIAL |
autoMappingUnknownColumnBehavior | 指定发现自动映射目标未知列(或者未知属性类型)的行为。NONE : 不做任何反应WARNING : 输出提醒日志 (‘org.apache.ibatis.session.AutoMappingUnknownColumnBehavior’ 的日志等级必须设置为 WARN) FAILING : 映射失败 (抛出 SqlSessionException) | NONE, WARNING, FAILING | NONE |
defaultExecutorType | 配置默认的执行器。 SIMPLE 就是普通的执行器; REUSE 执行器会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新。 | SIMPLE REUSE BATCH | SIMPLE |
defaultStatementTimeout | 设置超时时间,它决定驱动等待数据库响应的秒数。 | 任意正整数 | 未设置 (null) |
defaultFetchSize | 为驱动的结果集获取数量(fetchSize)设置一个提示值。 此参数只可以在查询设置中被覆盖。 | 任意正整数 | 未设置 (null) |
defaultResultSetType | Specifies a scroll strategy when omit it per statement settings. (Since: 3.5.2) | FORWARD_ONLY | SCROLL_SENSITIVE |
safeRowBoundsEnabled | 允许在嵌套语句中使用分页(RowBounds)。 如果允许使用则设置为 false。 true | false False | |
safeResultHandlerEnabled | 允许在嵌套语句中使用分页(ResultHandler)。 如果允许使用则设置为 false。 | true/false | True |
mapUnderscoreToCamelCase | 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射。 | true/false | False |
localCacheScope | MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。 默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据。 | SESSION/STATEMENT | SESSION |
jdbcTypeForNull | 当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。 某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER。 | JdbcType 常量,常用值:NULL, VARCHAR 或 OTHER。 | OTHER |
lazyLoadTriggerMethods | 指定哪个对象的方法触发一次延迟加载。 | 用逗号分隔的方法列表。 | equals,clone,hashCode,toString |
defaultScriptingLanguage | 指定动态 SQL 生成的默认语言 | 指定动态 SQL 生成的默认语言 | org.apache.ibatis.scripting.xmltags.XMLLanguageDriver |
defaultEnumTypeHandler | 指定 Enum 使用的默认 TypeHandler 。(新增于 3.4.5) | 一个类型别名或完全限定类名 | org.apache.ibatis.type.EnumTypeHandler |
callSettersOnNulls | 指定当结果集中值为 null 的时候是否调用映射对象的 setter(map 对象时为 put)方法,这在依赖于 Map.keySet() 或 null 值初始化的时候比较有用。 注意基本类型(int、boolean 等)是不能设置成 null 的。 | true/false | false |
returnInstanceForEmptyRow | 当返回行的所有列都是空时,MyBatis默认返回 null。 当开启这个设置时,MyBatis会返回一个空实例。 请注意,它也适用于嵌套的结果集 (如集合或关联)。(新增于 3.4.2) | true/false | false |
logPrefix | 指定 MyBatis 增加到日志名称的前缀。 | 任何字符串 | 未设置 |
logImpl | 指定 MyBatis 所用日志的具体实现,未指定时将自动查找 | SLF4J LOG4J LOG4J2 JDK_LOGGING COMMONS_LOGGING STDOUT_LOGGING NO_LOGGING | 未设置 |
proxyFactory | 指定 Mybatis 创建具有延迟加载能力的对象所用到的代理工具 | CGLIB/JAVASSIST | JAVASSIST (MyBatis 3.3 以上) |
vfsImpl | 指定 VFS 的实现 | 自定义 VFS 的实现的类全限定名,以逗号分隔 | 未设置 |
useActualParamName | 允许使用方法签名中的名称作为语句参数名称。 为了使用该特性,你的项目必须采用 Java 8 编译,并且加上 -parameters 选项。(新增于 3.4.1) | true/false | true |
configurationFactory | 指定一个提供 Configuration 实例的类。 这个被返回的 Configuration 实例用来加载被反序列化对象的延迟加载属性值。 这个类必须包含一个签名为static Configuration getConfiguration() 的方法。(新增于 3.2.3) | 类型别名或者全类名 | 未设置 |
类型别名(typeAliases)
类型别名是为 Java 类型设置一个短的名字。
它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。
例如:
<typeAliases>
<typeAlias alias="Author" type="domain.blog.Author"/>
<typeAlias alias="Blog" type="domain.blog.Blog"/>
<typeAlias alias="Comment" type="domain.blog.Comment"/>
</typeAliases>
当这样配置时,Blog 可以用在任何使用 domain.blog.Blog 的地方。
也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:
可以批量扫描,自动生成别名,自动生成
的别名是类型或者类名首字母小写
<typeAliases>
<!-- 给某个类单独设置别名,一般是不同包的相同类名 -->
<package name="com.i.pojo"/>
</typeAliases>
每一个在包 com.i.pojo
中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 com.i.pojo.User 的别名为 user;若有注解,则别名为其注解值。
见下面的例子:
@Alias("author")
public class Author {
...
}
这是一些为常见的 Java 类型内建的相应的类型别名。它们都是不区分大小写的
,注意对基本类型名称重复采取的特殊命名风格。
别名 | 映射的类型 |
---|---|
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
object | Object |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |
typeHandlers
typeHandlers称做类型处理器。
就是实现Java类型和数据库类型之间转换的。
除了系统提供的类型转换器之外,开发者也可以自定义类型转换,如下:
例如List<—>VARCHAR之间的类型转换:
1.自定义类型转换器
//自定义类型转换器
// List --> varchar
@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes(List.class)
public class ListToStringTypeHandle extends BaseTypeHandler<List<String>>{
/** * 设置非空参数 * 执行SQL语句时对占位符进行设置 * 比如:sql = "INSERT INTO t_user(id,name,age) VALUE(?,?,?)" * * JDBC代码 * String sql="..." * PreparedStatement ps = conn.preparedStatement(sql) * ps.setInt(1,6) * ps.setString(2,"阿猫") * ps.setString(3."深圳") * ps.setString(4,list) */
@Override
public void setNonNullParameter(PreparedStatement ps, int i, List<String> list, JdbcType jdbcType)
throws SQLException {
if(list != null && list.size() > 0){
StringBuilder sb = new StringBuilder();
for (String s : list) {
sb.append(s+";");
}
ps.setObject(i, sb.toString());
}
}
/** * 获取非空的返回结果,字段 * 如果查询的结果是我们要转换的那个字段 * 获取数据库一条记录的某个字段的结果,转换为对应的JAVA类型数据 */
@Override
public List<String> getNullableResult(ResultSet rs, String columnName) throws SQLException {
String s = rs.getString(columnName);
if(!StringUtils.isNullOrEmpty(s) && s.contains(";")){
return Arrays.asList(s.split(";"));
}
return null;
}
//角标
@Override
public List<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String s = rs.getString(columnIndex);
if(!StringUtils.isNullOrEmpty(s) && s.contains(";")){
return Arrays.asList(s.split(";"));
}
return null;
}
//存储过程
@Override
public List<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
// TODO Auto-generated method stub
return null;
}
}
2.修改配置文件
在配置文件中添加配置
<!-- 配置类型转换器 -->
<typeHandlers>
<typeHandler handler="com.i.handle.ListToStringTypeHandle"/>
</typeHandlers>
javaBean中的数据类型
private Integer userid;
private String username;
private Integer userage;
// 集合数据和表结构中的数据类型不一致,数据是Varchar类型
private List<String> games;
3.测试-添加数据
public static void main(String[] args) throws IOException {
//获取SqlSession对象
InputStream is = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession ss = factory.openSession();
//获取Mapper接口对象
UserMapper sm = ss.getMapper(UserMapper.class);
User s = new User("张三",18);
s.setGames(Arrays.asList("lol","dnf","cf"));
sm.addUser(s);
ss.commit();
}
#{}和${}的区别:
#{}:
- 是预编译
- 编译成占位符
- 可以防止sql注入
- 自动判断数据类型
- 一个参数时,可以使用任意参数名称进行接收
${}:
- 非预编译
- sql的直接拼接
- 不能防止sql注入
- 需要判断数据类型,如果是字符串,需要手动添加引号
- 一个参数时,参数名称必须是value,才能接收参数
还没有评论,来说两句吧...