日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
教小師妹快速入門Mybatis,看這篇就夠了

本文主要內(nèi)容:

為樂業(yè)等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及樂業(yè)網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、樂業(yè)網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

傳統(tǒng)JDBC

傳統(tǒng)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.     public static void main(String[] args) throws Exception {
  6.         
  7.         Class.forName("com.mysql.jdbc.Driver");
  8.         //2. 
  9.         Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
  10.         //3.
  11.         Statement stmt = conn.createStatement();
  12.         //4.
  13.         ResultSet rs = stmt.executeQuery("SELECT id, name, age FROM m_user where id =1");
  14.         //如果有數(shù)據(jù),rs.next()返回true
  15.         while(rs.next()){
  16.             System.out.println("name: "+rs.getString("name")+" 年齡:"+rs.getInt("age"));
  17.         }
  18.     }
  19. }

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

大致可以分為六個(gè)步驟:

  • 加載驅(qū)動(dòng)程序
  • 獲得數(shù)據(jù)庫連接
  • 創(chuàng)建一個(gè)Statement對(duì)象
  • 操作數(shù)據(jù)庫,實(shí)現(xiàn)增刪改查
  • 獲取結(jié)果集
  • 關(guān)閉資源

從使用層面來說,采用原生態(tài)的JDBC在項(xiàng)目中使用起來成本還是很高的。如果我們的項(xiàng)目中的業(yè)務(wù)相對(duì)比較復(fù)雜,數(shù)據(jù)庫表也相對(duì)較多,各種操作數(shù)據(jù)庫的增刪改查的方法也會(huì)隨之多起來,那么這樣的代碼重復(fù)次數(shù)會(huì)非常之多。

傳統(tǒng)JDBC的問題

  • 創(chuàng)建數(shù)據(jù)庫的連接存在大量的硬編碼,
  • 執(zhí)行statement時(shí)存在硬編碼.
  • 頻繁的開啟和關(guān)閉數(shù)據(jù)庫連接,會(huì)嚴(yán)重影響數(shù)據(jù)庫的性能,浪費(fèi)數(shù)據(jù)庫的資源.
  • 存在大量的重復(fù)性編碼

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

什么是ORM?

全稱為Object Relational Mapping。對(duì)象-映射-關(guān)系型數(shù)據(jù)庫。對(duì)象關(guān)系映射(,簡(jiǎn)稱ORM,或O/RM,或O/R mapping),用于實(shí)現(xiàn)面向?qū)ο缶幊陶Z言里不同類型系統(tǒng)的數(shù)據(jù)之間的轉(zhuǎn)換。簡(jiǎn)單的說,ORM是通過使用描述對(duì)象和數(shù)據(jù)庫之間映射的元數(shù)據(jù),將程序中的對(duì)象與關(guān)系數(shù)據(jù)庫相互映射。

ORM提供了實(shí)現(xiàn)持久化層的另一種模式,它采用映射元數(shù)據(jù)來描述對(duì)象關(guān)系的映射,使得ORM中間件能在任何一個(gè)應(yīng)用的業(yè)務(wù)邏輯層和數(shù)據(jù)庫層之間充當(dāng)橋梁。

我們的項(xiàng)目中是這樣的:

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

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

ORM的優(yōu)缺點(diǎn)

優(yōu)點(diǎn)1.提高了開發(fā)效率。由于ORM可以自動(dòng)對(duì)Entity對(duì)象與數(shù)據(jù)庫中的Table進(jìn)行字段與屬性的映射,所以我們實(shí)際可能已經(jīng)不需要一個(gè)專用的、龐大的數(shù)據(jù)訪問層。2.ORM提供了對(duì)數(shù)據(jù)庫的映射,不用sql直接編碼,能夠像操作對(duì)象一樣從數(shù)據(jù)庫獲取數(shù)據(jù)。

缺點(diǎn)犧牲程序的執(zhí)行效率和會(huì)固定思維模式,降低了開發(fā)的靈活性。

