- 一、简介
- 1.初识Mybatis
- 2.持久化
- 3.持久层
- 4.为什么需要Mybatis
- 二、第一个Mybatis程序
- 1.搭建环境
- 2.创建一个新模块
- 3.编写代码
- 4.Junit测试
- 三、可能遇到的问题
一、简介
以Mybatis3.5.7为例
环境:
- jdk8.0
- Mysql8.0
- maven3.8.4
- 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,并且改名为MyBatis。
- 2013年11月迁移到Github。所以要找Mybatis得去Github
怎么获得Mybatis?
- maven仓库
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
- 搜搜jar包的坐标网站https://mvnrepository.com/
- Github:https://github.com/mybatis/mybatis-3/releases
- Mybatis中文文档:https://mybatis.net.cn/index.html
2.持久化
数据持久化
- 持久化就是把程序的数据在持久状态和瞬时状态转化的过程
- 内存:断电后数据就消失了
- 数据库(jdbc),IO文件持久化
为什么需要持久化
- 内存断电后数据就丢失了,有一些对象我们不能让他丢掉
- 内存太贵了
3.持久层
Dao层,Service层,Controller层
- 完成持久化工作的代码块
- 层的界限十分明显
- 每个层的任务很明确,各司其职
- 关于三层架构,大家可以看这篇博客,讲解得很清楚SSM,三层结构,MVC三者的说明及关系(很全面)
4.为什么需要Mybatis
- 帮助程序员把数据存入到数据库中
- 方便
- 传统的JDBC代码太复杂了,框架可以简化操作,自动化。
- 不使用Mybatis也可以,更容易上手。
- 优点:
- sql和代码分类,提高可维护性
- 提供映射标签,支持对象与数据库的orm字段关系映射
- ORM是对象关系映射的意思
O ------ object就是 java对象
R -------relational 关系型数据
M -------mappering 映射 - 提供哦那个对象关系映射标签,支持对象关系组建维护
- 提供xml标签,支持编写动态sql
二、第一个Mybatis程序
思路:搭建环境–>导入Mybatis–>编写代码–>测试
1.搭建环境
先提供一个数据库和用来操作的表
新建项目
1.File->new Project 新建maven项目
下面这一堆代码是构建maven项目以后,自带的
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.kuang</groupId>
<artifactId>Mybatis-study</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
2.删除src,这样就可以当成父工程了
3.导入maven依赖
第一次加入依赖的时候,项目会爆红,记得重新加载项目,这样就不会爆红了
<!--导入依赖-->
<dependencies>
<!-- mysql驱动-->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<!-- mybatis驱动-->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- junit驱动-->
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
</dependencies>
2.创建一个新模块
父项目的pox.xml就会多出来这样的代码
<modules>
<module>mybatis-01</module>
<module>mybatis-01</module>
<module>mybatis-01</module>
</modules>
- 编写mybatis核心配置文件
把下面的代码拷贝到刚刚新建的xml文件
<!--configuration代表核心配置文件-->
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
上面那一个从官网复制过来的,相当于是一个模板,但是里面具体的信息需要我们自己去设置,比如说我们要连接的数据库的用户名,密码等信息需要手动配置
<!--configuration代表核心配置文件-->
<configuration>
<!-- 环境可以有多个,我们用默认的环境-->
<!-- 配置连接数据库的环境-->
<environments default="development">
<environment id="development">
<!-- 事务管理器,类型是JDBC-->
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=Asia/Shanghai&useSSL=true&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="a87684009."/>
<!-- 数据源就是连接是连接数据库的信息-->
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC"/>
<!-- type=POOLED表示使用数据库连接池-->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 引入映射文件-->
<!-- 每一个Mapper.xml都需要在Mybatis的核心配置文件中注册-->
<mappers>
<mapper resource="com/kuang/dao/UserMapper.xml"/>
</mappers>
</configuration>
3.编写代码
- 编写mybatis工具类
//工厂模式
//sqlSessionFactory---->sqlSession
public class MybatisUtils {
public static SqlSessionFactory sqlSessionFactory;
static {
try {
//读取配置文件
//下面三句话是固定的
//使用Mybatis第一步:获取sqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 既然有了SqlSessionFactory,顾名思义,我们就可以从中获取SqlSession的实例了
* SqlSession完全包含了面向数据库执行sql命令所需要的所有方法
*/
public static SqlSession getSqlSession() {
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}
}
- 实体类(domain,pojo,domain)每一个类都和数据库中的一张表相关联
package com.kuang.pojo;
/**实体类
* @author zengyihong
* @create 2022--03--28 17:14
*/
public class User {
private int id;
private String username;
private String password;
public User() {
}
public User(int id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
- DAO接口(对数据库表的CRUD操作,对user表的操作就对应一个userDao)
package com.kuang.dao;
import com.kuang.pojo.User;
import java.util.List;
/**这个类用来操作数据库中对象的实体
* @author zengyihong
* @create 2022--03--28 17:16
*/
//dao等价于mapper
public interface UserDao {
List<User> getUserList();
}
- 接口实现类由原来的UserDaoImpl转换成为一个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">
<!--命名空间要绑定一个对应的DAO/Mapper接口-->
<mapper namespace="com.kuang.dao.UserDao">
<!-- select查询语句 id对应原来的方法名字-->
<select id="getUserList" resultType="com.kuang.pojo.User">
select * from mybatis.user
</select>
</mapper>
可能大家看到上面那些有点懵,那我们就来复习一下 ,具体的大家可以看我博客中JDBC的内容,里面有关于分层的讲解。
4.Junit测试
package com.kuang.dao;
import com.kuang.pojo.User;
import com.kuang.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;
import java.util.List;
/**
* @author zengyihong
* @create 2022--03--29 9:55
*/
public class UserDaoTest {
public void test(){
// SqlSession
// 第一步:获得SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//方式一:执行SQL getMapper
UserDao mapper = sqlSession.getMapper(UserDao.class);
List<User> userList = mapper.getUserList();
for (User user:userList){
System.out.println(user);
}
//关闭SqlSession
sqlSession.close();
}
}
三、可能遇到的问题
1.配置文件没有注册
2.绑定接口错误
3.方法名错误
4.返回类型错误
5.maven导出资源错误
在pox.xml中,加入下面代码即可
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>