MyBatis学习笔记
MyBatis学习笔记
MyBatis绪论
SSM框架:配置文件的
The best way is to browse official documents
官网:mybatis – MyBatis 3 | 简介
MyBatis环境
JDK 1.8
MySQL 5.7 / 8.0(经典!)
maven 3.6+
IDEA
MyBatis前序
JDBC
MySQL
Java基础
Maven
Junit
MyBatis简介
什么是MyBatis
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。(定义来源官方文档)
持久层框架
如何获得MyBatis
maven仓库
GitHub
持久化与持久层
01 持久化
数据持久化
持久化就是将程序的数据在持久状态和瞬时状态转化的过程
内存:断电即失
数据库(jdbc)、IO文件持久化
生活:冷藏、罐头
为什么需要持久化?
有一些对象不能丢失
内存成本高
02 持久层
列举:Dao层,Service层,Controller层......
- 完成持久化工作的代码块
- 层的界限十分明显
为什么需要Mybatis?
帮助程序员将数据存入到数据库中;方便;简化、框架、自动化
第一个Mybatis程序
思路:搭建环境 ——> 导入Mybatis ——> 编写代码 ——> 测试
一、搭建环境
step 01 搭建数据库
在navicat中对于mysql的操作
create database `mybatis`;
use `mybatis`;
create table `user`(
`id` int(20) primary key,
`name` varchar(30) default null,
`pwd` varchar(30) default null
)engine=innodb default charset=utf8;
insert into `user`(`id`,`name`,`pwd`) values
(1,'小新','123456'),
(2,'美伢','123456'),
(3,'广志','123456')
step 02 新建项目
新建一个普通的maven项目 ——>
删除src目录文件夹(作为父工程)——>
导入依赖(依赖需要mysql驱动、mybatis和junit)——>
<!--从maven仓库给出某版本示例-->
<!-------------------------->
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
二、创建一个模块
以刚才创建的maven项目为父工程创建一个new maven module,此处命名为mybatis-01,以下操作均是在子模块中进行的
step 01 编写mybatis的核心配置文件
在 src \ main \ resource 下新建名为 mybatis-config.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核心配置文件-->
<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=UTF8&serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/><!--数据库用户名-->
<property name="password" value="root"/><!--数据库密码-->
</dataSource>
</environment>
</environments>
<!--每一个mapper.xml都需要在mybatis的核心配置文件注册-->
<mappers>
<mapper resource="com/learn/dao/UserMapper.xml"/>
</mappers>
</configuration>
注意事项
url value = jdbc:mysql://localhost:3306 + ? + 数据库名称 & ......
jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF8&serverTimezone=Asia/Shanghai
com.mysql.jdbc.Driver和mysql-connector-java 5一起用
com.mysql.cj.jdbc.Driver和mysql-connector-java 6 一起用
step 02 编写mybatis的工具类
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。
从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。 但也可以使用任意的输入流(InputStream)实例,比如用文件路径字符串或 file:// URL 构造的输入流。MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,使得从类路径或其它位置加载资源文件更加容易。
factory 工厂模式
builder 建造者模式
第一步
From the official:
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 读取配置文件,加载成“流”
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 通过 SqlSessionFactoryBuilder 加载这个流,构建工厂
// 此处一般会封装成一个工具类
From example:
src \ java 下建包 com.XXX.dao,建立同级目录的 utils,新建java工具类 MybatisUtils
src \ java \ com \ XXX \ dao And src \ java \ com \ XXX \ utils \ MybatisUtils.java
官方给出的这三句话是必须要有的(三句话,让我编写了一个Mybatis工具类)
// SqlSessionFactory ——> sqlSession
public class MybatisUtils {
static{
try{
/* 使用mybatis第一步:获取SqlSessionFactory对象 */
//step 01 获取一个资源
String resource = "org/mybatis/example/mybatis-config.xml";
//step 02 将流加载进来
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e){
e.printStackTrace();
}
}
}
第二步
既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
try (SqlSession session = sqlSessionFactory.openSession()) {
Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
}
简单地说,第一步是把资源加载进来,第二步是创建一个能执行sql的对象
三、编写代码
- 实体类
- Dao接口
- 接口实现类
实体类:com \ ding \ pojo \ User
public public class User {
private int id;
private String name;
private String pwd;
}
右键 ——> Generate... ——> Constructor ——> com.XXX.pojo.User
右键 ——> Generate... ——> Constructor ——> 所有属性
右键 ——> Generate... ——> GetterAndSetter ——> 所有属性
右键 ——> Generate... ——> toString ——> 所有属性
Dao接口:com \ ding \ dao \ UserDao
该类操作数据库对象的一些实体
DAO类似于Mapper
需要建立一个对应它的配置文件,对配置文件的位置不作要求
此处建在同级目录下UserMapper.xml
现在你可能很想知道 SqlSession 和 Mapper 到底具体执行了些什么操作,但 SQL 语句映射是个相当广泛的话题,可能会占去文档的大部分篇幅。 但为了让你能够了解个大概,这里会给出几个例子。
在上面提到的例子中,一个语句既可以通过 XML 定义,也可以通过注解定义。我们先看看 XML 定义语句的方式,事实上 MyBatis 提供的所有特性都可以利用基于 XML 的映射语言来实现,这使得 MyBatis 在过去的数年间得以流行。如果你用过旧版本的 MyBatis,你应该对这个概念比较熟悉。 但相比于之前的版本,新版本改进了许多 XML 的配置,后面我们会提到这些改进。这里给出一个基于 XML 映射语句的示例,它应该可以满足上个示例中 SqlSession 的调用。
接口实现类
由原来原生JDBC的UserDaoImpI转变为一个Mapper配置文件
<?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=绑定一个对应的Dao/Mapper接口-->
<!--我们希望这个xml文件和Dao接口产生交集,就是通过命名空间定位实现的;所以需要根据自己的文件夹位置修改-->
<mapper namespace="org.mybatis.example.BlogMapper">
<!-- select查询语句 -->
<!-- 写sql语句是核心 -->
<!-- id设为我们重写方法的name -->
<select id="selectBlog" resultType="Blog">
<!-- resultType 返回一个结果 -->
<!-- resultMap 返回一个集合 -->
select * from Blog where id = #{id}
<!-- 数据库name.数据表name -->
</select>
</mapper>
四、测试
注意点:
- junit测试
在test下建立对应main文件夹的相同结构