MyBatis笔记01 入门
coconutnut

https://www.bilibili.com/video/av47952553
p1~10

框架概述

什么是框架:整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法

目的:封装细节,提高开发效率 -> 关注功能实现

不同的框架各司其职,解决某一层或某一类问题

持久层技术有jdbc、Spring的JdbcTemplate、Apache的DBUtils

但是它们都不是框架,jdbc是规范,JdbcTemplate和DButils是工具类(只有简单的封装而没有完整的解决方案)

MyBatis框架概述

基于 java 的持久层框架

内部封装了 jdbc操作的细节,使开发者只需要关注 sql 语句本身,而无需关注注册驱动、创建连接等繁杂过程

使用ORM(Object Relational Mapping)思想实现结果集的封装

通过xml或注解的方式配置statement

环境搭建&入门案例

项目结构

Idea中创建目录和包是不一样的

创建包时com.itheima.dao是三级结构

创建目录时com.itheima.dao是一级目录

resource中创建directory要一级一级的创建,因为MyBatis的映射配置文件位置必须和dao接口的包结构相同

再进行相应的配置,就无须再写dao的实现类了,剩下的由MyBatis实现

(MyBatis支持自己写实现类,但是没什么意义)

1.准备数据库

User表

2.Idea创建Maven工程,导坐标

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
</dependencies>

3. 实体类和Dao接口

实体类User,属性和数据库表中字段一一对应,实现Serializable,生成get、set方法

用户的持久层接口IUserDao,一个方法:List findAll();

4. 配置文件

主配置文件 SqlMapConfig.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?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.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</dataSource>
</environment>
</environments>

<!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 -->
<mappers>
<mapper resource="com/itheima/dao/IUserDao.xml"/>
</mappers>
</configuration

映射配置文件 IUserDao.xml

MyBatis中持久层的操作接口名和映射文件也叫Mapper

命名IUserDao或者IUserMapper都可以

1
2
3
4
5
6
7
8
9
10
<?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.itheima.dao.IUserDao">
<!--配置查询所有-->
<select id="findAll" resultType="com.itheima.domain.User">
select * from user
</select>
</mapper>

namespace必须是dao接口的权限定类名

id要写dao接口的方法名

resultType写返回类型(封装成什么对象)

sql语句写不写分号均可

5.测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 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();

涉及构建者模式&工厂模式&动态代理

注解方式

主配置文件还要有,修改一下mapper即可,映射配置文件可以不要了

1
2
3
4
5
6
<!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件
如果是用注解来配置的话,此处应该使用class属性指定被注解的dao全限定类名
-->
<mappers>
<mapper class="com.itheima.dao.IUserDao"/>
</mappers>

IUserDao加@Select

1
2
3
4
5
6
public interface IUserDao {

@Select("select * from user")
List<User> findAll();

}