從系統(tǒng)結(jié)構(gòu)上來看,采用ORM的系統(tǒng)一般都是多層系統(tǒng),系統(tǒng)的層次多了,效率就會(huì)降低。ORM是一種完全的面向?qū)ο蟮淖龇ǎ嫦驅(qū)ο蟮淖龇ㄒ矔?huì)對(duì)性能產(chǎn)生一定的影響。在我們開發(fā)系統(tǒng)時(shí),一般都有性能問題。性能問題主要產(chǎn)生在算法不正確和與數(shù)據(jù)庫不正確的使用上。ORM所生成的代碼一般不太可能寫出很高效的算法,在數(shù)據(jù)庫應(yīng)用上更有可能會(huì)被誤用,主要體現(xiàn)在對(duì)持久對(duì)象的提取和和數(shù)據(jù)的加工處理上,如果用上了ORM,程序員很有可能將全部的數(shù)據(jù)提取到內(nèi)存對(duì)象中,然后再進(jìn)行過濾和加工處理,這樣就容易產(chǎn)生性能問題。在對(duì)對(duì)象做持久化時(shí),ORM一般會(huì)持久化所有的屬性,有時(shí),這是不希望的。但ORM是一種工具,工具確實(shí)能解決一些重復(fù),簡(jiǎn)單的勞動(dòng)。這是不可否認(rèn)的。但我們不能指望工具能一勞永逸的解決所有問題,有些問題還是需要特殊處理的,但需要特殊處理的部分對(duì)絕大多數(shù)的系統(tǒng),應(yīng)該是很少的。

MyBatis 是什么?

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

MyBatis 是一款優(yōu)秀的持久層框架,它支持自定義 SQL、存儲(chǔ)過程以及高級(jí)映射。

MyBatis 免除了幾乎所有的 JDBC 代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作。

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

來自官網(wǎng)。

MyBatis的優(yōu)點(diǎn)和缺點(diǎn)

優(yōu)點(diǎn):

(1)基于SQL語句編程,相當(dāng)靈活,不會(huì)對(duì)應(yīng)用程序或者數(shù)據(jù)庫的現(xiàn)有設(shè)計(jì)造成任何影響,SQL寫在XML里,解除sql與程序代碼的耦合,便于統(tǒng)一管理;提供XML標(biāo)簽,支持編寫動(dòng)態(tài)SQL語句,并可重用。

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

(3)很好的與各種數(shù)據(jù)庫兼容(因?yàn)镸yBatis使用JDBC來連接數(shù)據(jù)庫,所以只要JDBC支持的數(shù)據(jù)庫MyBatis都支持)。

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

(5)提供映射標(biāo)簽,支持對(duì)象與數(shù)據(jù)庫的ORM字段關(guān)系映射;提供對(duì)象關(guān)系映射標(biāo)簽,支持對(duì)象關(guān)系組件維護(hù)。

缺點(diǎn)

(1)SQL語句的編寫工作量較大,尤其當(dāng)字段多、關(guān)聯(lián)表多時(shí),對(duì)開發(fā)人員編寫SQL語句的功底有一定要求。

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

Mybatis環(huán)境搭建及簡(jiǎn)單實(shí)例

創(chuàng)建一張數(shù)據(jù)庫表

創(chuàng)建一張m_user表使用MySQL數(shù)據(jù)庫。

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

添加依賴

 
 
 
 
  1.             org.mybatis
  2.             mybatis
  3.             3.5.2
  4.         
  5.         
  6.             mysql
  7.             mysql-connector-java
  8.             8.0.16
  9.             runtime
  10.         

項(xiàng)目結(jié)構(gòu)如下:

創(chuàng)建一個(gè)mybatis-config.xml

 
 
 
 
  1.         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  2.         "http://mybatis.org/dtd/mybatis-3-config.dtd">
  3.     
  4.         
  5.             
  6.             
  7.                 
  8.                 
  9.                 
  10.                 
  11.             
  12.         
  13.     
  14.     
  15.         
  16.     

實(shí)體類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.     }
  14. }

創(chuàng)建UserMapper.java

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

創(chuàng)建UserMapper.xml

 
 
 
 
  1.         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  2.         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3.     
  4.         select * from m_user where id = #{id}
  5.     

