MyBatis映射文件与核心配置文件
目录
1 Mapper 映射文件
在 MyBatis 中, 推荐使用 mapper 作为包名, 我们只需要写一个映射配置文件即可. UserMapper.xml, 用于定义要执行的 SQL 语句, 同时设定返回结果的类型.
<?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">
<!--
namespace: 命名空间, 可以随意定义, 一般情况下要写全限定路径
MyBatis管理SQL语句是通过namespace+id来定位的
-->
<mapper namespace="com.bjsxt.mapper.UserMapper">
<!--
select标签用于编写查询语句
id: sql语句的唯一标识, 类比为方法名
resultType: 用于设定返回结果的类型(全限定路径)
如果返回结果是集合, 要写集合泛型的类型
-->
<select id="selAll" resultType="com.pojo.User">
select * from t_user
</select>
</mapper>
2 POJO类
import java.io.Serializable;
public class User implements Serializable {
private int id;
private String username;
private String password;
public User() {
super();
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
result = prime * result + ((password == null) ? 0 : password.hashCode());
result = prime * result + ((username == null) ? 0 : username.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (id != other.id)
return false;
if (password == null) {
if (other.password != null)
return false;
} else if (!password.equals(other.password))
return false;
if (username == null) {
if (other.username != null)
return false;
} else if (!username.equals(other.username))
return false;
return true;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password=" + password + "]";
}
}
3 Junit测试代码
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import com.bjsxt.pojo.User;
public class TestMyBatis {
@Test
public void testSelAll() throws IOException {
// 加载MyBatis核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis.xml");
// 构建SqlSessionFactory工厂对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
// 通过工厂打开SqlSession
SqlSession session = factory.openSession();
// 通过session执行查询操作
List<User> list = session.selectList("com.bjsxt.mapper.UserMapper.selAll");
System.out.println(list);
// 关闭资源
session.close();
}
}
4 MyBatis 配置文件详解
4.1 <configuration>
这是配置文件的根元素, 所有的其他元素都要在这个标签下使用.
4.2 <environments>
用于管理所有的环境, 并可以指定默认使用哪个环境. 通过 default 属性来指定.
4.3 <environment>
用于配置环境. id 属性用于唯一标识当前环境
4.4 <transactionManager>
用于配置事务管理器
4.4.1 type 属性
用于指定 MyBatis 采用何种方式管理事务
a) JDBC: 表示 MyBatis 采用与原生 JDBC 一致的方式管理事务
b) MANAGED: 表示将事务管理交给其他容器进行, 例如 Spring
4.5 <DataSource>
用于配置数据源, 设置 MyBatis 是否使用连接池技术, 并且配置数据库连接的四个参数
4.6 type 属性
用于设置 MyBatis 是否使用连接池技术
a) POOLED, 表示采用连接池技术
b) UNPOOLED, 表示每次都会开启和关闭连接, 不使用连接池技术
c) JNDI, 使用其他容器(例如 Spring)提供数据源
4.7 <property>
用于配置数据库连接参数(driver, url, username, password)
4.8 <mappers>
用于扫描 mapper 信息
5. mapper 映射配置文件详解
5.1 <mapper>
根元素
5.1.1 namespace 属性
用于指定命名空间, mybatis 是通过 namespace+id 的方式来定位 SQL
语句的, 所以必须指定 namespace. 通常 namespace 被配置为全限定路径
5.2 <select>
用于定义查询语句(DQL)
5.2.1 id 属性
用于唯一表示 SQL 语句, 类似于方法的方法名
5.2.2 resultType 属性
用于设定查询返回的数据类型, 要写类型的全限定路径. 如果返回的
是集合类型, 要写集合的泛型的类型.
6 MyBatis 中常用的三个查询方法
6.1 selectList
用于查询多条数据的情况, 返回值是一个 list 集合. 如果没有查到任何数据, 返回没有元素的集合(空集合, 不是 null)
@Test
public void testSelectList() throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis-cfg.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = factory.openSession();
List<User> list = session.selectList("com.mapper.UserMapper.selAll");
System.out.println(list);
for (User user : list) {
System.out.println(user);
}
session.close();
}
6.2 selectOne
用于查询单条数据的情况, 返回值是一个对象. 如果没有查到任何数据, 返回 null
@Test
public void testSelectOne() throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis-cfg.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = factory.openSession();
User user = session.selectOne("com.mapper.UserMapper.selOne");
System.out.println(user);
session.close();
}
6.3 selectMap
用于查询多条数据的情况, 多条数据要形成一个Map集合. 需要指定哪个属性作为 key. 如果查不到, 返回一个空 map 集合(不是 null)
@Test
public void testSelectMap() throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis-cfg.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = factory.openSession();
Map<Integer, User> map = session.selectMap("com.bjsxt.mapper.UserMapper.selAll", "id");
System.out.println(map);
Set<Integer> set = map.keySet();
for (Integer k : set) {
System.out.println(map.get(k));
}
session.close();