一、简介
1.1 什么是MyBatis
???????MyBatis是一个持久层框架,既然和持久层有关那就可以简单理解成和数据库有关,既然是框架那么就肯定是为了简化数据库有关的操作。由于传统的JDBC代码处理数据库有关的代码太复杂,所以出现了MyBatis来快速处理数据库。
1.2 MyBatis的特点
- 支持定制化SQL、存储过程、高级映射
- 省略了手动编写JDBC代码和手动设置参数、获取结果集
- 可以使用简单的XML、注解来配置和映射原生类型、接口和Java的POJO为数据库中的记录
- SQL语句和代码分离,SQL写在xml中便于统一管理和优化
- MyBatis不会对应用程序或数据库的现有设计强加任何影响
二、入门
2.1 搭建环境
- 创建一个MySQL数据库
- 创建一个Maven项目并导入相关的jar包。因为是通过Maven创建项目,项目会自带一个名为 pom.xml 的文件,在其中加入需要的依赖即可,IDEA会根据依赖自动下载对于的jar包。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<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.2</version>
</dependency>
</dependencies>
???????其中junit用于单元测试; mysql、org.mybatis含有mybatis相关的东西
???????除此之外,还需要在 pom.xml 中添加过滤信息,因为Maven项目编译之后会生成一个target文件夹存放各种编译后的文件,而MyBatis的关键就是使用各种XML配置文件,如果不进行一个过滤设置的话这些文件就不会自动放入到target文件夹中,从而会因为文件缺失而报错。
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
2.2 编写MyBatis核心配置文件
???????在目录src->main->resources中创建一个XML文件作为MyBatis的核心配置文件(命名随意) ???????这个配置文件的作用是填写一些环境信息,比如连接数据库所必须的url、用户名、密码等等信息。 除此之外还以有个非常重要的东西就是注册映射,由于使用MyBatis处理数据库都是通过mapper实现的,所以每创建一个mapper.xml都必须在这个核心配置文件中进行注册,这样好让MyBatis找得到对应的映射。
<?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/数据库名?useSSL=false"/>
<property name="username" value="用户名"/>
<property name="password" value="z密码"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="dao/UserMapper.xml"/>
</mappers>
</configuration>
2.3 写代码
- 实体类:既然是和数据库进行交互,那么就要有实体类和数据库中的每个表一一对应,每个属性的类型和名称要和数据库表中的一样,否则可能无法匹配上。
package entitl;
public class User {
private String id;
private String username;
private String password;
public User() {}
public String getId() { return this.id; }
public void setId(String id) { this.id = id; }
public String getUsername() { return this.username; }
public void setUsername(String username) { this.username = username; }
public String getPassword() { return this.password; }
public void setPassword(String password) { this.password = password; }
public String toString() {
return "User [id=" + this.id + ", username=" + this.username + ", password=" + this.password + "]\n";
}
}
- MyBatis工具类:用来连接数据库、创建与数据库进行交互的SqlSession类的实体对象
MyBatis中有三个比较重要的类:
类名 | 作用 |
---|
SqlSessionFactoryBuilder | 根据MyBatis核心配置文件中的环境信息创建SqlSessionFactory实体对象,只要创建完SqlSessionFactory对象之后就没有用了 | SqlSessionFactory | 从名字可以看出这是一个工厂类,是专门用来创建SqlSession 实体对象的。一旦被创建就应该在应用的运行期间一直存在 | SqlSession | 提供了在数据库执行 SQL 命令所需的所有方法,用于执行数据库相关的操作 |
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 {
private static SqlSessionFactory sqlSessionFactory ;
static {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession() ;
}
}
- Mapper接口类:指出想要实现的方法,只需要构造出方法名即可
package dao;
import entitl.User;
import java.util.List;
public interface UserDao {
List<User> getAllUser();
}
- Mapper.xml配置文件:通过配置文件将Mapper接口类和MyBatis联系起来,在该配置文件中写SQL语句即可,从而将SQL和代码分离。之后MyBatis就会根据这个配置文件进行相应的操作。
<?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">
<mapper namespace="dao.UserDao">
<select id="getAllUser" resultType="entitl.User">
select * from T_USER
</select>
</mapper>
其中有几个重要的属性:
属性名 | 作用 |
---|
namespace | 要绑定的接口类 | id | 执行的方法名 | resultType | 该方法的返回类型 |
??????? 需要再次强调的是,写完这个配置文件后一定要在MyBatis的核心配置文件中进行映射注册,在2.2中已经有所说明。如果不做这一步的话会报错:
org.apache.ibatis.binding.BindingException: Type interface XXXX is not known to the MapperRegistry.
- 测试类:用于单元测试
???????单元测试用到了junit,通过@Test注解即可快速运行测试程序,在IDEA中会在类名、方法名左侧出现运行的图标,点击后便可直接运行相应部分的代码,非常方便,就不需要笨拙地再创建一个Main函数来运行代码。
package dao;
import entitl.User;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import utils.MybatisUtils;
import java.util.List;
public class UserDaoTest {
@Test
public void tset() {
SqlSession sqlSession = MybatisUtils.getSqlSession() ;
try {
UserDao userDao = sqlSession.getMapper(UserDao.class) ;
List<User> users = userDao.getAllUser() ;
for(User user : users) {
System.out.println(user) ;
}
}
catch (Exception e) {
e.printStackTrace();
}
finally {
sqlSession.close();
}
}
}
???????在测试的时候可以看出实际使用的效果和以往没什么区别,都是先创建一个Dao层对象,然后调用其中的方法,唯一的区别就是: ???????以往手动写JDBC的时候在Dao层都是需要先写一个接口,然后再实现对应的实现类,在使用的时候根据这个实现类创建对象。 ???????而在MyBatis里我自己理解的是,只需要在配置文件中写好具体的SQL语句就可以了,剩下的代码MyBatis都帮我写好了,通过一个映射把这两部分合并在一起,最后就可以创建出想要的实例对象了,从而省去了麻烦的写JDBC代码的过程。
三、总结
???????在第二大点中的大部分代码都不是我自己硬拼起来的,而是根据MyBatis官方文档一步一步学习,模仿着例子写出来的。这也是我第一次通过官方文档学习一门新技术,确实很好用,如果能找到一些视频讲解的话,两个一起看效率会非常高,极力推荐这种学习方式!
|