mybatis中的連接池以及標(biāo)簽
mybatis測(cè)試表結(jié)構(gòu).png
一涌穆、mybatis中的事務(wù)
mybatis底層中從連接池等獲取的連接對(duì)象默認(rèn)是關(guān)閉了自動(dòng)提交(整合到Spring中默認(rèn)是開啟)监徘,項(xiàng)目生產(chǎn)中也建議這樣使用,根據(jù)業(yè)務(wù)需求提交事務(wù);,如果想關(guān)閉手動(dòng)提交,如下,獲得指定對(duì)象時(shí)設(shè)置自動(dòng)提交為true
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSessionsession = factory.openSession(true);
二盔夜、Mybatis的動(dòng)態(tài)sql語句
需要傳入的參數(shù)為pojo,因?yàn)榻馕鰳?biāo)簽的底層是依賴pojo的get方法的堤魁!
當(dāng)然喂链,也可以傳入一個(gè)Map集合,key就對(duì)應(yīng)為變量名妥泉!
1.<if>標(biāo)簽
比如椭微,查詢是,根據(jù)id或者username的取值是否為空選擇具體的查詢語句盲链。<if>標(biāo)簽的 test 屬性中寫的是對(duì)象的屬性名蝇率,如果是包裝類的對(duì)象要使用 OGNL 表達(dá)式的寫法。另外要注意 where 1=1 的作用~刽沾!
- dao
public interface UserDao {
/** 根據(jù)user信息進(jìn)行查詢 */
public List<User> findByUser(User user);
}
- UserDao.xml
<select id="findByUser" parameterType="User" resultType="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>
- 測(cè)試類略
2.<where>標(biāo)簽 -- where!
使用where標(biāo)簽時(shí)本慕,可以不用
1=1
這種操作;where 元素只會(huì)在至少有一個(gè)子元素的條件返回 SQL 子句的情況下才去插入“WHERE”子句。而且侧漓,若語句的開頭為“AND”或“OR”锅尘,where 元素會(huì)將它們?nèi)コ?/p>
UserDao.xml
<select id="findByUser" parameterType="User" resultType="User">
select * from user
<where>
<if test="username != null and username != ''">
and username like #{username}
</if>
<if test="address != null">
and address like #{address}
</if>
</where>
</select>
3. <foreach>標(biāo)簽
適用于集合查詢
參數(shù) | 作用 |
---|---|
collection | 代表要遍歷的集合元素,注意編寫時(shí)不要寫#{} |
open | 代表語句的開始 |
close | 代表語句的結(jié)束 |
item | 代表遍歷集合的每個(gè)元素布蔗,生成的變量名 |
separator | 代表分隔符 |
- 集合pojo QueryVo
public class QueryVo implements Serializable {
private List<Integer> ids;
public List<Integer> getIds() {
return ids;
}
public void setIds(List<Integer> ids) {
this.ids = ids;
}
}
- dao
/** 根據(jù)集合查詢 */
public List<User> findInIds(QueryVo vo);
- UserDao.xml
<select id="findInIds" parameterType="QueryVo" resultType="User">
select * from user
<where>
<if test="ids != null and ids.size() > 0">
<foreach collection="ids" open="id in ( " close=")" item="uid" separator=",">
#{uid}
</foreach>
</if>
</where>
</select>
- 測(cè)試類
...
UserDao userDao = session.getMapper(UserDao.class);
List<Integer> ids = new ArrayList<Integer>();
ids.add(41); ids.add(42); ids.add(43);
QueryVo vo = new QueryVo();
vo.setIds(ids);
List<User> users = userDao.findInIds(vo);
for (User user : users) {
System.out.println(user);
}
4. mybatis中簡化編寫的sql片段
Sql 中可將重復(fù)的 sql 提取出來藤违,使用時(shí)用 include 引用即可,最終達(dá)到 sql 重用的目的何鸡。
<sql id="defaultSql">
select * from user
</sql>
<select id="findByUser" parameterType="User" resultType="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>