MyBatis的配置文件包含了会深深影响MyBatis行为的设置和属性信息。配置文件的顶层结构如下
configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
1.properties属性
1.1 定义全局变量属性
1.2 在实际开发中,我们会面临各种各样的系统环境,这样我们会不断修改全局配置文件的数据库信息,为了更加灵活的切换,我们可以通过properties引入一个外部属性文件。
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/shop?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
username=root
password=123456
在配置文件里引入通过el表达式引入
如果出现 Could not find resource db.properties 错误
则在pom文件中添加
2.setting设置属性
这是MyBatis中纪委重要的调整设置,它们会改变MyBatis的运行时行为
在官网可以查看相应的设置
链接: 点这里查看.
一个完整的设置
<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>
3.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 |
object | Object |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |
执行结果
也可以自定义名称
注意:自定义名称后是不区分大小写的
如果我们的类型非常多,而且也需要给每个类型设置别名,那么这个工作就非常繁琐了,这时我们可以通过批量扫描自动生成别名
4.typeHandles
typeHandlers称为类型处理器,就是实现Java类型和数据库类型之间的转换。除了系统提供的类型转换器之外,我们也可以自定义类型转换器。我们自己实现一个List<—>varchar之间的类型转换
4.1 自定义类型转换器
package com.biao.typehandler;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes(List.class)
public class lidtVarcharTypeHandler extends BaseTypeHandler<List<String>> {
/**
* 插入数据的时候要实现的数据转换:List转换为字符串
*
* PreparedStatement ps=conn.createPreparedStatement(sql);
* ps.setInt(1,14)
* ...
* ps.executeUpdate();
*
* @param preparedStatement ps
* @param i 执行的SQL语句要插入参数的位置
* @param strings 要插入的位置的数据的list类型
* @param jdbcType
* @throws SQLException
*/
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, List<String> strings, JdbcType jdbcType) throws SQLException {
//处理数据 将List 转换为特定格式的字符串
StringBuffer stringBuffer=new StringBuffer();
String msg=null;
if(strings!=null){
for (String s:
strings) {
stringBuffer.append(s).append(";");
}
msg=stringBuffer.toString();
msg=msg.substring(0,msg.length()-1);
}
//给对应位置的占位符赋值
preparedStatement.setString(i,msg);
}
/**
* 获取非空的结果集
* @param resultSet
* @param s
* @return
* @throws SQLException
*/
@Override
public List<String> getNullableResult(ResultSet resultSet, String s) throws SQLException {
return null;
}
@Override
public List<String> getNullableResult(ResultSet resultSet, int i) throws SQLException {
return null;
}
@Override
public List<String> getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
return null;
}
}
4.2 修改配置文件
4.3 修改映射文件
4.4 测试
4.5 返回查询
5.Mappers
既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要来定义 SQL 映射语句了。 但首先,我们需要告诉 MyBatis 到哪里去找到这些语句。 在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射文件。 你可以使用相对于类路径的资源引用,或完全限定资源定位符(包括 file:/// 形式的 URL),或类名和包名等。例如:
<!-- 使用相对于类路径的资源引用 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<!-- 使用完全限定资源定位符(URL) -->
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
<mapper url="file:///var/mappers/BlogMapper.xml"/>
<mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>