1.Mybatis简述:
Mybatis是一款持久层对象关系映射(ORM : Object Relational Mapping) 框架。持久化可以这么理解,由于内存是易失性存储器,但是我们对数据的操作实际上都是对内存中的数据副本进行,用户通过写的系统调用,让操作系统负责将修改的数据进行写回操作,也就是写回在外存上。而对于Mabatis,就是将数据写回外存上相应的数据库中。框架指的是一种半成品软件,可以通过框架减少开发量。
2.Mybatis VS JDBC
实际上Java带有访问数据库的JDBC库,但是JDBC完成ORM操作存在很多问题。
1. 多处使用JDBC完成ORM操作会存在大量冗余代码
2.需要手动创建Connection、Statement类等。
3.对于查询的结果需要手动封装成对象。
4.访问效率低,没有Cache缓存策略。
以下是使用JDBC+MySql8的连接过程。
import java.sql.*;
public class MySqlConnection {
public static void main(String[] args) {
Connection connect = null;
Statement statement = null;
ResultSet resultSet = null;
try {
//加载驱动类
Class.forName("com.mysql.cj.jdbc.Driver");
//创建数据库连接
connect = DriverManager.getConnection("jdbc:mysql://localhost:3306/jsut?serverTimezone=GMT%2B8", "root", "zjm@?42393");
//创建Statement
statement = connect.createStatement();
//执行SQL查询 返回结果集
resultSet = statement.executeQuery("select * from student");
//输入查询的结果
while (resultSet.next()){
System.out.println(resultSet.getString("id"));
}
}
catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
//先关闭结果集
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
try{
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
connect.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
3.Mybatis使用初步
对于Mybatis来说,只要我们给出构建类的规则,他就可以自动帮我们完成封装,而不需要自己手写大量冗余代码。
1.新建Maven空项目
2.在Maven工程的pom.xml文件中配置Mybatis(由于Mybatis是对JDBC的高级封装,因此还是需要JDBC驱动的)
<?xml version="1.0" encoding="UTF-8"?>
<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>org.example</groupId>
<artifactId>Mybaitas-01</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--MySql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.14</version>
</dependency>
<!--Mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.0</version>
</dependency>
</dependencies>
</project>
3.Mybatis的配置方式
A.xml配置 在Maven项目的resources中建立配置文件
为方便演示,这边提前建好了一张表:
create database study_mybatis default charset = utf8;
use study_mybatis;
create table t_user(
id int primary key auto_increment,
username varchar(50),
password varchar(50),
gender tinyint,
register_time datetime
)default charset = utf8;
在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="study_mybatis">
<!--我们使用的开发环境配置 主要针对数据库-->
<environment id="study_mybatis">
<!--事务控制类型-->
<transactionManager type="jdbc"></transactionManager>
<!--数据库连接参数-->
<!--使用连接池-->
<dataSource type="org.apache.ibatis.datasource.pooled.PooledDataSourceFactory">
<!--数据库连接信息-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!--将&转译成&-->
<property name="url" value="jdbc:mysql://localhost:3306/study_mybatis?serverTimezone=GMT%2B8"/>
<property name="username" value="root"/>
<property name="password" value="zjm@?42393"/>
</dataSource>
</environment>
</environments>
</configuration>
B. 还有注解配置 后续补充
4.建立表中记录对应的类对象
package com.zt.Bean;
import java.util.Date;
public class User {
private Integer id;
private String username;
private String password;
private Boolean gender;
private Date registerTime;
public User() {
}
public User(Integer id, String username, String password, Boolean gender, Date registerTime) {
this.id = id;
this.username = username;
this.password = password;
this.gender = gender;
this.registerTime = registerTime;
}
public Integer getId() {
return id;
}
public void setId(Integer 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 Boolean getGender() {
return gender;
}
public void setGender(Boolean gender) {
this.gender = gender;
}
public Date getRegisterTime() {
return registerTime;
}
public void setRegisterTime(Date registerTime) {
this.registerTime = registerTime;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", gender=" + gender +
", registerTime=" + registerTime +
'}';
}
}
5.建立类对象对应的DAO接口
package com.zt.Dao;
import com.zt.Bean.User;
public interface UserDao {
User queryUserById(Integer id);
}
6.通过配置文件告诉Mybatis与方法相关联的sql语句以及值的映射关系,剩下的由Mybatis负责完成
我们不再需要手动地写一堆JDBC方法和手动封装对象啦!
A . 建立DAO关联的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 namespace="com.zt.Dao.UserDAO">
<!--描述方法-->
<select id="queryUserById" resultType="com.zt.Bean.User">
select id,username,password,gender,register_time
from t_user
where id = #{arg0}
</select>
</mapper>
<select> : 这是一个查询方法
id :该标签指向的接口的方法名
resultType :希望Mybatis将数据返回的格式(上述例子是希望Mybatis将属性各自封装成类,当类对象的属性名与表中字段名一致时,Mybatis就可以自行对应映射,我们注意到我们在类对象中定义的registerTime与表中的register_Time并不匹配,所以registerTime不会被赋值)
#{arg0}:取出方法的第一个值放在此处
B . 在主配置文件中注册Mapper(注册不止一种方式 后续也会补充)。
由于Mybatis运行时只会读取我们指定的主配置文件,为了让其能识别到Mapper,必须在主配置文件中注册其他配置文件
<?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="study_mybatis">
<!--我们使用的开发环境配置 主要针对数据库-->
<environment id="study_mybatis">
<!--事务控制类型-->
<transactionManager type="jdbc"></transactionManager>
<!--数据库连接参数-->
<!--使用连接池-->
<dataSource type="org.apache.ibatis.datasource.pooled.PooledDataSourceFactory">
<!--数据库连接信息-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!--将&转译成&-->
<property name="url" value="jdbc:mysql://localhost:3306/study_mybatis?serverTimezone=GMT%2B8"/>
<property name="username" value="root"/>
<property name="password" value="zjm@?42393"/>
</dataSource>
</environment>
</environments>
<!--注册Mapper-->
<mappers>
<mapper resource="UserDAOMapper.xml"/>
</mappers>
</configuration>
7.测试
package com.zt.test;
import com.zt.Bean.User;
import com.zt.Dao.UserDAO;
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 TestMybatis {
public static void main(String[] args) throws IOException {
//1.加载配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//2.构建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//3.通过SqlSessionFactory构建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//4.通过Sqlsession获得DAO的实现类
UserDAO mapper = sqlSession.getMapper(UserDAO.class);
//5.测试方法
User user = mapper.queryUserById(1);
System.out.println(user);
}
}
1. 将Mybatis的配置文件读成流
2. 将流交给SqlSessionFactoryBuilder解析并生成对应的SqlSessionFactory
3. 用SqlSessionFactory生成SqlSession
4.用SqlSession用来生成DAO类
通过给查询结果的列起别名的方式建立映射
<?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 namespace="com.zt.Dao.UserDAO">
<!--描述方法-->
<select id="queryUserById" resultType="com.zt.Bean.User">
select id,username,password,gender,register_time as registerTime
from t_user
where id = #{arg0}
</select>
</mapper>
当然了如果表的字段名与类对象的属性名是完全一致的,那么可以直接用select *(在实际的开发过程中,我们并不提倡使用select *,尽管我们就是要查所有的属性,select *会先查询数据字典将*转换为所有的列名,这会消耗性能)
<?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 namespace="com.zt.Dao.UserDAO">
<!--描述方法-->
<select id="queryUserById" resultType="com.zt.Bean.User">
select *
from t_user
where id = #{arg0}
</select>
</mapper>
ORM映射方法:O是我们在resultType指定的类型,R是查询的表,M是Mybatis根据同名原则自行做的映射(当然也可以用as别名的方式建立映射)。
【注】由于Mybatis各个部分关联比较大,因此初学会有看不懂的情形,这里牵扯到很多知识,没有关系。代码已经上传到资源中,有需要请自行下载,无需C币。