Mybatis
Mybatis簡介
官方解釋:
MyBatis 是一款優秀的持久層框架,它支持定製化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和映射原生類型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 對象)爲數據庫中的記錄。
360百科:
MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,並且改名爲MyBatis 。2013年11月遷移到Github。
Mybatis的特點:
- 簡單易學:本身就很小且簡單。沒有任何第三方依賴,最簡單安裝只要兩個jar文件+配置幾個sql映射文件易於學習,易於使用,通過文檔和源代碼,可以比較完全的掌握它的設計思路和實現。
- 靈活:mybatis不會對應用程序或者數據庫的現有設計強加任何影響。 sql寫在xml裏,便於統一管理和優化。通過sql語句可以滿足操作數據庫的所有需求。
- 解除sql與程序代碼的耦合:通過提供DAO層,將業務邏輯和數據訪問邏輯分離,使系統的設計更清晰,更易維護,更易單元測試。sql和代碼的分離,提高了可維護性。
- 提供映射標籤,支持對象與數據庫的orm字段關係映射。
- 提供對象關係映射標籤,支持對象關係組建維護。
- 提供xml標籤,支持編寫動態sql。
官方鏈接:
由上述的官方解釋,我們可以得到Mybatis是一個持久層的框架,所謂持久層,就是我們通常開發時的dao層,數據持久層,就是將內存中失電即失的數據保存成永久不消失的代碼層,就是專門處理數據持久化的,通俗理解就是我們通常操作數據庫的dao層,當然,數據的持久化當然不只是存到數據庫中這一種方式,比如文件IO,將數據寫到文件中,也可以算是數據持久化。
Mybatis的入門程序
該框架是一個操作數據庫的框架,我們想要使用它,先準備好數據庫的資源:
CREATE DATABASE mybatis;
USE mybatis;
CREATE TABLE `user`(
`id` INT PRIMARY KEY AUTO_INCREMENT COMMENT '主鍵id',
`name` VARCHAR(30) NOT NULL COMMENT '用戶名',
`password` VARCHAR(30) NOT NULL COMMENT '密碼'
)ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO USER(`name`,`password`) VALUES('Ara_Hu','123456'),('張三','123456'),('李思','123456'),('王武','123456'),('趙柳','123456'),('田七','123456'),('宋壩','123456');
創建一個Maven項目,並導入依賴:
<!--mysql驅動-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--Mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
<!--測試Junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
創建與數據庫表相對應的實體類User,這裏需要字段名與數據庫中的字段名一致。
package com.ara.pojo;
public class User {
private int id;
private String name;
private String password;
public User() {
}
public User(int id, String name, String password) {
this.id = id;
this.name = name;
this.password = password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}
創建Mybatis的核心配置文件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=true&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
</mappers>
</configuration>
這裏我們還是仿照我們之前操作JDBC的方式,先創建一個工具類MybatisUtils:
package com.ara.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;
//Mybatis工具類
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//讀取配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//通過傳入的配置文件,獲取SqlSessionFactory對象
//這裏由於SqlSessionFactoryBuilder的作用就是來獲取sqlSessionFactory 而且獲取到之後就不會再使用 所以一次獲取
//這裏就是通過創建者模式來獲取一個工廠
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 通過sqlSessionFactory來獲取SqlSession
* 這裏使用了工廠模式
*
* @return SqlSession
*/
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession();
}
}
然後創建一個UserDao接口,一般來說是應該創建UserMapper接口的,這裏使用UserDao接口或許會更容易理解:
package com.ara.dao;
import com.ara.pojo.User;
import java.util.List;
public interface UserDao {
/**
* 查詢所有的User
* @return 查詢出的User列表
*/
List<User> getUsers();
}
一般來說,我們這個時候就該編寫UserDao的實現類了,我們使用Mybatis就不需要編寫實現類,我們只需要編寫UserDao對應的xml配置文件UserMapper.xml,一般來說,將該文件和UserDao接口放在同一級目錄下:
<?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">
<!--namespace:綁定一個對應的Dao接口,可以理解爲這裏就是實現這個接口的-->
<mapper namespace="com.ara.dao.UserDao">
<!--id:對應接口中方法的名字,可以理解爲接口中該方法的具體實現-->
<!--resultType:對應接口中方法的返回值類型,我們返回的是List<User>,這裏設置爲User即可-->
<select id="getUsers" resultType="com.ara.pojo.User">
select * from user;
</select>
</mapper>
注意這裏的全限定類名。
這裏好像就已經結束了,實際不是,我們還需要對UserMapper.xml做一個登記註冊,我們需要在mybatis的配置文件(mybatis-config.xml)中的<mappers></mappers>
中添加以下代碼:
<!--resource:就是我們需要註冊的Mapper.xml的路徑(注意這裏的路徑/和上面路徑.的區分)-->
<mapper resource="com/ara/dao/UserMapper.xml"></mapper>
然後我們就可以編寫測試代碼了:
package com.ara.dao;
import com.ara.pojo.User;
import com.ara.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class UserDaoTest {
@Test
public void getUsersTest(){
//獲取sqlSession
SqlSession sqlSession = MybatisUtils.getSqlSession();
//執行sql
UserDao userDao = sqlSession.getMapper(UserDao.class);
List<User> users = userDao.getUsers();
//遍歷結果集
for (User user : users) {
System.out.println(user);
}
//關閉sqlSession
sqlSession.close();
}
}
博主這裏的目錄結構展示如下:
運行結果如下:
到此,我們的Mybatis的入門就結束了。
如果跟博主一樣的操作,可能會遇到找不到UserMapper.xml的錯誤:
這就是我們的Maven的pom文件沒有配置過濾的問題,我們只需要在pom文件中添加以下配置即可:
<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>
添加之後,問題就會得到解決。