mybatis教程2(配置文件)
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置(settings)和属性(properties)信息。文档的顶层结构如下:
configuration 配置 properties 属性 settings 设置 typeAliases 类型别名 typeHandlers 类型处理器 objectFactory 对象工厂 plugins 插件 environments 环境 environment 环境变量 transactionManager 事务管理器 dataSource 数据源 databaseIdProvider 数据库厂商标识 mappers 映射器
properties
配置一些常见变量,类似于spring中placeholder的作用。一般可以用来引入数据库配置
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/ssm username=root password=123456
settings
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。下表描述了设置中各项的意图、默认值等
设置参数 | 描述 | 有效值 | 默认值 |
---|---|---|---|
cacheEnabled | 全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存。 | true | false |
lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。 | true | false |
aggressiveLazyLoading | 当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载(参考lazyLoadTriggerMethods). | true | false |
multipleResultSetsEnabled | 是否允许单一语句返回多结果集(需要兼容驱动)。 | true | false |
useColumnLabel | 使用列标签代替列名。不同的驱动在这方面会有不同的表现, 具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果。 | true | false |
useGeneratedKeys | 允许 JDBC 支持自动生成主键,需要驱动兼容。 如果设置为 true 则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby)。 | true | 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 | 设置超时时间,它决定驱动等待数据库响应的秒数。 | 任意正整数 | Not Set (null) |
defaultFetchSize | 为驱动的结果集获取数量(fetchSize)设置一个提示值。此参数只可以在查询设置中被覆盖。 | 任意正整数 | Not Set (null) |
safeRowBoundsEnabled | 允许在嵌套语句中使用分页(RowBounds)。如果允许使用则设置为false。 | true | false |
safeResultHandlerEnabled | 允许在嵌套语句中使用分页(ResultHandler)。如果允许使用则设置为false。 | true | false |
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 and OTHER | OTHER |
lazyLoadTriggerMethods | 指定哪个对象的方法触发一次延迟加载。 | 用逗号分隔的方法列表。 | equals,clone,hashCode,toString |
defaultScriptingLanguage | 指定动态 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会返回一个空实例。 请注意,它也适用于嵌套的结果集 (i.e. collectioin and association)。(从3.4.2开始) | true | false | false |
logPrefix | 指定 MyBatis 增加到日志名称的前缀。 | 任何字符串 | Not set |
logImpl | 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 | SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING\ |
proxyFactory | 指定 Mybatis 创建具有延迟加载能力的对象所用到的代理工具。 | CGLIB\ | JAVASSIST |
vfsImpl | 指定VFS的实现 | 自定义VFS的实现的类全限定名,以逗号分隔。 | Not set |
useActualParamName | 允许使用方法签名中的名称作为语句参数名称。 为了使用该特性,你的工程必须采用Java 8编译,并且加上-parameters选项。(从3.4.1开始) | true | false | true |
configurationFactory | 指定一个提供Configuration实例的类。 这个被返回的Configuration实例用来加载被反序列化对象的懒加载属性值。 这个类必须包含一个签名方法static Configuration getConfiguration(). (从 3.2.3 版本开始) | 类型别名或者全类名. | Not set |
一个完整设置
<settings> <setting name="cacheEnabled" value="true"/> <setting name="lazyLoadingEnabled" value="true"/> <setting name="multipleResultSetsEnabled" value="true"/> <setting name="useColumnLabel" value="true"/> <setting name="useGeneratedKeys" value="false"/> <setting name="autoMappingBehavior" value="PARTIAL"/> <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/> <setting name="defaultExecutorType" value="SIMPLE"/> <setting name="defaultStatementTimeout" value="25"/> <setting name="defaultFetchSize" value="100"/> <setting name="safeRowBoundsEnabled" value="false"/> <setting name="mapUnderscoreToCamelCase" value="false"/> <setting name="localCacheScope" value="SESSION"/> <setting name="jdbcTypeForNull" value="OTHER"/> <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/> </settings>
typeAlias
类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余
mybatis中默认提供的别名
别名 | 映射的类型
-----|:-----
_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
上面这些是由MyBatis提供的别名映射,开发者也可以自定义别名,定义方式如下
<typeAliases> <typeAlias type="com.sxt.bean.User" alias="user"/> </typeAliases>
可以批量扫描,自动生成别名,==自动生成==的别名是类型或者类名首字母小写
<typeAliases> <!-- <typeAlias type="com.sxt.bean.User" alias="user"/> --> <package name="com.sxt.bean"/> </typeAliases>
==注意==自定义的别名使用的时候==不区分大小写==
typeHandlers
typeHandlers称做类型处理器。就是实现Java类型和数据库类型之间转换的。 除了系统提供的类型转换器之外,开发者也可以自定义类型转换,如下:
例如List<--->VARCHAR之间的类型转换:
自定义类型转换器如下:
@MappedJdbcTypes(JdbcType.VARCHAR) @MappedTypes(List.class) public class ListStringTypeHandler extends BaseTypeHandler<List<String>>{ /** * 设置非空参数 * 执行SQL语句时对占位符进行设置 * 比如:sql = "insert into t_sysuser(name,age,favorites)values(?,?,?) " */ @Override public void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType) throws SQLException { System.out.println("------------"); StringBuilder sb = new StringBuilder(); for (String s : parameter) { sb.append(s).append(";"); } // 给占位符设值 ps.setString(i, sb.toString()); } /** * 获取非空的返回结果 * 获取数据库一条记录的某个字段的结果,转换为对应的java类型数据 */ @Override public List<String> getNullableResult(ResultSet rs, String columnName) throws SQLException { // TODO Auto-generated method stub return Arrays.asList(rs.getString(columnName).split(";")); } @Override public List<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException { // TODO Auto-generated method stub return Arrays.asList(rs.getString(columnIndex).split(";")); } @Override public List<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { // TODO Auto-generated method stub return Arrays.asList(cs.getString(columnIndex).split(";")); } }
在配置文件中添加配置
<typeHandlers> <typeHandler handler="com.sxt.handler.ListStringTypeHandler" /> </typeHandlers>
javaBean中的数据类型
private int id; private String name; private int age; // 集合数据和表结构中的数据类型不一致,数据是Varchar类型 private List<String> favorites;
测试--添加数据
测试代码
// 3.通过SqlSessionFactory对象获取SQLSession对象 SqlSession session = factory.openSession(); User user = new User(); user.setName("bobo"); user.setAge(18); List<String> list =new ArrayList<>(); list.add("dnf"); list.add("cs"); list.add("cc"); user.setFavorites(list); //通过Java动态代理自动提供了UserMapper的实现类 UserMapper mapper = session.getMapper(UserMapper.class); int count = mapper.addUser(user); System.out.println("影响的行数:"+count); session.commit();
映射文件
没什么变化
数据库结果
测试--查询数据
映射文件
<select id="getUserById" parameterType="int" resultType="user"> select * from t_user where id=#{id} </select>
接口文件
public interface UserMapper { public int addUser(User user); public User getUserById(int id); }
测试文件
@Test public void query() throws IOException { // 1.通过Resources对象加载配置文件 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); // 2.获取SqlSessionFactory对象 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream ); // 3.通过SqlSessionFactory对象获取SQLSession对象 SqlSession session = factory.openSession(); //通过Java动态代理自动提供了UserMapper的实现类 UserMapper mapper = session.getMapper(UserMapper.class); User list = mapper.getUserById(15); System.out.println(list); session.commit(); }
结果
mapper
映射器:我们添加的SQL语句的映射文件要被配置文件能够发现,在自动发现方面mybatis在这方面并没有实现,所以我们需要通过mapper标签来关联映射文件。
方式一:一个个扫描
<!-- 注册映射文件 --> <mappers> <mapper resource="com/sxt/dao/UserMapper.xml"/> </mappers>
这种配置方式,对mapper的文件名没有要求
方式二:扫描包
更简单更常用的方式,则是通过包扫描去加载mapper文件,这个时候对mapper文件名有要求,要求mapper文件名和mapper接口必须一致。
<!-- 注册映射文件 --> <mappers> <!-- <mapper resource="com/sxt/dao/UserMapper.xml"/> --> <package name="com.sxt.dao"/> </mappers>
- Spring+SpringMVC+Mybatis(SSM)框架搭建教程(三)-配置文件详解
- MyBatis教程之二的配置文件详解
- mybatis入门教程(配置文件详解、增删改查、接口编程方式)
- mybaties基础教程之三:MyBatis主配置文件
- MyBatis入门教程(三):优化配置文件
- MyBatis入门学习教程-优化MyBatis配置文件中的配置
- MyBatis Generator 配置文件自动生成
- Mybatis主配置文件
- mybatis 配置文件报错:"Referenced file contains errors(file:/D:/config/ mybatis-3-mapper.dtd).
- MyBatis之全局配置文件(Configuration XML)之运行时行为设置(settings)
- Mybatis_review之配置文件中的typeAliases节点内容说明
- 【转】MyBatis学习总结(三)——优化MyBatis配置文件中的配置
- MyBatis XML 映射配置文件
- MyBatis主配置文件
- mybatis(4)---优化配置文件中的配置
- Mybatis(二) 全局配置文件详解
- Spring Boot (教程四:配置文件)
- SpringBoot非官方教程 | 第二篇:Spring Boot配置文件详解
- Spring-boot +Gradle依赖管理+Mybatis 配置文件
- 一份MyBatis-Generator非常详细的配置文件