經典三層框架初識--一.Mybatis(中),其他案例
阿新 • • 發佈:2018-12-17
做到現在,我們已經配置完全域性配置檔案了,這個配置檔案只要第一次配置好,暫時就不必再理它了.我們以後做的增刪改查的操作都在對映配置中修改就可以了.現在我們來做三個案例,查詢全部,模糊查詢,和插入.插入,修改,刪除除了關鍵字不同外,其他的基本一樣,所以這裡我們就用插入來作為代表了.
下面我將三個操作的配置檔案寫在下面: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: 既然框架關閉了,那我們就手動提交,如下圖.