Mybatis全解-01
什麼是Mybatis
一款優秀的持久層框架,避免了JDBC底層繁雜的手動設定引數和獲取結果集的過程。能夠使用xml檔案或註解形式來對映實體類和資料庫內容。
Mybatis官方文件:
Github上地址:https://github.com/mybatis/mybatis-3
學習mybatis之前需要理解持久化的概念
什麼是持久化
持久化就是將程式在持久狀態和瞬時狀態間轉換的機制。就是把資料(記憶體中的物件)儲存到可永久儲存的儲存裝置之中(如磁碟)。
JDBC是一種持久化機制,檔案IO也是持久化機制。
為什麼需要持久化
首先就是價格,記憶體價格昂貴,其次就是記憶體中的資料斷電即失,為了保證資料不丟失,需要對資料進行持久化。
持久化到持久層
用來完成持久化工作的程式碼塊(也就是程式中的DAO層)。大多數情況下,資料持久化是通過各種關係資料庫來實現。
之所以要獨立出一個持久層的概念,而不是持久模組或者持久單元。真正意義上講就是,在我們的程式架構中,應該用一個相對獨立的邏輯層面,專注於資料持久層邏輯的實現,說白了就是用來操作資料庫存在的。
為什麼要用到Mybatis
Mybatis是一個半自動化的ORM框架(Object Relationship Mapping)即物件關係對映。Mybatis就是用來幫助我們操作資料庫的,從資料庫中取出資料,將資料存入資料庫中。相比於傳統的JDBC來操作資料庫,Mybatis不用寫那些過於繁雜與重複的程式碼,開發者只需要關注sql語句的實現。
優點:
1.簡單小巧,沒有任何第三方依賴,使用時只需要引入兩個jar包。
2.使用靈活,不會對應用程式或者資料庫的現有設計強加任何影響。Sql寫在xml檔案中有利於統一的管理與優化。
3.解除sql與程式程式碼之間的耦合,通過dao層將業務邏輯和資料訪問邏輯的分離,使系統的設計更清晰,更易維護。
4.提供xml標籤,支援編寫動態sql。
第一個Mybatis程式
流程:搭建環境-匯入Mybaits-編寫程式碼-測試
1.搭建環境
CREATE DATABASE `mybatis`; USE `mybatis`; DROP TABLE IF EXISTS `user`; CREATETABLE `user`( `id` INT(20) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, `pwd` VARCHAR(30) DEFAULT NULL, PRIMARY KEY(`id`) )ENGINE=INNODB DEFAULT CHARSET=utf8; INSERT INTO `user`(`id`,`name`,`pwd`) VALUES (1,'李慧','123456'),(2,'小明','234567'),(3,'李華','456789');
2.匯入Mybatis的jar包
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency>
3.編寫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=utf8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/li/dao/userMapper.xml"/> </mappers> </configuration>
4.編寫Mybatis工具類
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工廠,生產連線資料庫的SqlSession private static SqlSessionFactory sqlSessionFactory; static { try { // 通過流的方式讀取資料庫的連線資訊 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); // 通過SqlSessionFactoryBuilder建造者建造SqlSessionFactory工廠 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } //獲取SqlSession連線 public static SqlSession getSession(){ // SqlSessionFactory工廠生產SqlSession return sqlSessionFactory.openSession(); } }
5.建立實體類
public class User { private int id; //id private String name; //姓名 private String pwd; //密碼 //構造,有參,無參 //set/get //toString() }
6.編寫Mapper介面
import com.li.pojo.User; import java.util.List; public interface UserMapper { List<User> selectUser(); }
7.編寫對應的Mapper.xml檔案
注意:這裡的namespace繫結的是介面
<?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.li.dao.UserMapper"> <select id="selectUser" resultType="com.li.pojo.User"> select * from user </select> </mapper>
8.編寫測試類
public class MyTest { @Test public void selectUser() { // 呼叫之前寫好的MybatisUtils工具類裡的方法,獲得session,用來連線資料庫 SqlSession session = MybatisUtils.getSession(); // 利用反射,得到mapper,然後執行裡面的sql UserMapper mapper = session.getMapper(UserMapper.class); List<User> users = mapper.selectUser(); for (User user: users){ System.out.println(user); } // 最後記得關閉資源 session.close(); } }
9.執行程式,檢視測試結果。
10.如果報錯,可能是出現了靜態資源匯出問題,讀取不到你的檔案。
解決方法,在pom檔案中加入靜態資源過濾程式碼。
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build>