了解Mybatis
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
我就不在这里过多的说了,可以直接去文档查看Mybatis官网
创建项目
所用到的工具
idea2020.3.2
maven3.6.3
mysql5.7.29
在创建项目之前先把数据库创建好
create databases mybatis;
use mybatis;
create table user
(
id int(10) not null
primary key,
username varchar(10) not null,
password varchar(10) not null
);
insert into user values(1,"阿威","1111");
insert into user values(2,"阿牛","1111");
insert into user values(3,"s","22");
我们这里是使用的父子项目,显示创建以Maven-web项目,然后在这个项目里面创建moudle模块Maven-web
现在我们在创建的模块里面写项目,同时把我们用到的包补全。
现在开始添加驱动在子项目pom.xml,这里要跟据自己的版本来进行添加。
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
项目的编写
我们可以根据官方文档来进行编写。首先是在resources包下面写他的核心配置文件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>
<!-- 以上是头部的声明-->
<!-- 环境-->
<environments default="development">
<environment id="development">
<!-- 事务管理者-->
<transactionManager type="JDBC"/>
<!-- 数据库连接池-->
<dataSource type="POOLED">
<!-- 数据库相关信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- mappers 元素则包含了一组映射器(mapper),这些映射器的 XML 映射文件包含了 SQL 代码和映射定义信息。-->
<mappers>
<mapper resource="dao/UserMapper.xml"/>
</mappers>
</configuration>
下面是获取SqlSessionFactory
下面是官方给出的解释
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。
从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。 但也可以使用任意的输入流(InputStream)实例,比如用文件路径字符串或 file:// URL 构造的输入流。MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,使得从类路径或其它位置加载资源文件更加容易。
我们这里把它写到一个工具类中
package 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;
public class MybatisUtils {
//声明SqlSessionFactory 用于全局
private static SqlSessionFactory sqlSessionFactory;
//使用静态代码块进行加载
static {
try {
//获取资源 把资源转化成流
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
//工厂构造器根据流创建一个工厂
sqlSessionFactory= new SqlSessionFactoryBuilder().build(resourceAsStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//获取算sqlSession 通过工厂开启一个sql会话
public static SqlSession getSqlSession(){
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}
}
在pojo中写User实体类,这里要注意变量名类型都要与数据库中的表一致
package pojo;
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;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
接下来就是在dao层编写,在这我们可以把dao层换成Mapper
我们还是按照原来的方式先写一个接口,
package dao;
import pojo.User;
import java.util.List;
public interface UserDao {
List<User> getUserList();
}
按照我们往常的应该写接口是体类,但是现在不再写接口的实现类,而是用xml文件来代替。
<?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">
<!--上面是头文件声明-->
<!--映射文件-->
<!--namesapce名名空间 其实就是映射的地址-->
<mapper namespace="dao.UserDao">
<!-- 因为我们写的是查询语句所以用select标签-->
<!-- id代表我们将对那个方法进行操作 resultType结果集返回类型-->
<select id="getUserList" resultType="pojo.User">
select * from user;
</select>
</mapper>
项目测试
以上我们已经项目编写完成
在test下创建一类来进行测试
import dao.UserDao;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import pojo.User;
import utils.MybatisUtils;
import java.util.List;
public class Mybatis {
@Test
public void test(){
// 首先是我们通过我们的工具类来获取sqlsession会话
SqlSession sqlSession = MybatisUtils.getSqlSession();
// 第一种方式 也是现在流行的方式
// 通过getMapper获取接口
// UserDao mapper = sqlSession.getMapper(UserDao.class);
// 然后在用过接口获取方法 好处是他可以直接定义返回值类型
// List<User> userList = mapper.getUserList();
//第二中方式
// 这种方式是直接获取方法 可读性不高
List<User> userList = sqlSession.selectList("dao.UserDao.getUserList");
for (User user:userList) {
System.out.println(user);
}
sqlSession.close();
}
}
我们还需要添加一个资源加载 在pom.xml中 因为约定大于配置,我们在dao下创建的.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>
如果出现问题请看另一篇博客