MyBatis 是一款優秀的持久層框架,它支持定製化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和映射原生類型、介面和 Java 的 POJO(Plain Old Java Obje... ...
概述
本文以一個簡單的小例子,簡述在Java項目開發中MyBatis的基本用法,屬於入門級文章,僅供學習分享使用,如有不足之處,還請指正。
什麼是MyBatis?
MyBatis 是一款優秀的持久層框架,它支持定製化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和映射原生類型、介面和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 對象)為資料庫中的記錄。
MyBatis環境的搭建
環境搭建步驟:
1. 新建一個Java Project,並引入需要的Jar包。
MyBatis需要的Jar包,共2個,如下所示:
1 //MyBatis包 2 mybatis-3.5.3.jar 3 //MySql資料庫連接驅動包 4 mysql-connector-java-5.1.6.jar
2. 新增MyBatis配置文件
在src目錄下,新增一個MyBatis的配置文件【mybatis-config.xml】,主要配置資料庫連接相關環境信息和Mapper信息,具體內容如下:
- environments 節點配置資料庫環境,可以有多個配置,default表示預設連接哪個環境。
- mappers配置引入的映射文件,採用相對路徑的方式。
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 <!-- 載入配置文件db.properties --> 7 <properties resource="db.properties"></properties> 8 <!-- 通過指定environments的default值和 environment的id,指定mybatis運行的資料庫環境--> 9 <environments default="development"> 10 <environment id="development"> 11 <transactionManager type="JDBC" /> 12 <!-- dataSource數據源類型: 13 UNPOOLED:不採用連接池,預設採用JDBC的方式,需要沒有連接打開關閉 14 POOLED:採用連接池進行資料庫連接 15 JNDI:從Tomcat中獲一個內置的資料庫連接池 16 --> 17 <dataSource type="POOLED"> 18 <property name="driver" value="${jdbc.driver}" /> 19 <property name="url" value="${jdbc.url}" /> 20 <property name="username" value="${jdbc.username}" /> 21 <property name="password" value="${jdbc.password}" /> 22 </dataSource> 23 </environment> 24 </environments> 25 <mappers> 26 <mapper resource="com/hex/mybatis/ProductMapper.xml" /> 27 </mappers> 28 </configuration>
3. 新增加一個模型類
本例中新增加一個Product類,包含三個屬性,代碼如下:
1 package com.hex.mybatis; 2 3 /** 4 * 產品類模型 5 * @author Administrator 6 * 7 */ 8 public class Product { 9 10 private String pid; //產品ID 11 private String pname; //產品name 12 private float price; //產品價格 13 14 public Product() { 15 16 } 17 18 public Product(String pid, String pname, float price) { 19 this.pid = pid; 20 this.pname = pname; 21 this.price = price; 22 } 23 24 public String getPid() { 25 return pid; 26 } 27 public void setPid(String pid) { 28 this.pid = pid; 29 } 30 public String getPname() { 31 return pname; 32 } 33 public void setPname(String pname) { 34 this.pname = pname; 35 } 36 public float getPrice() { 37 return price; 38 } 39 public void setPrice(float price) { 40 this.price = price; 41 } 42 43 @Override 44 public String toString() { 45 // TODO Auto-generated method stub 46 return "PID="+this.pid+",PNAME="+this.pname+",PRICE="+this.price; 47 } 48 }
4. 新增加Mapper文件
增加ProductMapper.xml文件,用於操作資料庫,包含數據表Products的CRUD操作。如下所示:
- mapper節點的namespace屬性表示此映射文件的唯一標識。
- 標簽的id屬性,表示文件內唯一值,用於查找對應的語句。
- parameterType表示參數的數據類型。
- resultType表示返回的數據類型,如果是類對象,必須為全名稱。
- sql語句中的占位符,以 #{屬性名} 格式,不可以亂寫。
- 註意:namespace+id,在整個項目中必須唯一。
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <!-- namespace 是mapper文件的唯一標識符 --> 6 <mapper namespace="com.hex.mybatis.ProductMapper"> 7 <!-- 8 id:唯一標識符 9 parameterType:標識輸入參數類型 10 resultType:返回對象的類型 11 --> 12 <select id="queryProductById" resultType="com.hex.mybatis.Product" 13 parameterType="String"> 14 select * from Products where pid = #{id} 15 </select> 16 17 <!-- 查詢,註意:返回一個值和多個值,resultType一樣 --> 18 <select id="queryProductAll" resultType="com.hex.mybatis.Product"> 19 select * from Products where 1=1 20 </select> 21 22 <!-- 插入:parameterType:輸入參數類型,在形式上只能有一個,可以是簡單類型,也可以是對象類型。 23 如果是對象類型,以 #{屬性名} 格式,不可以亂寫 24 --> 25 <insert id="addProduct" parameterType="com.hex.mybatis.Product" > 26 insert into Products(pid,pname,price)values(#{pid},#{pname},#{price}) 27 </insert> 28 29 <!-- 更新 --> 30 <update id="updateProductById" parameterType="com.hex.mybatis.Product"> 31 update products set pname=#{pname},price=#{price} where pid=#{pid} 32 </update> 33 34 <!-- 刪除 --> 35 <delete id="deleteProductById" parameterType="String"> 36 delete from products where pid=#{pid} 37 </delete> 38 </mapper>
4. 使用方法
具體代碼,如下所示:
- 首先以輸入流的形式載入配置文件。
- 通過數據流創建SqlSessionFactory對象
- 打開SqlSession
- 執行相關操作
- 關閉會話對象
1 //以輸入流的方式載入配置文件 2 String resource = "mybatis-config.xml"; 3 InputStream inputStream = Resources.getResourceAsStream(resource); 4 //創建SqlSessionFactory對象,build第二個參數指定environment的id,,如果不寫,預設配置default. 5 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 6 //創建會話對象 7 SqlSession session = sqlSessionFactory.openSession(); 8 //-------------------查詢單個對象--------------------- 9 //執行操作,如果queryProductById有相同的名稱,則需要使用完全限定名,即:namespace+id 10 Product product = session.selectOne("queryProductById", "A-002"); 11 System.out.println(product.toString()); 12 //---------------------End------------------------- 13 //關閉會話對象 14 session.close();
CRUD操作對象
關於數據表的增刪改查,如下所示:
1 //-------------------新增單個對象--------------------- 2 Product product =new Product("A-006","康師傅綠茶",3.5f); 3 int count = session.insert("addProduct",product); 4 session.commit(); 5 System.out.println("新增加了 "+count+" 個產品!!!"); 6 //---------------------End------------------------- 7 //-------------------修改單個對象--------------------- 8 Product product =new Product("A-004","茉莉花茶",3.2f); 9 int count = session.update("updateProductById", product); 10 session.commit(); 11 System.out.println("修改了 "+count+" 個產品!!!"); 12 //---------------------End------------------------- 13 //-------------------刪除單個對象--------------------- 14 int count = session.delete("deleteProductById", "A-002"); 15 session.commit(); 16 System.out.println("刪除了 "+count+" 個產品!!!"); 17 //---------------------End------------------------- 18 //-------------------查詢個對象--------------------- 19 List<Product> lstProduct = session.selectList("queryProductAll"); 20 for(Product p : lstProduct){ 21 System.out.println(p); 22 } 23 //---------------------End-------------------------
動態代理
除了以上基礎的寫法,MyBatis還提供了動態代理的模式,具體步驟如下所示:
1. 新增一個介面ProductMapper
介面約定如下:
- 包名+介面名與ProudctMapper.xml中的namespace保持一致。
- 函數名稱和Mapper文件中標簽的ID一致。
- 函數參數類型和Mapper文件中配置的parameterType一致。
- 函數返回類型和Mapper文件中配置的resultType一致,如果沒有resultType,則返回void。
1 package com.hex.mybatis; 2 3 import java.util.List; 4 5 /** 6 * 介面名稱和ProductMapper.xml的namespace一致 7 * 8 * @author Administrator 9 * 10 */ 11 public interface ProductMapper { 12 /** 13 * 通過ID查詢:動態代理 1. 函數名稱和Mapper標簽ID一致 2. 參數類型和parameterType對應的一致 3. 14 * 返回值和resultType一致 15 * 16 * @param pid 17 * @return 18 */ 19 Product queryProductById(String pid); 20 21 /** 22 * 查詢列表 23 * 24 * @return 25 */ 26 List<Product> queryProductAll(); 27 28 /** 29 * 新增 30 * 31 * @param product 32 */ 33 void addProduct(Product product); 34 35 /** 36 * 修改 37 * 38 * @param product 39 */ 40 void updateProductById(Product product); 41 42 /** 43 * 刪除 44 * 45 * @param pid 46 */ 47 void deleteProductById(String pid); 48 49 }
2. 動態代理調用方式
如下所示:
- 首先以輸入流的形式載入配置文件。
- 通過數據流創建SqlSessionFactory對象
- 打開SqlSession
- 獲取ProudctMapper介面對象。
- 調用介面方法執行操作。
- 關閉會話對象
1 //以輸入流的方式載入配置文件 2 String resource = "mybatis-config.xml"; 3 InputStream inputStream = Resources.getResourceAsStream(resource); 4 //創建SqlSessionFactory對象,build第二個參數指定environment的id,,如果不寫,預設配置default. 5 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 6 //創建會話對象 7 SqlSession session = sqlSessionFactory.openSession(); 8 //-------------------動態代理--------------------- 9 ProductMapper productMapper = session.getMapper(ProductMapper.class); 10 //查詢一個 11 Product product=productMapper.queryProductById("A-001"); 12 System.out.println(product); 13 //關閉會話對象 14 session.close();
3. 其他CRUD操作
通過動態代理的增刪改查方式,如下所示:
1 //查詢列表 2 List<Product> lstProduct= productMapper.queryProductAll(); 3 for(Product p : lstProduct){ 4 System.out.println(p); 5 } 6 //新增 7 Product product =new Product("A-007","棒棒花茶",3.2f); 8 productMapper.addProduct(product); 9 session.commit(); 10 System.out.println("插入成功!!!"); 11 //修改 12 Product product =new Product("A-004","烏龍茶",3.5f); 13 productMapper.updateProductById(product); 14 session.commit(); 15 System.out.println("修改成功!!!"); 16 //刪除 17 productMapper.deleteProductById("A-005"); 18 session.commit(); 19 System.out.println("刪除成功"); 20 //---------------------End-------------------------
關於MyBatis操作手冊 ,每天學習一小步,堅持跨越一大步。
備註
定風波·三月七日
作者:蘇軾 (宋)
三月七日,沙湖道中遇雨。雨具先去,同行皆狼狽,餘獨不覺。已而遂晴,故作此。
莫聽穿林打葉聲,何妨吟嘯且徐行。竹杖芒鞋輕勝馬,誰怕?一蓑煙雨任平生。
料峭春風吹酒醒,微冷,山頭斜照卻相迎。迴首向來瀟瑟處,歸去,也無風雨也無晴。