先献上中文官网:https://mybatis.org/mybatis-3/zh/index.html
一:什么是 MyBatis?
MyBatis 是一款优秀的持久层框架
支持自定义 SQL、存储过程以及高级映射
免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作
MyBatis 本是apache的一个开源项目iBatis,。
2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。
2013年11月迁移到Github。
小麻雀提醒您:持久化VS持久层
持久化
- 持久化就是将程序的数据在持久状态和瞬时状态转化的过程
- 内存的特点是:断电即失
- 数据库(JDBC)、IO文件持久化( 太耗资源 )
持久层
之前的JavaWeb总共有这三个层
- Dao层
- Service层
- Controller层
所以 Mybatis是完成 持久化工作的 一个持久层框架
二:相关配置
maven仓库
导入坐标依赖 或者 jar包 点击进入 maven 官网
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
三:使用流程
1、搭建数据库
create database `mybatis`;
use mybatis;
create table `user`(
`id` int(20) PRIMARY key,
`name` varchar(20) DEFAULT null,
`pwd` varchar(30) default null
)ENGINE = INNODB DEFAULT CHARSET = utf8;
insert into user(`id`,`name`,`pwd`) VALUES
(1,'潮汕奴仔','123456'),
(2,'狮头鹅','159357'),
(3,'潮汕牛','789456');
2、新建父项目、导入坐标依赖
新建一个普通的maven项目即可
项目构建完成后的整体目录结构
接下来我们把src目录删掉 让MyBatis工程成为父工程
接下来在 pom.xml 中导入依赖坐标
<!--导入依赖坐标-->
<dependencies>
<!--MySQL驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.24</version>
</dependency>
<!--MyBatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!--Junit单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
可以打开右侧maven查看依赖是否导入成功 或 左侧External Libraries
或左侧
⭐1、新建一个子工程 开始 practices Demo
⭐2、创建mybatis的核心配置文件 mybatis-config.xml
主要功能:连接数据库 其中的数据库连接信息填写符合自己的信息
在子模块的 resource 中新建
<?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="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
</configuration>
⭐3、创建mybatis工具类
package com.csnz.utils;
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 java.io.IOException;
import java.io.InputStream;
/**
* @Des MyBatis的工具类 通过 SqlSessionFactory 获取 SqlSession
* @Date 2021/7/12/0012 22:39
**/
public class MyBatisUtils {
private static SqlSessionFactory sqlSessionFactory;
//初始化静态代码块
static {
try {
//一: 获取SqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream in = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* @Des 获取 SqlSession实例
* 有了 SqlSessionFactory 我们可以通过它获取SqlSession实例 (包含了执行SQL命令所需的所有方法)
* @Date 2021/7/12/0012 22:45
* @Param []
* @Return org.apache.ibatis.session.SqlSession
*/
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
3、编写代码
1、实体类
package com.csnz.pojo;/*
*
*@create 2021-07-13-0:21
*/
/**
* @Des 对应数据库表中的实体类
* @Author zzj
* @Date 2021/7/13/0013 0:21
**/
public class User {
private int id;
private String name;
private String pwd;
public User() {
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
public int getId() {
return id;
}
public void setId(int 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 + '\'' +
'}';
}
}
2、Dao接口
package com.csnz.dao;/*
*
*@create 2021-07-13-0:25
*/
import com.csnz.pojo.User;
import java.util.List;
/**
* @Des User的持久层接口
* @Author zzj
* @Date 2021/7/13/0013 0:28
**/
public interface UserDao {
/**
* @Des 获取所有用户列表
* @Date 2021/7/13/0013 0:28
* @Param []
* @Return java.util.List<com.csnz.pojo.User>
*/
public abstract List<User> getUserList();
}
3、接口实现类(由原来的UserDapImpl 转变为一个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接口-->
<mapper namespace="com.csnz.dao.UserDao">
<!--select查询语句 id为 接口中的方法名称 resultType为结果类型(写全限定类名)-->
<select id="getUserList" resultType="com.csnz.pojo.User">
select * from user;
</select>
</mapper>
4、进行测试
使用Junit进行单元测试
package com.csnz.dao;/*
*
*@create 2021-07-13-9:51
*/
import com.csnz.pojo.User;
import com.csnz.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
/**
* @Des UserDao接口的测试类 使用Junit单元测试
* @Author zzj
* @Date 2021/7/13/0013 9:51
**/
public class UserDaoTest {
@Test
public void test(){
//1、获取SqlSession对象 (执行SQL语句的对象)
SqlSession sqlSession = MyBatisUtils.getSqlSession();
//2、getMapper
UserDao userDao = sqlSession.getMapper(UserDao.class);
List<User> userList = userDao.getUserList();
for (User user : userList) {
System.out.println(user);
}
//3、关闭SqlSession
sqlSession.close();
}
}
运行结果:
项目至此结构目录图
测试过程中遇到的问题及解决方法
注意点: namespace 中的包名 要和 Dao / Mapper 接口的包名一致
1、 Type interface com.csnz.dao.UserDao is not known to the MapperRegistry.
解决方法:出现 在mapper中心找不到此接口 是因为在mybatis的核心配置文件中没配置mapper
2、Invalid bound statement (not found): com.csnz.dao.UserDao.getUserList
你可能写错了mapper 映射的路径 下图是引发 问题的代码
3、Could not find resource com/csnz/dao/UserMapper.xml
问题出在静态资源导出上 你编写的UserMapper.xml 是在java文件夹中无法导出 参考如下:解决Maven静态资源导出问题
四:进一步巩固CRUD(增删改需提交事务!)
查
在接口中新增根据用户id查询用户信息的方法
并在UserMapper.xml中进行配置
最后进行测试
增 (注意需提交事务)
删 (注意需提交事务)
改 (需提交事务)