MyBatis
简介
环境:
- JDK1.8
- MySQL 5.7
- Maven 3.6.1
- IDEA
回顾:
- JDBC
- MySQL
- Java基础
- Maven
- Junit
1 什么是 MyBatis?
-
MyBatis 是一款优秀的持久层框架。
-
它支持自定义 SQL、存储过程以及高级映射。
-
MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
-
MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了[google code](https://baike.baidu.com/item/google code/2346604),并且改名为MyBatis。
2013年11月迁移到Github。
2 如何获得MyBatis?
- Maven仓库
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
- GitHub:https://github.com/mybatis/mybatis-3
- MyBatis手册:https://mybatis.org/mybatis-3/zh/index.html
3 持久化
数据持久化
- 持久化就是将程序的数据在持久状态和瞬时状态转化的过程
- 内存:断电即失
- 数据库(JDBC)、IO文件持久化
为什么要持久化?
- 有一些对象,不能让它丢掉
- 内存对于大部分人来说,都是昂贵的存在
4 持久层
- 完成持久化工作的代码层
- 层界限十分明显
5 为什么需要MyBatis?
- 帮助程序员将数据存入数据库中
- 方便快捷
- 传统的JDBC代码太复杂了。简化,框架,自动化。
优点:
- **简单易学:**本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件。易于学习,易于使用。通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
- **灵活:**mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
- 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射。
- 提供对象关系映射标签,支持对象关系组建维护。
- 提供xml标签,支持编写动态sql。
第一个MyBatis程序
思路:搭建环境–>导入MyBatis–>编写代码–>测试
1 搭建环境
搭建数据库
CREATE DATABASE mybatis
USE `mybatis`
CREATE TABLE `user`(
`id` INT(20) NOT NULL PRIMARY KEY,
`name` VARCHAR(20) DEFAULT NULL,
`pwd` VARCHAR(20) DEFAULT NULL
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4;
INSERT INTO `user`(`id`,`name`,`pwd`)
VALUES
(1, 'ayin1','123456'),
(2, 'ayin2','123456'),
(3, 'ayin3','123456'),
(4, 'ayin4','123456');
2 编写MyBatis核心配置文件
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--configuration核心配置文件-->
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT"/>
<property name="username" value="root"/>
<property name="password" value="12345"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
3 编写MyBatis工具类
public class MyBatisUtils {
public static SqlSessionFactory sqlSessionFactory;
static {
try {
// 使用Mybatis的第一步,获取SqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
// 既然已经有了SqlSessionFactory对象,也就是说,已经建造起了存放SqlSession对象的工厂
// 接下来就是从这个工厂里,拿出所需要的SqlSession对象即可
public static SqlSession getSqlSession() {
// SqlSession对象中包含面向数据库执行SQL命令所需的所有方法
return sqlSessionFactory.openSession();
}
}
4 编写代码
第一步 编写实体类
public class User {
private Integer id;
private String name;
private String pwd;
public User() {
}
public User(Integer id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
}
第二步 编写Dao接口
public interface UserMapper {
List<User> getUserList();
}
第三步 编写对应接口类的Mapper.xml文件
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace=绑定一个对应的Dao/Mapper接口-->
<mapper namespace="com.atayin.dao.UserMapper">
<!--SQL查询语句-->
<select id="getUserList" resultType="com.atayin.pojo.User">
select * from mybatis.user
</select>
</mapper>
测试
public class UserDaoTest {
@Test
public void getUserList() {
// 第一步:获取SqlSession对象
SqlSession sqlSession = MyBatisUtils.getSqlSession();
// 第二步:执行SQL
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> list = mapper.getUserList();
for (User user : list) {
System.out.println(user);
}
sqlSession.close();
}
}
运行结果
注意事项
-
每次编写完Mapper.xml文件之后,都需要在MyBatis.xml核心配置文件中进行注册。
<mappers> <!--每一个Mapper.xml都需要在MyBatis.xml核心配置文件中进行注册--> <mapper resource="com/atayin/dao/UserMapper.xml"/> </mappers>
-
关于Maven的资源导出问题:由于Maven是约定大于配置的,也就是说,在测试过程中有可能会遇到配置文件无法正确导出的问题,并在控制台报”无法找到配置文件“的错误,解决方案便是在pom.xml配置文件中加入build标签。
<!--在build中配置resource,来防止我们资源导出失败的问题--> <build> <resources> <resource> <directory>src/main/resource</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> </resources> </build>
-
更新Maven的配置文件之后需要刷新Maven。
-
在Mapper.xml配置文件的命名空间namespace中,绑定的是一个接口,而不是一个普通的类。
-
SqlSessionFactoryBuilder类可以被实例化,调用build方法创建一个SqlSessionFactory,然后再通过”工厂“拿到SqlSession实例。
-
SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中,比如 Servlet 框架中的 HttpSession。
-
SqlSession 应当被及时关闭。
5 模糊查询
- Java代码执行的时候,传递通配符
// 模糊查询
List<User> getUserLists(String name);
<select id="getUserLists" resultType="com.atayin.pojo.User">
select * from mybatis.user where name like #{value};