Mybatis的使用(3)

1:動態sql:

意義:可以定義程式碼片段,可以進行邏輯判斷,可以進行循環或批量處理,使條件判斷更為簡單

1.1:定義程式碼片段簡化程式碼:

1.2:多條件查詢: 

<where> <if test=''>的用法:用於條件判斷查詢:

List<User> selectCondition(User user);


<select id="selectCondition" resultType="user" parameterType="user">
select <include refid="c"></include> from mybatis.user
<where>
<if test="name!=null and name!=''">
and name like concat('%',#{name},'%')
</if>
<if test="pwd!=null and pwd!=''">
and pwd =#{pwd}
</if>
</where>

</select>


   User user=new User();
user.setName("張");
user.setPwd("111111");
List<User> users = usermapper.selectCondition(user);
for (User user1 : users) {
System.out.println(user1);
}

}

1.3:條件修改:

<set> <if test=''>的用法:用於條件判斷更新:

int updatecondition(User user);

<update id="updatecondition" parameterType="user">
update mybatis.user
<set>
<if test="name!=null and name!=''">
name=#{name},
</if>
<if test="pwd!=null and pwd!=''">
pwd=#{pwd},
</if>

</set>
where id=#{id}
</update>


User user=new User();
user.setId(2);
user.setName("李四");
int i = usermapper.updatecondition(user);
sqlSession.commit();

注意:使用<set>至少更新一列

 

 

1.3:循環查詢,批量刪除,批量增加,批量更新:

循環查詢<foreach>的用法:

List<User> selectForEach(Integer[] integers);
<select id="selectForEach"  resultType="user">
select <include refid="c"></include> from mybatis.user
where id in
<foreach collection="array" item="id" separator="," open="(" close=")">
#{id}
</foreach>

</select>

Integer[] arr={2,4,6};
List<User> users = usermapper.selectForEach(arr);
for (User user1 : users) {
System.out.println(user1);
}

 

<foreach>參數講解:

collection:用來指定參數的類型,如果是List集合,則為list,如果是Map集合,則為map,如果為數組,則為array

item:每次循環遍歷出來的值或對象

separator:多個值或對象之間的分隔符

open:整個循環外面的前括弧

close:整個循環外面的後括弧

 

批量刪除<foreach>的用法:

int deleteForeach(Integer[] integers);介面
<delete id="deleteForeach">
delete from mybatis.user
where id in
<foreach collection="array" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete> xml文件
Integer[] arr={1,2};
int i = usermapper.deleteForeach(arr);
sqlSession.commit();測試

批量增加<foreach>的用法:

int insertForeach(List<User> list);

<insert id="insertForeach" parameterType="user">
insert into mybatis.user(id,name,pwd)
values
<foreach collection="list" item="u" separator=",">
(#{u.id},#{u.name},#{u.pwd})
</foreach>
</insert>
注意:item="u",增加的對象為u,取出成員變數的形式應該為u.name等
List<User> list=new ArrayList<User>();
list.add(new User(1,"張三","1111111"));
list.add(new User(2,"張三","1111111"));
list.add(new User(10,"張三","1111111"));
int i = usermapper.insertForeach(list);
sqlSession.commit();

批量更新<foreach>的用法:

int updateForeach(List<User> list);



<update id="updateForeach" parameterType="user">
<foreach collection="list" item="u" separator=";">
update mybatis.user
<set>
<if test="u.name!=null and u.name!=''">
name=#{u.name},
</if>
<if test="u.pwd!=null and u.pwd!=''">
pwd=#{u.pwd},
</if>

</set>
where id=#{u.id}
</foreach>

</update>

 

 

List<User> list=new ArrayList<User>();
list.add(new User(1,"王五","1111111"));
list.add(new User(2,"李四","22222222"));
list.add(new User(10,"張三","3333333"));
int i = usermapper.updateForeach(list);
sqlSession.commit();

注意:需要在dabase.properties中加入&allowMultiQueries=true,即允許多行操作

 

 

指定參數位置下標查詢:

 

 

 

 

入參是map:

 

 

 

 

返回值是一行的map:

Map usermap(Integer id);

<select id="usermap" parameterType="int" resultType="map">
select name,pwd from mybatis.user where id=#{id}
</select>

Map usermap = usermapper.usermap(1);
System.out.println(usermap);
System.out.println(usermap.get("name"));

返回值是多行的map:

List<Map> getmap();

<select id="getmap" resultType="map">
select name,pwd from mybatis.user
</select>

List<Map> getmap = usermapper.getmap();
for (Map map : getmap) {
System.out.println(map);
}