核心组件:
- SqlSessionFactoryBuilder(构造器):它会根据配置信息或者代码生成SqlSessionFactory(工厂接口)
- SqlSessionFactory:依靠工厂来生成SqlSession(会话)
- SqlSession:一个既可以发送SQL去执行并返回结果,也可以获取Mapper的接口
- SQL Mapper:它是由一个Java接口和ML文件(或注解)构成的,需要给出对应的SQL和映射规则。它负责发送SQL语句,并返回结果
构建SqlSessionFactory
每个MyBatis的应用都是以SqlSessionFactory的实例为中心的。SqlSessionFactory的实例通过SqlSessionFactoryBuilder获得。SqlSessionFactory的任务是创建SqlSession。
在这里,采用的是依据XML配置方式来创建SqlSessionFactory。
<?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="jdbc.properties" />
<typeAliases>
<typeAlias type="com.wojiushiwo.mybatis_demo.User" alias="user" />
<typeAlias type="com.wojiushiwo.mybatis_demo.Article" alias="article"/>
</typeAliases>
<!-- 配置全局属性 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.Driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.userName}" />
<property name="password" value="${jdbc.passWd}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com.wojiushiwo/UserMapper.xml"/>
<mapper resource="com.wojiushiwo/ArticleMapper.xml"/>
<mapper class="com.wojiushiwo.mybatis_demo.UserDao"/>
</mappers>
</configuration>
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
构建 SqlSession
SqlSession接口类似于JDBC的Connection接口对象,我们需要每次用完正常关闭它,让连接资源归还给数据库。如果我们不及时关闭资源,数据库连接资源将很快被耗尽,系统很快因为数据库资源的匮乏而瘫痪。我们使用SqlSessionFactory创建SqlSession
//创建SqlSession
SqlSession session = sqlSessionFactory.openSession();
创建完SqlSession之后,我们便可以使用它来完成对数据库的ACID操作了。
映射器
映射器是由Java接口和XML文件(或注解)共同组成,常具有以下作用:
- 定义参数类型
- 描述SQL语句
- 定义查询结果和POJO的映射关系
虽然基于注解和基于XML配置均可以实现映射器,但是使用Java注解,功能较少,对于普通操作可以使用。如果存在动态SQL语句,那么Java文件可读性就很差了。综上,依然推荐使用基于XML配置方式
//Mapper接口:
public interface UserMapper {
//@Select(value="select * from user")
List<User> findAll();
}
UserMapper.xml文件:
<mapper namespace="com.wojiushiwo.mybatis_demo.UserMapper">
<select id="findAll" resultType="user">
select * from user;
</select>
</mapper>
//在Mybatis全局配置文件中,配置该Mapper
...
<mappers>
<mapper class="com.wojiushiwo.mybatis_demo.UserMapper"/>
</mappers>
注意:UserMapper.xml文件中namespace与UserMapper权限定名一致
UserMapper.xml文件中select表示查询,查询语句如下:select * from user; 将查询的结果映射到对象User上。
resultType=”user” 这里user表示User类的别名,在前面mybatis-config.xml文件中配置的
User类:
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private int id;
private String name;
private int age;
...getter和setter...
public User() {
}
public User(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
把上面内容连贯起来,调用一下,进行简单的查询操作:
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = sqlSessionFactory.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
List<User> list = userMapper.findAll();
for (User user : list) {
System.out.println(user);
}
session.close();
参考文献:
深入浅出MyBatis技术原理与实战