MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
原本的JDBC代码实在太复杂了,MyBatis可以简化、自动化连接数据库的流程,优点是:
1.新建一个maven项目,并且在其配置文件pom.xml中声明以下依赖:
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.4.5version>
dependency>
2.直接到mvnrepository中搜索mybatis,并且将包导入项目中
持久层的对象是为数据进行持久化的层级。数据持久化就是将数据存储到数据库中,存入到数据库的数据称之为持久化数据,与之相对的瞬时数据则是存在内存中的数据,在内存中的数据只要断电就会消失。因此持久层的类和对象需要和数据库中的表和实体对应起来。而MyBatis则是用于完成持久化工作的持久层框架,Dao层则是用于完成持久化工作的层级。
首先在MySQL数据库中创建一个User表:
CREATE TABLE `User` (
`id` varchar(30) NOT NULL,
`name` varchar(30) NOT NULL,
`psw` varchar(50) NULL,
PRIMARY KEY (`id`)
);
新建一个Maven项目,然后在pom.xml中引入依赖,其依赖配置如下:
<dependencies>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.28version>
dependency>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.4.5version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>testscope>
dependency>
dependencies>
接下来编写MyBatis核心配置文件,在src->main->resource中新建配置文件,一般命名为mybatis-config.xml
DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>a
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?
useSSL=true&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
dataSource>
environment>
environments>
configuration>
并且在idea中右侧边栏的database中添加mysql数据库,输入正确的端口号、账号密码后完成连接。然后选择scheme,并且勾选mybatis
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。Sql SessionFactory实例是生产SqlSession的工厂,使用的是工厂模式,而SqlSessionFactoryBuilder则是使用了建造者模式,这两种模式详见《设计模式》的内容。我们可以简单理解为:SqlSessionFactoryBuilder 会根据XML的配置建造一个SqlSessionFactory,然后SqlSessionFactory中负责建造各种SqlSession,SqlSession会和指定的pojo层的类联系起来,完成将pojo类和数据库表联系起来的任务。
那么如何创建SqlSessionFactory呢?
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// new一个SqlSessionFactory实例,并且调用其build方法,build方法的参数是一个InputStream
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
使用该方法后,获取到的sqlSessionFactory对象是根据xml或者Configuration配置类配置好的对象,该工厂类中已经包含需要连接到数据库的各种信息。
既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。获取SqlSession的语句如下
SqlSession = sqlSessionFactory.openSession();
我们为了方便测试,可以编写一个工具类用于存放获取sqlSession的操作,命名为mybatisUitl
package com.hch.util;
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;
public class MyBatisUtils {
static SqlSessionFactory sqlSessionFactory;
static{
try{
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// new一个SqlSessionFactory实例,并且调用其build方法,build方法的参数是一个InputStream
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}catch(IOException e){
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}
}
接着编写MyBatis所需的类,首先是pojo类
package com.hch.pojo;
public class User {
private String id;
private String name;
private String psw;
public User(){}
public User(String id, String name, String psw) {
this.id = id;
this.name = name;
this.psw = psw;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return psw;
}
public void setPassword(String password) {
this.psw = password;
}
@Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", password='" + psw + '\'' +
'}';
}
}
接下来是编写dao层
首先编写dao接口,下面为UserDao接口和他的实现类UserDaoImpl
package com.hch.dao;
import com.hch.pojo.User;
import java.util.List;
public interface UserDao {
List<User> getAllUser();
}
package com.hch.dao;
import com.hch.pojo.User;
import java.util.List;
public class UserDaoImpl implements UserDao{
@Override
public List<User> getAllUser() {
return null;
}
}
现在你可能很想知道 SqlSession 和 Mapper 到底具体执行了些什么操作,这里给出一个基于 XML 映射语句的示例
DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hch.dao.UserDao">
<select id="getAllUser" resultType="com.hch.pojo.User">
select * from mybatis.user;
select>
mapper>
我们还需要更改config中的配置,在mybatis-config.xml中追加以下内容:
<mappers>
<mapper resource="com/hch/dao/UserMapper.xml"/>
mappers>
MyBatis会根据InputStream读取指定url的配置文件,但是它并不知道各个mapper.xml的位置,因此需要在配置文件中的mapper注册中心里,对每一个需要用到的mapper进行注册,否则会报错
我们分析一下上面的代码,首先,userMapper.xml中的SQL语句规定了返回的对象为User类,此时Mybatis会将User类中的属性和数据库User表中的属性进行一一对应,在执行了对User表的查询后,将查询表中的数据组装成User对象。在userMapper中也用namespace规定了该mapper是和UserDao映射起来的,执行UserDao中对数据的操作函数,就可以执行userMapper中的SQL语句
接下来我们可以进行一些测试了,在Test文件夹下新建测试用例UserDaoTest,
package com.hch.dao;
import com.hch.pojo.User;
import com.hch.util.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class UserDaoTest {
@Test
public void test(){
// 获取SqlSession
SqlSession sqlSession = MyBatisUtils.getSqlSession();
// 通过sqlSession获取指定dao类的实现
UserDao userDao = sqlSession.getMapper(UserDao.class);
// 通过dao类中的方法完成对数据库的操作
List<User> userList = userDao.getAllUser();
for (User user:userList) {
System.out.println(user);
}
sqlSession.close();
}
}
另外,旧版的第二种方法如下:
List<User> userList = sqlSession.selectList("com.hch.dao.UserDao.getAllUser");
可以直接传入方法名完成调用,但是并不推荐使用该方法,因为第一种方法使用和指定语句的参数和返回值相匹配的接口(比如 UserDao.class),现在你的代码不仅更清晰,更加类型安全,还不用担心可能出错的字符串字面值以及强制类型转换。
另外maven的资源过滤器可能会导致报错:找不到mybatis-config.xml,如何操作详见:
https://blog.csdn.net/weixin_45434953/article/details/130026538