成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

教小師妹快速入門Mybatis,看這篇就夠了

開發 后端
什么是ORM?全稱為Object Relational Mapping。對象-映射-關系型數據庫。

[[356483]]

本文主要內容:

 

傳統JDBC

傳統JDBC編碼格式

  1. public class DataBaseUtil { 
  2.     public static final String URL = "jdbc:mysql://localhost:3306/mblog"
  3.     public static final String USER = "root"
  4.     public static final String PASSWORD = "123456"
  5.  
  6.     public static void main(String[] args) throws Exception { 
  7.          
  8.         Class.forName("com.mysql.jdbc.Driver"); 
  9.         //2.  
  10.         Connection conn = DriverManager.getConnection(URL, USERPASSWORD); 
  11.         //3. 
  12.         Statement stmt = conn.createStatement(); 
  13.         //4. 
  14.         ResultSet rs = stmt.executeQuery("SELECT id, name, age FROM m_user where id =1"); 
  15.         //如果有數據,rs.next()返回true 
  16.         while(rs.next()){ 
  17.             System.out.println("name: "+rs.getString("name")+" 年齡:"+rs.getInt("age")); 
  18.         } 
  19.     } 

上面代碼中知識為了展示JDBC整個過程(異常和資源是簡單粗暴的處理了,我們關注的點不在這兩個)。

大致可以分為六個步驟:

  • 加載驅動程序
  • 獲得數據庫連接
  • 創建一個Statement對象
  • 操作數據庫,實現增刪改查
  • 獲取結果集
  • 關閉資源

從使用層面來說,采用原生態的JDBC在項目中使用起來成本還是很高的。如果我們的項目中的業務相對比較復雜,數據庫表也相對較多,各種操作數據庫的增刪改查的方法也會隨之多起來,那么這樣的代碼重復次數會非常之多。

傳統JDBC的問題

  • 創建數據庫的連接存在大量的硬編碼,
  • 執行statement時存在硬編碼.
  • 頻繁的開啟和關閉數據庫連接,會嚴重影響數據庫的性能,浪費數據庫的資源.
  • 存在大量的重復性編碼

為了解決以上問題,就誕生了各種各樣替換JDBC的產品。即就是ORM框架。

什么是ORM?

全稱為Object Relational Mapping。對象-映射-關系型數據庫。對象關系映射(,簡稱ORM,或O/RM,或O/R mapping),用于實現面向對象編程語言里不同類型系統的數據之間的轉換。簡單的說,ORM是通過使用描述對象和數據庫之間映射的元數據,將程序中的對象與關系數據庫相互映射。

ORM提供了實現持久化層的另一種模式,它采用映射元數據來描述對象關系的映射,使得ORM中間件能在任何一個應用的業務邏輯層和數據庫層之間充當橋梁。

 

我們的項目中是這樣的:

 

比如說:Apache DbUtils、Spring JDBC、 Hibernate、Ibatis(Mybatis的前生)、Spring Data Jpa等等。

目前最為流行的Mybatis和Spring Data Jpa。本系列我們先講解Mybatis,Jpa后面再講。

ORM的優缺點

優點1.提高了開發效率。由于ORM可以自動對Entity對象與數據庫中的Table進行字段與屬性的映射,所以我們實際可能已經不需要一個專用的、龐大的數據訪問層。2.ORM提供了對數據庫的映射,不用sql直接編碼,能夠像操作對象一樣從數據庫獲取數據。

缺點犧牲程序的執行效率和會固定思維模式,降低了開發的靈活性。

從系統結構上來看,采用ORM的系統一般都是多層系統,系統的層次多了,效率就會降低。ORM是一種完全的面向對象的做法,而面向對象的做法也會對性能產生一定的影響。在我們開發系統時,一般都有性能問題。性能問題主要產生在算法不正確和與數據庫不正確的使用上。ORM所生成的代碼一般不太可能寫出很高效的算法,在數據庫應用上更有可能會被誤用,主要體現在對持久對象的提取和和數據的加工處理上,如果用上了ORM,程序員很有可能將全部的數據提取到內存對象中,然后再進行過濾和加工處理,這樣就容易產生性能問題。在對對象做持久化時,ORM一般會持久化所有的屬性,有時,這是不希望的。但ORM是一種工具,工具確實能解決一些重復,簡單的勞動。這是不可否認的。但我們不能指望工具能一勞永逸的解決所有問題,有些問題還是需要特殊處理的,但需要特殊處理的部分對絕大多數的系統,應該是很少的。

MyBatis 是什么?

如果在面試的時候被問到,只要你說出下面三種即可。

MyBatis 是一款優秀的持久層框架,它支持自定義 SQL、存儲過程以及高級映射。

MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作。

MyBatis 可以通過簡單的 XML 或注解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)為數據庫中的記錄。

