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
typeHandlers
ypeHandlers称做类型处理器。就是实现Java类型和数据库类型之间转换的。 除了系统提供的类型转换器之外,开发者也可以自定义类型转换,如下:
例如List<—>VARCHAR之间的类型转换:
自定义转换器
package com.sxt.myList;
import java.sql.CallableStatement;
import java.sql.JDBCType;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
/**
* 自定义转换器,集合,字符串
* @author Administrator
*
*/
@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes(List.class)
public class MyList extends BaseTypeHandler<List<String>>{
/**
* 将集合数据转换成字符床
*/
@Override
public void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType)
throws SQLException {
StringBuilder sb = new StringBuilder();
for (String s : parameter) {
sb.append(s).append(";");
}
String msg = sb.toString();
ps.setString(i, msg);
}
/**
* 从集合里取出字符串转换成集合
*/
@Override
public List<String> getNullableResult(ResultSet rs, String columnName) throws SQLException {
String st = rs.getString(columnName);
return Arrays.asList(st.split(";"));
}
@Override
public List<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String st = rs.getString(columnIndex);
return Arrays.asList(st.split(";"));
}
@Override
public List<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
// TODO Auto-generated method stub
return null;
}
}
bean层
package com.sxt.bean;
import java.util.List;
public class Student {
private Integer id;
private String name;
private List<String> games;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getGames() {
return games;
}
public void setGames(List<String> games) {
this.games = games;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", games=" + games + "]";
}
}
映射文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sxt.dao.StudentDao">
<select id="query" resultType="student">
select * from t_student
</select>
<insert id="add" parameterType="student">
insert into t_student(name,games)values(#{name},#{games})
</insert>
</mapper>
接口【和映射文件在同级目录下名字相同】
package com.sxt.dao;
import java.util.List;
import com.sxt.bean.Student;
public interface StudentDao {
public List<Student> query();
public int add(Student stu);
}
配置mybatis配置文件【里面的配置文件下面详解】
<?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>
<properties resource="db.properties" />
<typeAliases>
<package name="com.sxt.bean" />
</typeAliases>
<typeHandlers>
<typeHandler handler="com.sxt.myList.MyList" />
</typeHandlers>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<!-- 注册映射文件 -->
<mappers>
<package name="com.sxt.dao" />
</mappers>
</configuration>
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>
自定义别名映射
<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>
注意自定义的别名使用的时候不区分大小写
测试
@Test
public void query() {
SqlSession session = Dbutils.getSession();
StudentDao mapper = session.getMapper(StudentDao.class);
//查询
List<Student> query = mapper.query();
System.out.println(query);
//添加
Student user = new Student();
user.setName("zhangsan");
user.setGames(Arrays.asList("x","m","n"));
mapper.add(user);
session.commit();
session.close();
}