环境搭建
需求
利用Mybatis框架,从MySQL中查询所有的用户
准备数据
create table user (
id int primary key auto_increment,
username varchar(20) not null,
birthday date,
sex char(1) default '男',
address varchar(50)
);
insert into user values (null, '孙悟空','1980-10-24','男','花果山水帘洞');
insert into user values (null, '白骨精','1992-11-12','女','白虎岭白骨洞');
insert into user values (null, '猪八戒','1983-05-20','男','福临山云栈洞');
insert into user values (null, '玉面狐','1995-03-22','女','积雷山摩云洞');
insert into user values (null, '玉兔精','2010-02-12','女','天竺国皇宫');
insert into user values (null, '豹子精','2008-05-03','男','隐雾山折岳洞');
select * from user;
准备步骤
1. 创建Maven项目
image-202103090000243382.设置 Maven 的相关依赖
<!-- log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.0</version>
</dependency>
<!-- mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
3. 创建核心配置文件 sqlMapConfig.xml
image-202103090006416534.创建日志记录的配置文件 log4j.properties
image-20210309000751197用来设置日志记录的格式,因为Mybaits需要使用到log4j来记录它的日志
日志文件用来记录程序运行过程中的各种事件
5.编写用户dao接口和dao映射文件 (记得分包)
image-202103090035249476.编写用户的实体类文件
image-202103090035582797.编写测试代码
image-20210309001256332项目整体结构
image-202103090036269033.2 配置文件和接口
3.2.1 日志文件
#1. 在resources下创建一个名为log4j.properties
#2. 作用: 记录MyBatis运行过程中的各种事件
代码
image-20210309003704285### 设置Logger输出级别和输出目的地 ###
log4j.rootLogger=debug, stdout
### 把日志信息输出到控制台 ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
3.2.2 核心配置文件sqlMapConfig.xml
# 1. 可以在Mybatis官网入门中找到配置模板
http://www.mybatis.org/mybatis-3/zh/getting-started.html
# 2. 在工程中的resources目录下创建一个名为sqlMapConfig.xml
# 3. 记得修改第15行的数据库名
代码
image-20210309003733033
<?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="default">
<!--环境变量-->
<environment id="default">
<!--事务管理器:由JDBC管理事务 -->
<transactionManager type="JDBC"/>
<!--数据源配置信息:POOLED 使用连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db3"/>
<property name="username" value="root"/>
<property name="password" value="******密码*****"/>
</dataSource>
</environment>
</environments>
<!-- 加载其他的映射文件 -->
<mappers>
<mapper resource="com/lijw/dao/UserMapper.xml"/>
</mappers>
</configuration>
3.2.3 UserMapper接口
# 1. 在com.lijw.dao包下创建一个接口,名为UserMapper
# 2. 在接口中定义一个查询所有用户的方法
代码
image-20210309003821396
package com.lijw.dao;
import com.lijw.entity.User;
import java.util.List;
/**
* 数据访问层方法
*
* @author Aron.li
* @date 2021/3/9 0:09
*/
public interface UserMapper {
/**
查询所有的用户
*/
List<User> findAllUsers();
}
3.2.4 用户映射文件 UserMapper.xml
# 1. 在 resources 目录下创建一个xml文件,名为UserMapper.xml
# 2. 映射文件的模板地址
http://www.mybatis.org/mybatis-3/zh/getting-started.html
代码
image-20210309003926942
<?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 指定接口的类全名
-->
<mapper namespace="com.lijw.dao.UserMapper">
<!--
查询语句
id: 接口中方法的名字
resultType:返回的实体类的类型,类全名
-->
<select id="findAllUsers" resultType="com.lijw.entity.User">
select * from user
</select>
</mapper>
3.2.5 实体类
# 1. 数据库表对应实体
a. 属性名和user表中字段名一致
# 2. 基本类型使用包装类
b. 实体类中基本数据类型,都使用它的包装类。这样与表中的数据更加匹配
c. 因为如果从数据库中读取不到对应的数据,应该是null比较合适
int id; //默认的值是0
Integer id; //默认是null
User类代码
image-20210309004004753
package com.lijw.entity;
import java.io.Serializable;
import java.sql.Date;
/**
*
* 用户实体类对象
*
* @author Aron.li
* @date 2021/3/9 0:10
*/
public class User implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
public User() {
}
public User(Integer id, String username, Date birthday, String sex, String address) {
this.id = id;
this.username = username;
this.birthday = birthday;
this.sex = sex;
this.address = address;
}
....
}
3.3 测试类
# 1. 在com.lijw.dao下编写一个测试类: TestUserMapper
# 2. 然后运行: 查询到user表中所有数据
代码
image-20210309004114847
package com.lijw.dao;
import com.lijw.entity.User;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* 使用mybatis访问数据库
*
* @author Aron.li
* @date 2021/3/9 0:12
*/
public class UserMapperTest {
@Test
public void test01() throws IOException {
//1. 得到输入流对象
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//2. 创建会话工厂建造类
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3. 通过建造类得到会话工厂类
SqlSessionFactory factory = builder.build(inputStream);
//4. 通过会话工厂得到会话对象
SqlSession session = factory.openSession();
//5. 会话对象得到UserMapper接口的代理对象
UserMapper userMapper = session.getMapper(UserMapper.class);
// 生成了代理对象:org.apache.ibatis.binding.MapperProxy@198b6731
System.out.println(userMapper);
//6. 执行查询操作
List<User> users = userMapper.findAllUsers();
for (User user : users) {
System.out.println(user);
}
//7. 关闭会话
session.close();
}
}
测试执行如下:
image-202103090042111033.4 入门案例解释
三大对象的声明周期
在Mybatis中一个会话相当于一次访问数据库的过程,一个会话对象类似于一个Connection连接对象。
- SqlSessionFactoryBuilder:这是一个临时对象,用完就不需要了。通过这个工厂建造类来创建一个会话工厂。
- SqlSessionFactory:从一个工厂类中得到一个会话对象,一个项目中只需要创建一个会话工厂对象即可。通过会话工厂对象来创建会话对象。
- SqlSession:每次访问数据库都需要创建一个会话对象,这个会话对象不能共享。访问完成以后会话需要关闭。
MyBatis工作流程
CRUD:增删改查的操作(Create、Retrieve、Update、Delete)
Resources工具类直接可以读取 resources 目录下配置文件,转成输入流
1575558785104步骤
- 通过框架提供的Resources类,加载sqlMapConfig.xml,得到文件输入流InputStream对象
- 实例化会话工厂创建类SqlSessionFactoryBuilder
- 通过上面的SqlSessionFactoryBuilder对象,读取核心配置文件的输入流,得到会话工厂SqlSessionFactory类
- 使用SqlSessionFactory对象,创建SqlSession对象
- 它相当于JDBC中的Connection对象,提供了操作数据库的CRUD方法
- 它提供了一个getMapper()方法,获取接口的实现对象。
- 获取接口的对象UserMapper,得到接口的代理对象
- 执行数据库的查询操作,输出用户信息
- 关闭会话,释放资源