來自官網。

MyBatis的優點和缺點

優點:

(1)基于SQL語句編程,相當靈活,不會對應用程序或者數據庫的現有設計造成任何影響,SQL寫在XML里,解除sql與程序代碼的耦合,便于統一管理;提供XML標簽,支持編寫動態SQL語句,并可重用。

(2)與JDBC相比,減少了50%以上的代碼量,消除了JDBC大量冗余的代碼,不需要手動開關連接;

(3)很好的與各種數據庫兼容(因為MyBatis使用JDBC來連接數據庫,所以只要JDBC支持的數據庫MyBatis都支持)。

(4)能夠與Spring很好的集成;

(5)提供映射標簽,支持對象與數據庫的ORM字段關系映射;提供對象關系映射標簽,支持對象關系組件維護。

缺點

(1)SQL語句的編寫工作量較大,尤其當字段多、關聯表多時,對開發人員編寫SQL語句的功底有一定要求。

(2)SQL語句依賴于數據庫,導致數據庫移植性差,不能隨意更換數據庫。

Mybatis環境搭建及簡單實例

創建一張數據庫表

創建一張m_user表使用MySQL數據庫。

  1. CREATE TABLE `m_user` ( 
  2.   `id` int(11) NOT NULL AUTO_INCREMENT, 
  3.   `namevarchar(255) DEFAULT NULL
  4.   `age` int(11) DEFAULT NULL
  5.   PRIMARY KEY (`id`) 
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 

添加依賴

  1. <dependency> 
  2.             <groupId>org.mybatis</groupId> 
  3.             <artifactId>mybatis</artifactId> 
  4.             <version>3.5.2</version> 
  5.         </dependency> 
  6.         <dependency> 
  7.             <groupId>mysql</groupId> 
  8.             <artifactId>mysql-connector-java</artifactId> 
  9.             <version>8.0.16</version> 
  10.             <scope>runtime</scope> 
  11.         </dependency> 
  12. </dependencies> 

項目結構如下:

 

創建一個mybatis-config.xml

  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.cj.jdbc.Driver"/> 
  11.                 <property name="url" value="jdbc:mysql://localhost:3306/mblog?useUnicode=true"/> 
  12.                 <property name="username" value="root"/> 
  13.                 <property name="password" value="123456"/> 
  14.             </dataSource> 
  15.         </environment> 
  16.     </environments> 
  17.     <mappers> 
  18.         <mapper resource="mapper/UserMapper.xml"/> 
  19.     </mappers> 
  20. </configuration> 

實體類User

  1. ublic class User { 
  2.     private Integer id; 
  3.     private String name
  4.     private Integer age; 
  5.     //set get 
  6.     @Override 
  7.     public String toString() { 
  8.         return "User{" + 
  9.                 "id=" + id + 
  10.                 ", name='" + name + '\'' + 
  11.                 ", age=" + age + 
  12.                 '}'
  13.     } 

創建UserMapper.java

  1. import com.tian.mybatis.entity.User
  2.  
  3. public interface UserMapper { 
  4.     User selectUserById(Integer id); 

創建UserMapper.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="com.tian.mybatis.mapper.UserMapper"
  6.     <select id="selectUserById" resultType="com.tian.mybatis.entity.User"
  7.         select * from m_user where id = #{id} 
  8.     </select
  9. </mapper> 

創建一個測試類

  1. import com.tian.mybatis.entity.User
  2. import org.apache.ibatis.io.Resources; 
  3. import org.apache.ibatis.session.SqlSession; 
  4. import org.apache.ibatis.session.SqlSessionFactory; 
  5. import org.apache.ibatis.session.SqlSessionFactoryBuilder; 
  6.  
  7. import java.io.IOException; 
  8. import java.io.InputStream; 
  9.  
  10. public class MybatisApplication { 
  11.  
  12.  public static void main(String[] args) { 
  13.         String resource = "mybatis-config.xml"
  14.         InputStream inputStream = null
  15.         SqlSession sqlSession =null
  16.         try { 
  17.             inputStream = Resources.getResourceAsStream(resource); 
  18.             //工廠模式 
  19.             SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 
  20.             //sql操作會話 
  21.             sqlSession = sqlSessionFactory.openSession(); 
  22.             //獲取數據并解析成User對象 
  23.             User user = sqlSession.selectOne("com.tian.mybatis.mapper.UserMapper.selectUserById", 1); 
  24.             System.out.println(user); 
  25.         } catch (Exception e) { 
  26.             e.printStackTrace(); 
  27.         }finally { 
  28.             try { 
  29.                 inputStream.close(); 
  30.             } catch (IOException e) { 
  31.                 e.printStackTrace(); 
  32.             } 
  33.             sqlSession.close(); 
  34.         } 
  35.     } 
  36.  

輸出結果:

  1. User{id=1, name='tian', age=22} 

整體步驟:

 

另外一種啟動方式

  1. import com.tian.mybatis.entity.User
  2. import org.apache.ibatis.builder.xml.XMLConfigBuilder; 
  3. import org.apache.ibatis.io.Resources; 
  4. import org.apache.ibatis.session.Configuration; 
  5. import org.apache.ibatis.session.SqlSession; 
  6. import org.apache.ibatis.session.SqlSessionFactory; 
  7. import org.apache.ibatis.session.SqlSessionFactoryBuilder; 
  8. import org.apache.ibatis.session.defaults.DefaultSqlSessionFactory; 
  9.  
  10. import java.io.IOException; 
  11. import java.io.InputStream; 
  12. import java.util.Properties; 
  13.  
  14. public class MybatisApplication { 
  15.  
  16.     public static void main(String[] args) { 
  17.         String resource = "mybatis-config.xml"
  18.         InputStream inputStream = null
  19.         try { 
  20.             inputStream = Resources.getResourceAsStream(resource); 
  21.         } catch (IOException e) { 
  22.             e.printStackTrace(); 
  23.         } 
  24.         //解析xml文件 
  25.         XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, nullnull); 
  26.         //構建一個SqlSessionFactory工廠類 
  27.         SqlSessionFactory sqlSessionFactory = build(parser.parse()); 
  28.         //創建一個SqlSession 
  29.         SqlSession sqlSession = sqlSessionFactory.openSession(); 
  30.         //獲取數據并解析成User對象 
  31.         User user = sqlSession.selectOne("com.tian.mybatis.mapper.UserMapper.selectUserById", 1); 
  32.         System.out.println(user); 
  33.     } 
  34.  
  35.     public static SqlSessionFactory build(Configuration config) { 
  36.         return new DefaultSqlSessionFactory(config); 
  37.     } 

輸出和上面一樣。還可以直接使用Java代碼而不用mybatis-config.xml。

  1. //創建數據源 
  2. DataSource dataSource = getDataSource(); 
  3.  
  4. TransactionFactory transactionFactory = new JdbcTransactionFactory(); 
  5.  
  6. Environment environment = new Environment("development", transactionFactory, dataSource); 
  7.  
  8. Configuration configuration = new Configuration(environment); 
  9. configuration.addMapper(BlogMapper.class); 
  10.  
  11. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); 

小總結

從上面這個案例中我們大致能猜到,Mybatis中最主要幾個組件:

SqlSessionFactoryBuilder

SqlSessionFactory

SqlSession

Mapper

SqlSessionFactoryBuilder這個類可以被初始、使用和丟棄,如果你已經創建好了一個 SqlSessionFactory后就不用再保留它。因此 ,SqlSessionFactoryBuilder 的最好作用域是方法體內,比如說定義一個方法變量。

你可以重復使用SqlSessionFactoryBuilder 生成多個 SqlSessionFactory 實例,但是最好不要強行保留,因為 XML 的解析資源要用來做其它更重要的事。

SqlSessionFactory一旦創建,SqlSessionFactory就會在整個應用過程中始終存在。所以沒有理由去銷毀和再創建它,一個 應用運行中也不建議多次創建 SqlSessionFactory。如果真的那樣做,會顯得很拙劣。

因此 SqlSessionFactory最好的作用域是 Application??梢杂卸喾N方法實現。最簡單的方法是單例模式或者是靜態單例模式。然而這既不是廣泛贊成和好用的。反而,使用 Google Guice 或 Spring 來進行依賴反射會更好。這些框架允 許你生成管理器來管理 SqlSessionFactory的單例生命周期

SqlSession每個線程都有自己的 SqlSession 實例,SqlSession 實例是不能被共享,也是不是線程安全的。因此最好 使用 Request 作用域或者方法體作用域。

不要使用類的靜態變量來引用一個 SqlSession 實例,甚至不要使用類的一個實例變更來引用。永遠不要在一個被管理域中引用 SqlSession,比如說在 Servlet 中的HttpSession 中。如果你正在使用 WEB 框架,應該讓 SqlSession 跟隨 HTTP 請求的相似作用域。

也就是說,在收到一個 HTTP 請求過后,打開 SqlSession,等返回一個回應以后,立馬關掉這個 SqlSession。關閉 SqlSession 是非常重要的。你必須要確保 SqlSession 在 finally 方法體中正常關閉。

  1. SqlSession session = sqlSessionFactory.openSession(); 
  2. try { 
  3. // do work 
  4. } finally { 
  5. session.close(); 

使用這種模式來貫穿你的所有代碼,以確保所有數據庫資源都被完全關閉。

Mapper

Mapper 是一種你創建的用于綁定映射語句的接口。Mapper 接口的實例是用 SqlSession 來獲得的。同樣 , 從技術上來說,最廣泛的 Mapper 實例作用域像 SqlSession 一樣,使用請求作用域。確切地說,在方法 被調用的時候調用 Mapper 實例,然后使用后,就自動銷毀掉。不需要使用明確的注銷。當一個請求執 行正確無誤的時候,像 SqlSession 一樣,你可以輕而易舉地操控這一切。保持簡單性,保持 Mapper 在 方法體作用域內。

  1. //獲取數據并解析成User對象 
  2. User user = sqlSession.selectOne("com.tian.mybatis.mapper.UserMapper.selectUserById", 1); 
  3. System.out.println(user); 

這里映射涉及到四個主體:

  1. 實體類User。
  2. 接口UaerMapper。
  3. xml配置文件UserMapper。
  4. 數據庫表m_user

Mybatis的五部曲:

 

總結

 

回顧JDBC的demo,JDBC中的問題,創建一個Mybatis示例,總結出重要的四個組件,以及每個組件的作用。

本文轉載自微信公眾號「Java后端技術全?!梗梢酝ㄟ^以下二維碼關注。轉載本文請聯系Java后端技術全棧公眾號。

 

責任編輯:武曉燕 來源: Java后端技術全棧
相關推薦

2021-09-30 07:59:06

zookeeper一致性算法CAP

2019-08-16 09:41:56

UDP協議TCP

2021-01-15 12:56:36

人工智能人工智能應用

2021-05-07 07:52:51

Java并發編程

2022-03-29 08:23:56

項目數據SIEM

2023-09-25 08:32:03

Redis數據結構

2021-09-10 13:06:45

HDFS底層Hadoop

2023-10-04 00:32:01

數據結構Redis

2023-11-07 07:46:02

GatewayKubernetes

2021-07-28 13:29:57

大數據PandasCSV

2024-08-27 11:00:56

單例池緩存bean

2017-03-30 22:41:55

虛擬化操作系統軟件

2025-02-14 08:53:24

2021-12-13 10:43:45

HashMapJava集合容器

2023-11-22 07:54:33

Xargs命令Linux

2021-10-21 06:52:17

ZooKeeper分布式配置

2023-12-07 09:07:58

2018-09-26 11:02:46

微服務架構組件

2021-04-11 08:30:40

VRAR虛擬現實技術

2022-08-18 20:45:30

HTTP協議數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产福利视频网站 | 人人干免费 | 亚洲欧美日韩国产综合 | 国产精品免费一区二区 | 国产99久久精品一区二区300 | 国产中文一区二区三区 | 亚洲夜射 | 99久9| 国产高清一区二区 | 日韩一区二区三区四区五区 | 国产1区| 久久国产一区二区 | 日韩久久精品 | 欧美一区精品 | 午夜影院在线观看视频 | 毛色毛片免费看 | 亚洲精品乱码久久久久久按摩观 | 久久大| 欧美国产日本一区 | 一区二区三区高清 | 日韩久久久久 | 日韩在线免费电影 | 黄色毛片在线看 | 亚洲一区视频 | 91日b| 国产精品99久久久久久大便 | 久久99久久 | 一区二区三区在线 | 国产一区二区小视频 | 中文字幕日韩一区 | 不卡的av在线| 日本在线一区二区三区 | 日韩毛片在线观看 | 国产情品| 激情五月综合 | 在线成人免费视频 | 亚洲精品欧美一区二区三区 | 中文字幕av在线一二三区 | 超碰操| 蜜桃av人人夜夜澡人人爽 | 免费人成在线观看网站 |