MyBatis 基本介紹
文章目錄
1. 基本概念
MyBatis 是一款由 Java 編寫的持久層框架,它支持定製化 SQL、存儲過程以及高級映射,並且封裝了 JDBC 操作的很多細節,使開發者只需要關注 SQL 語句本身,不再去管註冊驅動,創建連接等過程。
MyBatis 可以使用簡單的 XML 或註解來配置和映射原生類型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 對象)爲數據庫中的記錄,它使用了ORM思想實現了結果集的封裝。
ORM(Object Relational Mapping,對象關係映射),將數據庫表和實體類以及實體類的屬性對應起來,讓我們通過操作實體類就實現操作數據庫表,使用過程中需要做到實體類中的數據庫表的字段名稱保持一致。
2. 快速入門
這裏會實現基本的增刪改查操作,我這裏的環境是 IDEA_2019.2.3
、MySQL_8.0.17
。
2.0 創建數據庫和表
-- 創建數據庫
CREATE DATABASE IF NOT EXISTS example CHARACTER SET utf8 ;
USE example;
DROP TABLE IF EXISTS `user`;
-- 創建表
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(32) NOT NULL COMMENT '用戶名稱',
`birthday` datetime default NULL COMMENT '生日',
`sex` char(1) default NULL COMMENT '性別',
`address` varchar(256) default NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 插入數據
insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values
(1,'劉備','2018-02-27 17:47:08','男','北京'),
(2,'孫尚香','2018-03-02 15:09:37','女','上海'),
(3,'貂蟬','2018-03-04 11:34:34','女','深圳'),
(4,'諸葛亮','2018-03-04 12:04:06','男','廣州'),
(5,'呂布','2018-03-07 17:37:26','男','廈門'),
(6,'黃月英','2018-03-08 11:44:00','女','福建');
2.1 創建 Maven 工程(很簡單,這裏不演示)
2.2 導入相關依賴座標(pom.xml)
<?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>com.crud</groupId>
<artifactId>demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<!--mybatis依賴-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!--mysql依賴-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
<!--單元測試-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
</dependencies>
</project>
2.3 創建實體類(com.crud.domain.User)
package com.crud.domain;
import java.util.Date;
public class User {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
// 還需要添加 getter 和 setter 方法,爲了減少文章篇幅,這裏就不寫了,IDEA快捷鍵爲 alt+insert
2.4 創建持久層接口(com.crud.dao.UserDao)
package com.crud.dao;
import com.crud.domain.User;
import java.util.List;
/**
* 持久層接口
*/
public interface UserDao {
//查詢所有用戶
List<User> findAll();
// 保存添加用戶
void saveUser(User user);
// 更新用戶
void updateUser(User user);
// 根據 ID 刪除用戶
void deleteUser(Integer id);
}
2.5 創建MyBatis的主配置文件 (src/resource/SqlMapConfig.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="mysql">
<!--配置mysql環境-->
<environment id="mysql">
<!--配置事務-->
<transactionManager type="JDBC"></transactionManager>
<!--配置連接池-->
<dataSource type="POOLED">
<!--數據庫連接信息-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/example?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--指定映射配置文件-->
<mappers>
<!--<mapper class="com.itheima.dao.UserDao"/>-->
<mapper resource="com/crud/dao/UserDao.xml"></mapper>
</mappers>
</configuration>
2.6 創建持久層接口的配置文件(src/resource/com/crud/dao/UserDao.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">
<mapper namespace="com.crud.dao.UserDao">
<!--查找所有-->
<select id="findAll" resultType="com.crud.domain.User">
select * from user;
</select>
<!--添加用戶-->
<insert id="saveUser" parameterType="com.crud.domain.User">
insert into user (username,address,sex,birthday) value (#{username},#{address},#{sex},#{birthday});
</insert>
<!--更新用戶-->
<update id="updateUser" parameterType="com.crud.domain.User">
update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id};
</update>
<!--根據ID刪除用戶-->
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id = #{id};
</delete>
</mapper>
2.7 創建測試類和測試方法(test/java/MyBatisTest)
package mybatisTest;
import com.crud.dao.UserDao;
import com.crud.domain.User;
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 org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
public class MyBatisTest {
private InputStream is;
private SqlSession sqlSession;
private UserDao userDao;
@Before//測試方法執行之前執行,初始化方法
public void init() throws IOException {
//1. 讀取配置文件:類加載器
is = Resources.getResourceAsStream("SqlMapConfig.xml");
//2. 獲取 SqlSessionFactory,構建者模式
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//3. 使用工廠生產SqlSession對象,工廠模式
sqlSession = factory.openSession();
//4. 使用SqlSession創建Dao接口的代理對象,代理模式
userDao = sqlSession.getMapper(UserDao.class);
}
@After//測試方法執行之後再執行
public void destroy() throws Exception{
sqlSession.close();
is.close();
}
//測試查詢所有用戶
@Test
public void testFindAll(){
//5. 使用代理對象執行方法
List<User> users = userDao.findAll();
for (User user : users) {
System.out.println(user);
}
// 6. 釋放資源
}
// 添加用戶
@Test
public void testSave(){
User user = new User();
user.setUsername("Jacks");
user.setAddress("四川成都");
user.setSex("男");
user.setBirthday(new Date());
//5. 使用代理對象執行保存方法
userDao.saveUser(user);
// 提交事務
sqlSession.commit();
}
// 更新對象
@Test
public void testUpdateUser(){
User user = new User();
user.setId(1);
user.setUsername("Jacks");
user.setAddress("四川成都");
user.setSex("男");
user.setBirthday(new Date());
// 使用代理對象執行更新
userDao.updateUser(user);
}
//根據ID刪除用戶
@Test
public void testDeleteUser(){
// 使用代理對象執行刪除方法
userDao.deleteUser(3);
// 提交變更
sqlSession.commit();
}
}
注意:
- 以上代碼爲照着手敲的,可能有點小問題。
3. 總結
- MyBatis 是一種持久層框架。
- JDBC 是一種規範。
- JdbcTemplate 和 DBUtils 分別是出自 Spring 和 Apache 的工具類。
- 創建
UserDao.xml
和UserDao.java
的名稱建議一致。 - 在 MyBatis 中,持久層接口名稱和映射文件也叫做
Mapper
。 UserDao.java
和UserMapper.java
都可以表示持久層接口。- MyBatis 的映射配置文件和 dao 接口的包結構必須相同。
- 映射配置文件的
mapper
標籤的namespace
屬性的取值必須是 dao 接口的全限定類名。 - 映射配置文件的操作配置
select
標籤的id
屬性的取值必須是 dao 接口的方法名。
值得注意的是,只有滿足最後三個條件纔可以不用創建 dao 接口的實現類。
時間:2019年11月12日00:10:03