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();