1. 程式人生 > >經典三層框架初識--一.Mybatis(中),其他案例

經典三層框架初識--一.Mybatis(中),其他案例

       做到現在,我們已經配置完全域性配置檔案了,這個配置檔案只要第一次配置好,暫時就不必再理它了.我們以後做的增刪改查的操作都在對映配置中修改就可以了.現在我們來做三個案例,查詢全部,模糊查詢,和插入.插入,修改,刪除除了關鍵字不同外,其他的基本一樣,所以這裡我們就用插入來作為代表了.

下面我將三個操作的配置檔案寫在下面:UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="adhs">
  <select id="selectUser"  resultType="userinfo">
    select * from userinfo where uid = #{uid}
  </select>
  
  <!-- 查詢所有 -->
  <!-- 前面我們提過,對映這部門我們只關注三點就夠了,sql語句,輸入引數和輸出結果,其他東西框架都處理好了
  	這裡格外注意下輸出結果___resulType:封裝到哪個物件中去
  -->
  <select id="selectAll" resultType="userinfo">
  	select * from userinfo 
  	<!-- 這裡我們發現,這裡和以前不同,這裡查詢的是一個結果集,不是單一記錄了.
  		但是resultType寫的就是單個結果型別,無論你查詢出來的是一個還是多個.那我們怎麼得到多個結果呢?
  		在呼叫的時候用查詢多個的方法來解決這個問題
  	 -->
  </select>
  <!-- 模糊查詢 -->
  <!-- 
  	這裡匯入了一個log4j的jar包,能夠支援日誌輸出
  	log4j.properties  控制哪些日誌可以輸出,日誌輸出的格式
   -->
   <!-- 
   	${}:和#{}表示佔位不同,這個符號表示連線
   		裡面的關鍵字:同樣和輸入引數有關
   			簡單型別:value
   			引用:物件屬性名
    -->
  <select id="selectLikeName" resultType="userinfo">
  	select * from userinfo where username like '%${value}%'
  </select>
  
  <!-- 插入 -->
  <insert id="insert" >
 	insert into userinfo(username,password) values(#{username},#{password})
  </insert>
 
</mapper>



測試的程式碼我寫在下面:test

①.查詢全部

public class Test {

	public static void main(String[] args) throws IOException {

		Reader reader = Resources.getResourceAsReader("mybatis.xml");
		SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
		SqlSession session = ssf.openSession();
		//查詢全部
		List<UserInfo> list = session.selectList("adhs.selectAll");
		
		System.out.println(list);
                //歸還連線
		session.close();
		
	}

}

因為我們匯入了和日誌輸出有關的jar包,這裡我就簡單將控制檯輸出的結果貼在下面

DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
DEBUG [main] - Class not found: org.jboss.vfs.VFS
DEBUG [main] - JBoss 6 VFS API is not available in this environment.
DEBUG [main] - Class not found: org.jboss.vfs.VirtualFile
DEBUG [main] - VFS implementation org.apache.ibatis.io.JBoss6VFS is not valid in this environment.
DEBUG [main] - Using VFS adapter org.apache.ibatis.io.DefaultVFS
DEBUG [main] - Find JAR URL: file:/D:/workspaceofEE/Zmybatis01/bin/pojo
DEBUG [main] - Not a JAR: file:/D:/workspaceofEE/Zmybatis01/bin/pojo
DEBUG [main] - Reader entry: UserInfo.class
DEBUG [main] - Listing file:/D:/workspaceofEE/Zmybatis01/bin/pojo
DEBUG [main] - Find JAR URL: file:/D:/workspaceofEE/Zmybatis01/bin/pojo/UserInfo.class
DEBUG [main] - Not a JAR: file:/D:/workspaceofEE/Zmybatis01/bin/pojo/UserInfo.class
DEBUG [main] - Reader entry: 這裡有些亂碼
DEBUG [main] - Checking to see if class pojo.UserInfo matches criteria [is assignable to Object]
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 1007653873.
DEBUG [main] - Setting autocommit to false on JDBC Connection [
[email protected]
] DEBUG [main] - ==> Preparing: select * from userinfo DEBUG [main] - ==> Parameters: DEBUG [main] - <== Total: 3 [UserInfo [uid=1, username=litao, password=123], UserInfo [uid=2, username=li, password=234], UserInfo [uid=8, username=ww, password=123]] DEBUG [main] - Resetting autocommit to true on JDBC Connection [[email protected]] DEBUG [main] - Closing JDBC Connection [[email protected]] DEBUG [main] - Returned connection 1007653873 to pool.

 這裡我們可以通過日誌瞭解到程式執行的每個步驟.還是蠻方便的.

②.模糊查詢

這裡主要看上面的對映配置,有一個${}作為連線的需要我們熟悉掌握.其他的就很容易理解了.程式碼我就直接放在下面.

public class Test {

	public static void main(String[] args) throws IOException {

		Reader reader = Resources.getResourceAsReader("mybatis.xml");
		SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
		SqlSession session = ssf.openSession();
		
		List<UserInfo> list = session.selectList("adhs.selectLikeName","i");
		System.out.println(list);
		//歸還連線
		session.close();
		
	}

}

③.下面注意說一下第三個,插入.先看一下插入的程式碼

public class Test {

	public static void main(String[] args) throws IOException {

		Reader reader = Resources.getResourceAsReader("mybatis.xml");
		SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
		SqlSession session = ssf.openSession();
		
		//插入
		//我們這裡傳入的是一個物件.
		UserInfo info = new UserInfo();
		info.setPassword("123");
		info.setUsername("lele");
		int rows = session.insert("adhs.insert",info);
		System.out.println(rows);
		//歸還連線
		session.close();
		//歸還連線
		session.close();
		
	}

}

執行結果看下面:

我們發現,日誌並沒有報錯,而且和我們以前sql返回的一樣,影響了一條記錄.從這裡看貌似是成功了,但是我們開啟資料發現,表中並沒有新的記錄產生.這是為什麼呢?

我們仔細看日誌,紅色框上面我們發現有一句setting autocommit to false...而紅框下面resetting autocommit to true ..翻譯過來就是,在我們sql語句執行前,框架把自動提交關了,等我們執行完sql,它又重新打開了自動提交,這不是相當於我們的SQL指令根本沒有提交嗎?搞笑呢?

所以這裡我們有兩種解決辦法:

方案1:按照下圖的,在建立session的時候傳入一個true,以為這開啟自動提交..多打了一個歸還連線..失誤 ..失誤..

方案2: 既然框架關閉了,那我們就手動提交,如下圖.