Mybatis-入门
概述
Mybatis是一个Java语言编写的持久层框架。封装了JDBC操作的细节,使开发者关注于sql语句本身,无需关注注册驱动、创建链接等过程。使用了ORM思想实现了结果集的封装。
ORM
Object Relational Mapping 对象关系映射。简单说就是数据库表和实体类及实体类的属性对应起来,操作实体类就是操作数据库。
第一个Mybatis程序
准备数据
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(32) NOT NULL COMMENT '用户名称',
`birthday` datetime DEFAULT NULL COMMENT '生日',
`sex` varchar(32) DEFAULT NULL COMMENT '性别',
`address` varchar(256) DEFAULT NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=utf8;
INSERT INTO `user` VALUES ('41', '老王', '2020-02-27 17:47:22', '男', '北京');
INSERT INTO `user` VALUES ('42', '小二王', '2020-03-02 17:47:22', '女', '北京金燕龙');
INSERT INTO `user` VALUES ('43', '小二王', '2020-03-04 17:47:22', '女', '北京金燕龙');
INSERT INTO `user` VALUES ('45', '黑马', '2020-03-04 17:47:22', '男', '北京金燕龙');
INSERT INTO `user` VALUES ('46', '老王', '2020-03-07 17:47:22', '男', '北京');
INSERT INTO `user` VALUES ('48', '小马宝莉', '2020-03-08 17:47:22', '女', '北京朝阳');
实体类
public class User implements Serializable {
private Integer id;
private String username;
private String sex;
private String address;
private Date birthday;
/* getter、setter and toString */
}
配置文件
SqlMapConfig.xml
<?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>
<!-- 配置环境 -->
<environments default="mysql">
<!-- 配置mysql环境 -->
<environment id="mysql">
<!-- 配置事务的类型 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源 -->
<dataSource type="POOLED">
<!-- 配置数据库信息 -->
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
<property name="username" value="root" />
<property name="password" value="123654" />
</dataSource>
</environment>
</environments>
<!-- 映射配置文件位置,每个dao独立的配置文件 -->
<mappers>
<mapper resource="com/xijianlv/dao/IUserDao.xml"/>
</mappers>
</configuration>
IUserDao.xml
<?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.xijianlv.dao.IUserDao">
<!-- 配置查询所有 -->
<select id="findAll" resultType="com.xijianlv.domain.User">
select * from user;
</select>
</mapper>
测试及结果
public static void main(String[] args) throws IOException {
// 读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
// 创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
// 生产sqlsession对象
SqlSession session = factory.openSession();
// 创建Dao接口的代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
// 使用代理对象执行方法
List<User> list = userDao.findAll();
for (User user : list) {
System.out.println(user.toString());
}
session.close();
}
结果:
入门程序的原理分析
解析配置文件
SqlSessionFactoryBuilder接收SqlMapConfig.xml文件流,构建出SqlSessionFactory对象。
Resources.java
/**
* 使用类加载器读取配置文件的类
* @author del
*/
public class Resources {
/**
* 根据传入的参数获取一个字节输入流
* @param filePath
* @return
*/
public static InputStream getResourceAsStream(String filePath) {
return Resources.class.getClassLoader().getResourceAsStream(filePath);
}
}
Configuration.java 配置类
/**
* mybatis的配置类
* @author del
*/
public class Configuration {
private String driver;
private String url;
private String username;
private String password;
private Map<String, Mapper> mappers = new HashMap<String, Mapper>();
public void setMappers(Map<String, Mapper> mappers) {
//这里的set方法未防止覆盖要用putAll来新增
this.mappers.putAll(mappers);
}
/* getter、setter and toString */
}
Mapper.java
/**
* 用于封装执行的sql和结果类型的全限定类名
*/
public class Mapper {
private String queryString;// sql
private String resultType;// 实体类的全限定类名
public String getQueryString() {
return queryString;
}
public void setQueryString(String queryString) {
this.queryString = queryString;
}
public String getResultType() {
return resultType;
}
public void setResultType(String resultType) {
this.resultType = resultType;
}
@Override
public String toString() {
return "Mapper [queryString=" + queryString + ", resultType="
+ resultType + "]";
}
}
SqlSessionFactoryBuilder.java
/**
* 用于创建一个SqlSessionFactory对象
* @author del
*/
public class SqlSessionFactoryBuilder {
/**
* 根据参数的字节输入流构建一个SqlSessionFactory工厂
* @param config
* @return
*/
public SqlSessionFactory build(InputStream config) {
Configuration cfg = XMLConfigBuilder.loadConfiguration(config);
return new DefaultSqlSessionFactory(cfg);
}
}
XMLConfigBuilder.java 解析xml配置文件
/**
* 解析配置文件
* @author del
*/
public class XMLConfigBuilder {
/**
* 解析主配置文件,把里面的内容填充到 DefaultSqlSession所需的地方 dom4j+xpath
* @param config
* @return
*/
public static Configuration loadConfiguration(InputStream config) {
try {
// 定义封装连接信息的配置对象(mybatis的配置对象)
Configuration cfg = new Configuration();
// 1.获取SAXReader对象
SAXReader reader = new SAXReader();
// 2.根据字节输入流获取Document对象
Document document = reader.read(config);