Mybatis做為JavaWeb專案中三層架構的Dao層常用技術框架,解決了許多傳統JDBC的問題,如:
1、JDBC中資料庫連接創建、釋放頻繁造成系統資源浪費,從而影響系統性能,(JDBC中可通過資料庫連接池解決此問題)
2、JDBC中的SQL陳述句存在硬編碼問題,代碼不易維護,實際應用中很可能存在需要修改SQL陳述句的情況,而硬編碼就導致需要修改Java代碼,
3、JDBC的PrepareStatement方法中也存在占位符硬編碼問題,SQL陳述句的where判斷條件可能不止一種情況,但修改就需要修改Java代碼,
4、JDBC對結果集ResultSet的決議也存在硬編碼問題,在決議時不能寫錯一個列名,當SQL存在改動時,相應的也需要改動結果集決議代碼,
Mybatis是一個優秀的Dao層框架,它將對資料庫的操作程序進行封裝,開發者只需關注SQL本身,不需要去寫注冊驅動、創建Connection、創建Statement、手動設定引數、結果集檢索決議等一系列操作代碼,那么,Mybatis是如何做的呢?首先Mybatis通過xml檔案或者注解的方式將要執行的Statement(PrepareStatement、CallableStatement、Statement)配置起來,并通過Java物件和Statement中的SQL進行映射生成最終執行的SQL陳述句,最后Mybatis執行SQL陳述句并將結果映射成Java物件回傳,
正式開始Mybatis的學習:
1、Mybatis組態檔
我們需要兩類組態檔,首先是Mybatis總體的一個組態檔,它配置了Mybatis的基本環境和資訊,如連接資料庫的驅動資訊、用戶名、URL、密碼等;然后是Java物件映射到資料庫表中的組態檔,它配置了SQL陳述句操作,這一類組態檔可以有很多個,并且需要在總體組態檔中加載,組態檔如何撰寫可以參考Mybatis的官方手冊提供的示例內容(實際上初次學習幾乎都是直接使用示例的組態檔進行修改),
2、SqlSessionFactory --> SqlSession
Mybatis組態檔構建了SqlSessionFactory,即會話工廠,由會話工廠創建會話,即創建了SqlSession,而操作資料庫需要通過SqlSession進行,Mybatis底層自定義了執行器介面Executor操作資料庫,它有兩個實作分別是基本執行器和快取執行器,Mybatis底層還封裝了Mapped Statement物件,它包裝了Mybatis的配置資訊及SQL映射資訊,正是通過這兩個Mybatis底層實作,SqlSession才能對資料庫進行操作,
3、示例代碼
Mybatis總體環境資訊組態檔
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 <environments default="development"> 7 <environment id="development"> 8 <transactionManager type="JDBC"/> 9 <dataSource type="POOLED"> 10 <property name="driver" value="com.mysql.jdbc.Driver"/> 11 <property name="url" value="jdbc:mysql://localhost:3306/selfnote"/> 12 <property name="username" value="root"/> 13 <property name="password" value="123456"/> 14 </dataSource> 15 </environment> 16 </environments> 17 18 <mappers> 19 <mapper resource="mybatis/mappers/UserMapper.xml"/> 20 <!-- 21 <package name="mybatis/mappers"/> 22 --> 23 </mappers> 24 </configuration>Mybatis-config.xml
單個映射組態檔
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 <mapper namespace="mybatis.mappers.UserMapper"> 6 7 <!-- #{}相當于占位符 ${}相當于替換 不會加雙引號 --> 8 <select id="queryUser" parameterType="String" resultType="mybatis.entity.User"> 9 select * from mybatis_user where acc = #{acc} 10 </select> 11 12 <!-- sql陳述句模糊查詢 --> 13 <select id="queryLikeName" parameterType="String" resultType="mybatis.entity.User"> 14 select * from mybatis_user where acc like '%${value}%' 15 </select> 16 <select id="queryLikeName2" parameterType="String" resultType="mybatis.entity.User"> 17 select * from mybatis_user where acc like "%"#{防SQL注入非要用占位符}"%" 18 </select> 19 20 <insert id="insert" parameterType="mybatis.entity.User"> 21 <!-- 當主鍵自增長時,通過此方法查詢主鍵回傳給User order代表事務執行前還是執行后查詢主鍵 22 <selectKey KeyProperty="id" resultType="Integer" order="AFTER"> 23 select last_insert_id() 24 </selectKey> 25 --> 26 insert into mybatis_user values(#{acc},#{name},#{pwd}) 27 </insert> 28 29 <update id="update" parameterType="mybatis.entity.User"> 30 update mybatis_user set name = #{name},pwd = #{pwd} where acc = #{acc} 31 </update> 32 33 <delete id="delete" parameterType="String"> 34 delete from mybatis_user where acc = #{acc} 35 </delete> 36 </mapper>UserMapper.xml
單個映射相應的Java物件
1 package mybatis.mappers; 2 3 import mybatis.entity.User; 4 5 public interface UserMapper { 6 User queryUser(String str); 7 User queryLikeName(String str); 8 User queryLikeName2(String str); 9 void delete(String str); 10 void update(User user); 11 void insert(User user); 12 }UserMapper.java
測驗代碼
1 package mybatis.mappers; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.util.List; 6 7 import org.apache.ibatis.io.Resources; 8 import org.apache.ibatis.session.SqlSession; 9 import org.apache.ibatis.session.SqlSessionFactory; 10 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 11 import org.junit.jupiter.api.Test; 12 13 import javassist.expr.NewArray; 14 import mybatis.entity.User; 15 16 public class Testing { 17 // @Test 18 // public void fn1() { 19 // String resource = "mybatis-config.xml"; 20 // InputStream inputStream; 21 // try { 22 // inputStream = Resources.getResourceAsStream(resource); 23 // SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(inputStream); 24 // SqlSession session = ssf.openSession(); 25 // Object user = session.selectOne("user.queryUser", "user_001"); 26 // System.out.println(user); 27 // } catch (IOException e) { 28 // e.printStackTrace(); 29 // } 30 // } 31 // @Test 32 // public void fn2() { 33 // String resource = "mybatis-config.xml"; 34 // InputStream inputStream; 35 // try { 36 // inputStream = Resources.getResourceAsStream(resource); 37 // SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(inputStream); 38 // SqlSession session = ssf.openSession(); 39 // List<Object> list = session.selectList("user.queryLikeName", "user"); 40 // //List<Object> list = session.selectList("user.queryLikeName2", "user"); 41 // for (Object object : list) { 42 // System.out.println(object); 43 // } 44 // } catch (IOException e) { 45 // e.printStackTrace(); 46 // } 47 // } 48 // @Test 49 // public void fn3() { 50 // String resource = "mybatis-config.xml"; 51 // InputStream inputStream; 52 // try { 53 // inputStream = Resources.getResourceAsStream(resource); 54 // SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(inputStream); 55 // SqlSession session = ssf.openSession(); 56 // User user = new User("Test", "test", "12345"); 57 // session.insert("user.insert",user); 58 // session.commit();//事務管理需事務提交 59 // } catch (IOException e) { 60 // e.printStackTrace(); 61 // } 62 // } 63 // @Test 64 // public void fn4() { 65 // String resource = "mybatis-config.xml"; 66 // InputStream inputStream; 67 // try { 68 // inputStream = Resources.getResourceAsStream(resource); 69 // SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(inputStream); 70 // SqlSession session = ssf.openSession(); 71 // User user = new User("Test", "test2", "123456"); 72 // session.update("user.update",user); 73 // session.commit();//事務管理需事務提交 74 // } catch (IOException e) { 75 // e.printStackTrace(); 76 // } 77 // } 78 // @Test 79 // public void fn5() { 80 // String resource = "mybatis-config.xml"; 81 // InputStream inputStream; 82 // try { 83 // inputStream = Resources.getResourceAsStream(resource); 84 // SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(inputStream); 85 // SqlSession session = ssf.openSession(); 86 // session.delete("user.delete","Test"); 87 // session.commit();//事務管理需事務提交 88 // } catch (IOException e) { 89 // e.printStackTrace(); 90 // } 91 // } 92 @Test 93 public void fn6() { 94 String resource = "mybatis-config.xml"; 95 InputStream inputStream; 96 try { 97 inputStream = Resources.getResourceAsStream(resource); 98 SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(inputStream); 99 SqlSession session = ssf.openSession(); 100 101 UserMapper userMapper = session.getMapper(UserMapper.class); 102 User tmp = userMapper.queryUser("user_001"); 103 System.out.println(tmp); 104 } catch (IOException e) { 105 e.printStackTrace(); 106 } 107 } 108 }Testing.java
小結:Mybatis還有很多地方需要學習,這一篇只是一個很淺陋很初步的學習筆記,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/173105.html
標籤:Java
