研究資料庫-如何使用mybatis

youou發表於2021-09-09

前言

為了更好的理解 mybatis 這個框架的使用方式,我取樣無其他框架的 Demo 直接使用 mybatis ,來學習 mybatis 的使用。讓程式碼是如何呼叫的,結構清晰的展示出來,知道哪裡做了關聯,哪裡做了輸入輸出,而且還透過為什麼要使用框架,沒有框架之前是怎樣,使用框架時解決了什麼問題,都一一做解釋。

圖片描述

思考

使用 Java 程式碼連線資料庫,會有這樣一個問題,就是我是連線一次就斷開,還是一直保持連線的狀態,首先我先來看這份程式碼

import java.sql.*;
public class connectdt {//此類為連線資料庫的類
	static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
	static final String DB_URL = "jdbc:mysql://localhost/emp";
	static final String USER = "root";
	static final String PASS = "123456";
	String struser = "username", strpass = "password", strtable1 = "admindt", strtable2 = "books",ID="id";
	Connection conn = null;
	Statement stmt = null;

	public connectdt() {
		try {
			Class.forName(JDBC_DRIVER);// 工程要連線額外的jar包
			conn = DriverManager.getConnection(DB_URL, USER, PASS);
			stmt = conn.createStatement();
		} catch (Exception ee) {
			ee.printStackTrace();
		}
	}
}

以上是一份很正常的 JDBC 連線程式碼,那好,我們下次再運算元據庫的時候是再連線一次(再次呼叫),還是說這份連線可以一直保持連線的狀態,不需要再次連線。很顯然,我這份程式碼每次使用資料庫都會連線一次,有好處也有壞處,好處就是,如果你長時間不使用資料庫的連線,我這份程式碼就顯得很優雅,因為沒有造成浪費,壞處就是如果頻繁使用,一旦出現頻繁的關閉和開啟,就會造成浪費。

  • 只連一次就關閉
