二、MyBatis 框架
1. MyBatis 环境搭建 jar 包详解
(1) 创建项目
java project
(2) 导入 jar 包
1) MyBatis 核心 jar :
mybatis-3.2.7.jar
2) MyBatis 依赖的 jar:
asm-3.3.1.jar 字节码解析包, 被 cglib 依赖
cglib-2.2.2.jar 动态代理的实现
commons-logging-1.1.1.jar 日志包
javassist-3.17.1-GA.jar 字节码解析包
log4j-1.2.17.jar 日志包
log4j-api-2.0-rc1.jar 日志
log4j-core-2.0-rc1.jar 日志
slf4j-api-1.7.5.jar 日志
slf4j-log4j12-1.7.5.jar 日志
3) 驱动 jar
mysql-connector-java-5.1.30.jar
2. MyBatis 核心配置文件
(1) 要求是 一 个 xml 文 件 , 命 名 无 要 求 , 位 置 无 要 求 , 一 般 叫
mybatis.xml, 放在 src 目录下。
(2) dtd
1) MyBatis 官方提供了 dtd 约束, 方便 xml 的编写
<! DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd"
>
2) 关联 mybatis 配置文件的 dtd 约束
(3) 配置文件内容
<?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>
<!--
用于指定使用哪个环境
default: 用于指定使用的环境id
-->
<environments default="dev">
<!--
用于配置开发环境
id: 环境的唯一识别码
-->
<environment id="dev">
<!--
事务管理器
type: 用于设置mybatis采用什么方式管理事务
JDBC表示采用和JDBC一样的事务管理方式
-->
<transactionManager type="JDBC"></transactionManager>
<!--
数据源/连接池, 用于配置连接池和数据库连接的参数
type: 用于设置mybatis是否采用连接池技术
POOLED表示MyBatis采用连接池技术
-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/java505"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
</configuration>
(4) 定义pojo类
public class User implements Serializable {
private int id;
private String username;
private String password;
...
}
3. 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.mypack.mapper.UserMapper">
<!--
select标签用于编写查询语句
id: sql语句的唯一标识, 类比为方法名
resultType: 用于设定返回结果的类型( 全限定路径)
如果返回结果是集合, 要写集合泛型的类型
-->
<select id="selAll" resultType="com.mypack.pojo.User">
select * from t_user
</select>
</mapper>
在核心配置文件中添加 mapper 扫描
<!-- 扫描mapper文件 -->
<mappers>
<mapper resource="com/mypack/mapper/UserMapper.xml" />
</mappers>
4. 编写测试代码
需要先添加 JUnit 支持
package com.mypack.test;
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.mypack.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.mypack.mapper.UserMapper.selAll");
System. out.println(list);
// 关闭资源
session.close();
}
}
5. MyBatis 配置文件详解
(1) <configuration>
这是配置文件的根元素, 所有的其他元素都要在这个标签下使用。
(2) <environments>
用于管理所有的环境, 并可以指定默认使用哪个环境。 通过default 属性来指定。
(3) <environment>
用于配置环境。 id 属性用于唯一标识当前环境
(4) <transactionManager>
用于配置事务管理器
1) type 属性
用于指定 MyBatis 采用何种方式管理事务
JDBC: 表示 MyBatis 采用与原生 JDBC 一致的方式管理事务
MANAGED: 表示将事务管理交给其他容器进行, 例如 Spring
(5) <DataSource>
用于配置数据源, 设置 MyBatis 是否使用连接池技术, 并且配置数据
库连接的四个参数
1) type 属性
用于设置 MyBatis 是否使用连接池技术
POOLED:表示采用连接池技术
UNPOOLED:表示每次都会开启和关闭连接, 不使用连接池技术
NDI: 使用其他容器(例如 Spring)提供数据源
(6) <property>
用于配置数据库连接参数(driver, url, username, password)
(7) <mappers>
用于扫描 mapper 信息
6. mapper 映射配置文件详解
(1) <mapper>
根元素
1) namespace 属性
用于指定命名空间, mybatis 是通过 namespace+id 的方式来定位 SQL语句的, 所以必须指定 namespace。 通常 namespace 被配置为全限定路径。
(2) <select>
用于定义查询语句(DQL)
1) id 属性
用于唯一表示 SQL 语句, 类似于方法的方法名
2) resultType 属性
用于设定查询返回的数据类型, 要写类型的全限定路径。 如果返回的是集合类型, 要写集合的泛型的类型。
7. MyBatis 中常用的三个查询方法
Usrmapper.xml部分内容:
...
<mapper namespace="com.mypack.mapper.UserMapper">
<select id="selAll" resultType="user">
select * from t_user
</select>
<select id="selOne" resultType="user">
select * from t_user where id=1
</select>
<!-- parameterType, 参数类型, 用于参数的传递 -->
<select id="selById" resultType="user" parameterType="int">
<!--
#{}用于使用参数
index, 索引, 从0开始
param+数字, param1, param2
-->
select * from t_user where id=#{param1}
</select>
<select id="sel" resultType="user" parameterType="map">
<!-- 如果参数是对象, 可以通过#{属性名}来获取 -->
<!-- select * from t_user where username=#{username} and password=#{password} -->
<!-- 如果参数是map, 可以通过#{key}来获取 -->
select * from t_user where username=#{uname} and password=#{upwd}
</select>
</mapper>
(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.mypack.mapper.UserMapper.selAll");
System. out.println(list);
for (User user : list) {
System. out.println(user);
}
session.close();
}
(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.mypack.mapper.UserMapper.selOne");
System. out.println(user);
session.close();
}
(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.mypack.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();
}