<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Mybatis 中連線池技術,它採用的是自己的連線池技術。在 Mybatis 的 SqlMapConfig.xml 組態檔中,通過來實現 Mybatis 中連線池的設定。
在 Mybatis 中我們將它的資料來源 dataSource 分為以下幾類:
可以看出 Mybatis 將它自己的資料來源分為三類:
UNPOOLED
不使用連線池的資料來源 POOLED
使用連線池的資料來源 JNDI
使用 JNDI 實現的資料來源具體結構如下:
相應地,MyBatis 內部分別定義了實現了 java.sql.DataSource 介面的 UnpooledDataSource,PooledDataSource 類來表示 UNPOOLED、POOLED 型別的資料來源。
在這三種資料來源中,我們一般採用的是 POOLED 資料來源(很多時候我們所說的資料來源就是為了更好的管理資料庫連線,也就是我們所說的連線池技術)。
MyBatis 在初始化時,根據的 type 屬性來建立相應型別的的資料來源 DataSource,即:
我們的資料來源設定就是在 SqlMapConfig.xml 檔案中,具體設定如下:
<!-- 設定資料來源(連線池)資訊 --> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource>
在 JDBC 中我們可以通過手動方式將事務的提交改為手動方式,通過 setAutoCommit()方法就可以調整。
通過 JDK 檔案,我們找到該方法如下:
那麼我們的 Mybatis 框架因為是對 JDBC 的封裝,所以 Mybatis 框架的事務控制方式,本身也是用 JDBC 的setAutoCommit()方法來設定事務提交方式的。
Mybatis 中事務的提交方式,本質上就是呼叫 JDBC 的 setAutoCommit()來實現事務控制。
我們執行之前所寫的程式碼:
@Test public void testSaveUser() throws Exception { User user = new User(); user.setUsername("mybatis user09"); //6.執行操作 int res = userDao.saveUser(user); System.out.println(res); System.out.println(user.getId()); } @Before//在測試方法執行之前執行 public void init()throws Exception { //1.讀取組態檔 in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2.建立構建者物件 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //3.建立 SqlSession 工廠物件 factory = builder.build(in); //4.建立 SqlSession 物件 session = factory.openSession(); //5.建立 Dao 的代理物件 userDao = session.getMapper(IUserDao.class); } @After//在測試方法執行完成之後執行 public void destroy() throws Exception{ //7.提交事務 session.commit(); //8.釋放資源 session.close(); in.close(); }
預設 setAutoCommit()方法,在執行時它的值被設定為 false 了,所以我們在 CUD 操作中,必須通過 sqlSession.commit()方法來執行提交操作。
通過上面的研究和分析,現在我們一起思考,為什麼 CUD 過程中必須使用 sqlSession.commit()提交事務?主要原因就是在連線池中取出的連線,都會將呼叫 connection.setAutoCommit(false)方法,這樣我們就必須使用 sqlSession.commit()方法,相當於使用了 JDBC 中的 connection.commit()方法實現事務提交。
明白這一點後,我們現在一起嘗試不進行手動提交,一樣實現 CUD 操作。
@Before//在測試方法執行之前執行 public void init()throws Exception { //1.讀取組態檔 in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2.建立構建者物件 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //3.建立 SqlSession 工廠物件 factory = builder.build(in); //4.建立 SqlSession 物件 **session = factory.openSession(true);** //5.建立 Dao 的代理物件 userDao = session.getMapper(IUserDao.class); } @After//在測試方法執行完成之後執行 public void destroy() throws Exception{ //7.釋放資源 session.close(); in.close(); }
事務就設定為自動提交了,同樣可以實現CUD操作時記錄的儲存。雖然這也是一種方式,但就程式設計而言,設定為自動提交方式為 false 再根據情況決定是否進行提交,這種方式更常用。因為我們可以根據業務情況來決定提交是否進行提交。
Mybatis 的對映檔案中,前面我們的 SQL 都是比較簡單的,有些時候業務邏輯複雜時,我們的 SQL 是動態變化的,此時在前面的學習中我們的 SQL 就不能滿足要求了。
參考的官方檔案,描述如下:
我們根據實體類的不同取值,使用不同的 SQL 語句來進行查詢。比如在 id 如果不為空時可以根據 id 查詢,如果 username 不同空時還要加入使用者名稱作為條件。這種情況在我們的多條件組合查詢中經常會碰到。
/** * 根據使用者資訊,查詢使用者列表 * @param user * @return */ List<User> findByUser(User user);
<select id="findByUser" resultType="user" parameterType="user"> select * from user where 1=1 <if test="username!=null and username != '' "> and username like #{username} </if> <if test="address != null"> and address like #{address} </if> </select>
注意:<if>標籤的 test 屬性中寫的是物件的屬性名,如果是包裝類的物件要使用 OGNL 表示式的寫法。
另外要注意 where 1=1 的作用~!
@Test public void testFindByUser() { User u = new User(); u.setUsername("%王%"); u.setAddress("%順義%"); //6.執行操作 List<User> users = userDao.findByUser(u); for(User user : users) { System.out.println(user); } }
為了簡化上面 where 1=1 的條件拼裝,我們可以採用標籤來簡化開發。
<!-- 根據使用者資訊查詢 --> <select id="findByUser" resultType="user" parameterType="user"> <include refid="defaultSql"> </include> <where> <if test="username!=null and username != '' "> and username like #{username} </if> <if test="address != null"> and address like #{address} </if> </where> </select>
需求
傳入多個 id 查詢使用者資訊,用下邊兩個 sql 實現:
SELECT * FROM USERS WHERE username LIKE ‘%張%' AND (id =10 OR id =89 OR id=16) SELECT * FROM USERS WHERE username LIKE ‘%張%' AND id IN (10,89,16)
這樣我們在進行範圍查詢時,就要將一個集合中的值,作為引數動態新增進來。
這樣我們將如何進行引數的傳遞?
/** * * <p>Title: QueryVo</p> * <p>Description: 查詢的條件</p> * <p>Company: http://www.itheima.com/ </p> */ public class QueryVo implements Serializable { private List<Integer> ids; public List<Integer> getIds() { return ids; } public void setIds(List<Integer> ids) { this.ids = ids; } }
/** * 根據 id 集合查詢使用者 * @param vo * @return */ List<User> findInIds(QueryVo vo);
<!-- 查詢所有使用者在 id 的集合之中 --> <select id="findInIds" resultType="user" parameterType="queryvo"> <!-- select * from user where id in (1,2,3,4,5); --> <include refid="defaultSql"></include> <where> <if test="list != null and list.size() > 0"> <foreach collection="list" open="id in ( " close=")" item="uid" separator=","> #{uid} </foreach> </if> </where> </select>
SQL 語句:
select 欄位 from user where id in (?)
<foreach>標籤用於遍歷集合,它的屬性:
collection
:代表要遍歷的集合元素,注意編寫時不要寫#{}open
:代表語句的開始部分close
:代表結束部分item
:代表遍歷集合的每個元素,生成的變數名sperator
:代表分隔符@Test public void testFindInIds() { QueryVo vo = new QueryVo(); List<Integer> ids = new ArrayList<Integer>(); ids.add(41); ids.add(42); ids.add(43); ids.add(46); ids.add(57); vo.setIds(ids); //6.執行操作 List<User> users = userDao.findInIds(vo); for(User user : users) { System.out.println(user); } }
Sql 中可將重複的 sql 提取出來,使用時用 include 參照即可,最終達到 sql 重用的目的。
2.4.1 定義程式碼片段
<!-- 抽取重複的語句程式碼片段 --> <sql id="defaultSql"> select * from user </sql>
<!-- 設定查詢所有操作 --> <select id="findAll" resultType="user"> <include refid="defaultSql"></include> </select> <!-- 根據 id 查詢 --> <select id="findById" resultType="UsEr" parameterType="int"> <include refid="defaultSql"></include> where id = #{uid} </select>
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45