日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Mybatis概述

發布時間:2023/12/18 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mybatis概述 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

mybatis概述

1 mybatis產生的意義

  傳統的jdbc, 及其存在的問題

package cn.rodge.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
?* jdbc測試程序
?* @author Rodge
?*/
public class JDBCDemo {
?? ?private static String driverClass = "com.mysql.jdbc.Driver";
?? ?private static String url = "jdbc:mysql://localhost:3306/mybatis";
?? ?private static String user = "root";
?? ?private static String password = "123";
?? ?
?? ?public static void main(String[] args) {
?? ??? ?Connection connection = null;
?? ??? ?PreparedStatement preparedStatement = null;
?? ??? ?ResultSet resultSet = null;
?? ??? ?try {
?? ??? ??? ?//1.注冊驅動
?? ??? ??? ?Class.forName(driverClass);
?? ??? ??? ?//2.獲取連接
?? ??? ??? ?connection = DriverManager.getConnection(url, user, password);
?? ??? ??? ?//3.編寫sql語句
?? ??? ??? ?String sql = "select * from user where username = ?";
?? ??? ??? ?//4.創建statement
?? ??? ??? ?preparedStatement = connection.prepareStatement(sql);
?? ??? ??? ?preparedStatement.setString(1, "王五");
?? ??? ??? ?//5.查詢獲取返回結果
?? ??? ??? ?resultSet = preparedStatement.executeQuery();
?? ??? ??? ?//6.遍歷查詢結果
?? ??? ??? ?while (resultSet.next()) {
?? ??? ??? ??? ?System.out.println(resultSet.getString("id") + "?? " + resultSet.getString("username"));
?? ??? ??? ?}
?? ??? ?} catch (ClassNotFoundException | SQLException e) {
?? ??? ??? ?// TODO Auto-generated catch block
?? ??? ??? ?e.printStackTrace();
?? ??? ?} finally {
?? ??? ??? ?//釋放資源
?? ??? ??? ?if (connection != null) {
?? ??? ??? ??? ?try {
?? ??? ??? ??? ??? ?connection.close();
?? ??? ??? ??? ?} catch (SQLException e) {
?? ??? ??? ??? ??? ?e.printStackTrace();
?? ??? ??? ??? ?} finally {
?? ??? ??? ??? ??? ?connection = null;
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?if (preparedStatement != null) {
?? ??? ??? ??? ?try {
?? ??? ??? ??? ??? ?preparedStatement.close();
?? ??? ??? ??? ?} catch (SQLException e) {
?? ??? ??? ??? ??? ?e.printStackTrace();
?? ??? ??? ??? ?} finally {
?? ??? ??? ??? ??? ?preparedStatement = null;
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?if (resultSet != null) {
?? ??? ??? ??? ?try {
?? ??? ??? ??? ??? ?resultSet.close();
?? ??? ??? ??? ?} catch (SQLException e) {
?? ??? ??? ??? ??? ?e.printStackTrace();
?? ??? ??? ??? ?} finally {
?? ??? ??? ??? ??? ?resultSet = null;
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ?}
?? ??? ?
?? ?}
}
  傳統jdbc存在的問題

1. 數據庫鏈接的頻繁創建和釋放會造成系統資源的浪費,從而影響系統性能--->數據庫連接池可以解決此問題;

  解決:在SqlMapConfig.xml中配置數據鏈接池,使用連接池管理數據庫鏈接。

2.?數據庫連接信息和sql語句在程序中的硬編碼,? 造成代碼不易維護,在實際應用中sql語句的變化可能性較大, sql語句的改動會造成java代碼的改動;

  解決:Mybatis將Sql語句配置在XXXXmapper.xml文件中與java代碼分離。

3. 使用preparedStatement向占位符?中傳入參數存在硬編碼,因為sql語句中where條件不一定,可能多也可能少,還有可能修改SQL語句,不利于系統維護;

  解決:Mybatis自動將java對象映射至sql語句,通過statement中的parameterType定義輸入參數的類型。

4. 對結果集的解析存在硬編碼(查詢列名),sql變化導致解析代碼變化,不利于系統維護, 如果能查詢數據庫的結果封裝成pojo對象,這樣解析起來就比較方便

  解決:Mybatis自動將sql執行結果映射至java對象,通過statement中的resultType定義輸出結果的類型。

?  針對上述jdbc存在的問題, mybatis提供了解決方案:

  MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,并且改名為MyBatis 。2013年11月遷移到Github。

   MyBatis是一個優秀的持久層框架,它對jdbc的操作數據庫的過程進行封裝,使開發者只需要關注 SQL 本身而不需要花費精力去處理例如注冊驅動、創建connection、創建statement、手動設置參數、結果集檢索等jdbc繁雜的過程代碼

  Mybatis通過xml或注解的方式將要執行的各種statement(statement、preparedStatemnt、CallableStatement)配置起來,并通過java對象和statement中的sql進行映射生成最終執行的sql語句,最后由mybatis框架執行sql并將結果映射成java對象并返回。

2 mybatis基本架構

?

1)? mybatis配置

  SqlMapConfig.xml,此文件作為mybatis的全局配置文件,配置了mybatis的運行環境等信息。

  mapper.xml文件即sql映射文件,文件中配置了操作數據庫的sql語句。此文件需要在SqlMapConfig.xml中加載。

2)? 通過mybatis環境等配置信息構造SqlSessionFactory即會話工廠

3)? 由會話工廠創建sqlSession即會話,操作數據庫需要通過sqlSession進行。

4)? mybatis底層自定義了Executor執行器接口操作數據庫,Executor接口有兩個實現,一個是基本執行器、一個是緩存執行器。

5)? Mapped Statement也是mybatis一個底層封裝對象,它包裝了mybatis配置信息及sql映射信息等。mapper.xml文件中一個sql對應一個Mapped Statement對象,sql的id即是Mapped statement的id。

6)? Mapped Statement對sql執行輸入參數進行定義,包括HashMap、基本類型、pojo,Executor通過Mapped Statement在執行sql前將輸入的java對象映射至sql中,輸入參數映射就是jdbc編程中對preparedStatement設置參數。