public class addook extends JFrame implements ActionListener{
	JLabel label[]={new JLabel("ISBN"),new JLabel("書名"),new JLabel("出版社"),new JLabel("庫存")};
	JTextField field[]={new JTextField(),new JTextField(),new JTextField(),new JTextField()};
	JButton submit=new JButton("新增");
	String namepattern = "[u4e00-u9fa5]{4,15}";//4到15位漢字
	String sql="";
	connectdt jdbc = new connectdt();// 連線資料庫類
	Statement stmt = jdbc.stmt;
	public addook(){…//此處省略數行程式碼
	public void init(){…//此處省略數行程式碼
	public void actionPerformed(ActionEvent e) {
		try {
			if(e.getSource()==submit){
				sql="insert into books (ISBN,TITLE,PUBLISH,STOCK) values('"+strT[0]+"','"+strT[1]+"','"+strT[2]+"',"+strT[3]+");";
				rs.close();//關閉
				stmt.close();//關閉
				dispose();	
			}
		}catch (Exception ee) {
			ee.printStackTrace();
		}
	}
}

是自己管理還是交給封裝性更好的程式碼來管理呢?於是連線池出現。

連線池

  • 持久連線
    連線池是維護的資料庫連線的快取,以便在將來需要對資料庫的請求時可以重用這些連線。連線池用於增強在資料庫上執行命令的效能。為每個使用者開啟和維護資料庫連線,尤其是對動態資料庫驅動網站的請求應用,成本高昂,浪費資源。在連線池中,建立連線後,將其放置在池中,並再次使用它,因此不必建立新的連線。如果使用了所有連線,則會建立一個新連線並將其新增到池中。連線池還減少了使用者必須等待建立與資料庫的連線的時間。

使用連線池

在使用連線池之後,我們發現很多時候寫一份SQL難以滿足我們的需求,會出現頻繁更新SQL語句的情況,比如更新操作,有的時候我們需要更新三個引數,寫一個更新的SQL語句:

UPDATE pssm_goods_category set name='辦公用品1',category_level1='701',category_level2='0' WHERE id=49;

當更新一個引數的時候需要寫另一個語句:

UPDATE pssm_goods_category set name='辦公用品1',category_level1='701' WHERE id=49;

如果有50個引數呢?於是出現了動態SQL的概念

<update id="updateGoodsCategoryByTargetItem" parameterType="com.supermarket.pssmsys.entity.GoodsCategory"
		>
		UPDATE pssm_goods_category
		<set>
			<if test="targetItem.name!=null">name=#{targetItem.name},</if>
			<if test="targetItem.categoryLevel1>0">category_level1=#{targetItem.categoryLevel1},</if>
			<if test="targetItem.categoryLevel2>0">category_level2=#{targetItem.categoryLevel2},</if>
			<if test="targetItem.createTime!=null">create_time=#{targetItem.createTime},</if>
			<if test="targetItem.editTime!=null">edit_time=#{targetItem.editTime}</if>
		</set>
		WHERE
		id = #{targetItem.id}	
	</update>

MyBatis

  • 持久框架
    MyBatis就支援動態SQL,意味著寫一份SQL就可以支援多種使用方式。
    MyBatis是一個Java持久化框架,它透過XML描述符或註解把物件與儲存過程或SQL語句關聯起來。
    與其他的物件關係對映框架不同,MyBatis並沒有將Java物件與資料庫表關聯起來,而是將Java方法與SQL語句關聯。MyBatis允許使用者充分利用資料庫的各種功能,例如儲存過程、檢視、各種複雜的查詢以及某資料庫的專有特性。如果要對遺留資料庫、不規範的資料庫進行操作,或者要完全控制SQL的執行,MyBatis是一個不錯的選擇。
    與JDBC相比,MyBatis簡化了相關程式碼:SQL語句在一行程式碼中就能執行。MyBatis提供了一個對映引擎,宣告式的把SQL語句執行結果與物件樹對映起來。透過使用一種內建的類XML表示式語言,或者使用Apache Velocity整合的外掛,SQL語句可以被動態的生成。

如何使用MyBatis

public class Main {
	public static void main(String[] args) throws IOException {
        //mybatis的配置檔案
        String resource = "mybatis-config.xml";
        //使用類載入器載入mybatis的配置檔案(它也載入關聯的對映檔案)
        InputStream is = Main.class.getClassLoader().getResourceAsStream(resource);
        //構建sqlSession的工廠
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
        //建立能執行對映檔案中sql的sqlSession
        SqlSession session = sessionFactory.openSession();
        /**
         * 對映sql的標識字串,
         * com.caeser.service.BookMapper是BookMapper.xml檔案中mapper標籤的namespace屬性的值,
         * getTITLE是select標籤的id屬性值,透過select標籤的id屬性值就可以找到要執行的SQL
         */
        String statement = "com.caeser.entity.Books.getTITLE";//對映sql的標識字串

        BookMapper bookMapper = session.getMapper(BookMapper.class);

        //執行查詢返回一個唯一user物件的sql
        Books books = bookMapper.getBook(1);
        System.out.println(books.getTITLE());

        session.close();
    }
}

結尾

前半段的程式碼來自我很久之前的一份圖書管理系統的原始碼,很多大學新生都在研究使用我的那份程式碼,我感到很榮幸。後半段的程式碼來自畢設專案,使用了MyBatis 的動態SQL,很方便的實現了一份程式碼多種場合的複用。
最近一段時間可能會比較忙吧,我會盡量寫點有用的東西,也開始逐步學習前端的知識,不過我發現,前端的知識很零碎,沒有那麼多的長篇大論,這需要引起的重視,注重積累,以前我總以為前端沒什麼邏輯,學習起來就是在背誦的感覺,慢慢的我覺得前端也挺好玩的了。
資料庫方面有很長的路要走,雙12了,也快年底了,各位2019年的願望完成了多少呀?
圖片描述

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4729/viewspace-2824501/,如需轉載,請註明出處,否則將追究法律責任。

相關文章