MyBatis
基于Java的持久层框架, 内部封装了jdbc, 使开发者只需要关注sql语句本身, 而不需要花费精力区处理加载驱动, 创建连接, 创建statement等发杂的过程, 使用了ORM思想
ORM: Object Relational Mappging - 对象关系映射
把数据库表和实体类及实体类的属性对应起来
MyBatis入门
1.环境搭建
-
创建maven工程和数据库
CREATE TABLE `user` ( `id` int(11) NOT NULL auto_increment, `username` varchar(32) NOT NULL COMMENT '用户名称', `birthday` datetime default NULL COMMENT '生日', `sex` char(1) default NULL COMMENT '性别', `address` varchar(256) default NULL COMMENT '地址', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-
maven导入Mybatis坐标
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> </dependencies>
-
创建实体类和dao的接口
//实体类需要实现Serialzable接口 public class User implements Serializable { private Integer id; private String username; private Date birthday; private String sex; private String address; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", birthday=" + birthday + ", sex='" + sex + '\'' + ", address='" + address + '\'' + '}'; } }
public interface IUserDao { /** * 查询所有用户 * @return 用户list */ List<User> findAll(); }
-
创建MyBatis的主配置文件SqlMapConfig(主要设置数据库连接等信息)
<?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"> <!-- MyBatis的主配置文件 --> <configuration> <!-- 配置环境 --> <environments default="mysql"> <!-- 配置mysql环境 --> <environment id="mysql"> <!-- 配置事务类型 --> <transactionManager type="JDBC"></transactionManager> <!-- 配置数据源 (连接池) --> <dataSource type="POOLED"> <!-- 配置连接数据库的4个基本信息 --> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/> <property name="username" value="root"/> <property name="password" value="Hhn004460"/> </dataSource> </environment> </environments> <!-- 指定映射配置文件的位置, 映射文配置件指的是每一个dao独立的配置文件 --> <mappers> <mapper resource="com.study.dao.IUserDao.xml"></mapper> </mappers> </configuration>
-
创建映射配置文件IUserDao.cml(主要配置Dao接口信息)
resultType 返回结果封装的类型
<?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.study.dao.IUserDao" resultType="com.study.mybatis.domain.User"> <!-- 配置查询所有(方法名称) --> <select id="findAll"> select * from user </select> </mapper>
环境搭建注意事项
- 创建IUserDao.xml 和 IUserDao.java 时名称是为了和我们之前的知识保持一致
在MyBatis中它把持久层的操作接口名称和映射文件也叫做: Mapper
所以IUserDao 和 IUserMapper 命名是一样的 - 在IDEA中创建目录的时候, 它和包是不一样的
包在创建时: com.study.dao 是三级结构
目录在创建时: com.study.dao 是一级结构 - MyBatis 的映射配置文件位置必须和dao接口的包结构相同
- 映射配置文件的
mapper
标签namespace
属性的取值必须是dao接口的全限定类名 - 映射配置文件的操作配置
select
,id
属性的取值必须是dao接口的方法名
当我们遵从了(3-5)点后, 在开发之中就无需再写dao的实现类
使用步骤
- 读取配置文件
- 创建SqlSessionFactory工厂
- 创建SqlSession
- 创建Dao接口的代理对象
- 执行Dao中的方法
- 释放资源
public static void main(String[] args) throws IOException {
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂生产SqlSession
SqlSession session = factory.openSession();
//4.使用SqlSession创建Dao接口代理
IUserDao userDao = session.getMapper(IUserDao.class);
//5.使用代理对象执行方法
List<User> users = userDao.findAll();
for (User user : users) {
System.out.println(user);
}
//6.释放资源
session.close();
in.close();
}
注解使用MyBatis
把IUserDao.xml 移除, 在dao接口的方法上使用@Select
注解, 并指定SQL语句,
同时需要在SqlMapConfig.xml 中的mapper配置中, 使用class
属性指定dao的全限定类名
使用中涉及的设计模式
-
构建者模式
创建工厂时使用构建者模式 - 把对象的创建细节隐藏, 使使用者直接调用方法即可拿到对象
-
工厂模式
生产
SqlSession
使用工厂模式 - 解耦(降低类之间的依赖关系) -
代理模式
创建Dao接口实现类使用了代理模式 - 不修改源码基础上对已有方法的增强