創(chuàng)建一個(gè)測(cè)試類

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

輸出結(jié)果:

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

整體步驟:

另外一種啟動(dòng)方式

 
 
 
 
  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. import java.io.IOException;
  10. import java.io.InputStream;
  11. import java.util.Properties;
  12. public class MybatisApplication {
  13.     public static void main(String[] args) {
  14.         String resource = "mybatis-config.xml";
  15.         InputStream inputStream = null;
  16.         try {
  17.             inputStream = Resources.getResourceAsStream(resource);
  18.         } catch (IOException e) {
  19.             e.printStackTrace();
  20.         }
  21.         //解析xml文件
  22.         XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, null, null);
  23.         //構(gòu)建一個(gè)SqlSessionFactory工廠類
  24.         SqlSessionFactory sqlSessionFactory = build(parser.parse());
  25.         //創(chuàng)建一個(gè)SqlSession
  26.         SqlSession sqlSession = sqlSessionFactory.openSession();
  27.         //獲取數(shù)據(jù)并解析成User對(duì)象
  28.         User user = sqlSession.selectOne("com.tian.mybatis.mapper.UserMapper.selectUserById", 1);
  29.         System.out.println(user);
  30.     }
  31.     public static SqlSessionFactory build(Configuration config) {
  32.         return new DefaultSqlSessionFactory(config);
  33.     }
  34. }

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

 
 
 
 
  1. //創(chuàng)建數(shù)據(jù)源
  2. DataSource dataSource = getDataSource();
  3. TransactionFactory transactionFactory = new JdbcTransactionFactory();
  4. Environment environment = new Environment("development", transactionFactory, dataSource);
  5. Configuration configuration = new Configuration(environment);
  6. configuration.addMapper(BlogMapper.class);
  7. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);

小總結(jié)

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

SqlSessionFactoryBuilder

SqlSessionFactory

SqlSession

Mapper

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

你可以重復(fù)使用SqlSessionFactoryBuilder 生成多個(gè) SqlSessionFactory 實(shí)例,但是最好不要強(qiáng)行保留,因?yàn)?XML 的解析資源要用來做其它更重要的事。

SqlSessionFactory一旦創(chuàng)建,SqlSessionFactory就會(huì)在整個(gè)應(yīng)用過程中始終存在。所以沒有理由去銷毀和再創(chuàng)建它,一個(gè) 應(yīng)用運(yùn)行中也不建議多次創(chuàng)建 SqlSessionFactory。如果真的那樣做,會(huì)顯得很拙劣。

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

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

不要使用類的靜態(tài)變量來引用一個(gè) SqlSession 實(shí)例,甚至不要使用類的一個(gè)實(shí)例變更來引用。永遠(yuǎn)不要在一個(gè)被管理域中引用 SqlSession,比如說在 Servlet 中的HttpSession 中。如果你正在使用 WEB 框架,應(yīng)該讓 SqlSession 跟隨 HTTP 請(qǐng)求的相似作用域。

也就是說,在收到一個(gè) HTTP 請(qǐng)求過后,打開 SqlSession,等返回一個(gè)回應(yīng)以后,立馬關(guān)掉這個(gè) SqlSession。關(guān)閉 SqlSession 是非常重要的。你必須要確保 SqlSession 在 finally 方法體中正常關(guān)閉。

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

使用這種模式來貫穿你的所有代碼,以確保所有數(shù)據(jù)庫資源都被完全關(guān)閉。

Mapper

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

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

這里映射涉及到四個(gè)主體:

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

Mybatis的五部曲:

總結(jié)

回顧JDBC的demo,JDBC中的問題,創(chuàng)建一個(gè)Mybatis示例,總結(jié)出重要的四個(gè)組件,以及每個(gè)組件的作用。

本文轉(zhuǎn)載自微信公眾號(hào)「Java后端技術(shù)全棧」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Java后端技術(shù)全棧公眾號(hào)。


分享文章:教小師妹快速入門Mybatis,看這篇就夠了
分享網(wǎng)址:http://m.5511xx.com/article/dhcshcj.html