1. 程式人生 > 其它 >Mybatis全解-01

Mybatis全解-01

什麼是Mybatis

一款優秀的持久層框架,避免了JDBC底層繁雜的手動設定引數和獲取結果集的過程。能夠使用xml檔案或註解形式來對映實體類和資料庫內容。

Mybatis官方文件: http://www.mybatis.org/mybatis-3/zh/index.html

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`;

CREATE
TABLE `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&amp;useUnicode=true&amp;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>