7)? Mapped Statement對sql執行輸出結果進行定義,包括HashMap、基本類型、pojo,Executor通過Mapped Statement在執行sql后將輸出結果映射至java對象中,輸出結果映射過程相當于jdbc編程中對結果的解析處理過程。

3 mybatis與hibernate不同

  Mybatis和hibernate不同,它不完全是一個ORM框架,因為MyBatis需要程序員自己編寫Sql語句,不過mybatis可以通過XML或注解方式靈活配置要運行的sql語句,并將java對象和sql語句映射生成最終執行的sql,最后將sql執行的結果再映射生成java對象。

  Mybatis學習門檻低,簡單易學,程序員直接編寫原生態sql,可嚴格控制sql執行性能,靈活度高,非常適合對關系數據模型要求不高的軟件開發,例如互聯網軟件、企業運營類軟件等,因為這類軟件需求變化頻繁,一但需求變化要求成果輸出迅速。但是靈活的前提是mybatis無法做到數據庫無關性,如果需要實現支持多種數據庫的軟件則需要自定義多套sql映射文件,工作量大。

  Hibernate對象/關系映射能力強,數據庫無關性好,對于關系模型要求高的軟件(例如需求固定的定制化軟件)如果用hibernate開發可以節省很多代碼,提高效率。但是Hibernate的學習門檻高,要精通門檻更高,而且怎么設計O/R映射,在性能和對象模型之間如何權衡,以及怎樣用好Hibernate需要具有很強的經驗和能力才行。

  總之,按照用戶的需求在有限的資源環境下只要能做出維護性、擴展性良好的軟件架構都是好架構,所以框架只有適合才是最好。

?

轉載于:https://www.cnblogs.com/rodge-run/p/6516291.html

總結

以上是生活随笔為你收集整理的Mybatis概述的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。