动态SQL
SQL的结构不是一层不变的,根据具体的需求和情况动态生成的SQL即动态SQL,可以提高程序的灵活性、扩展性
常见的标签有:< where >、< if>、< choose >、< when >、< set >、< foreach>
- 根据CNO查询用户信息
- 根据CNO和NAME查询用户信息
- 根据CNO和CLASS查询用户信息
常规写法:
<select id="findByCno" resultType="Card">
select * from card where CNO = #{CNO}
</select>
<select id="findByCnoandName" parameterType="java.lang.String" resultType="Card">
select * from card where CNO = #{arg0} and NAME = #{arg1}
</select>
<select id="findByCnoandClass" parameterType="java.lang.String" resultType="Card">
select * from card where CNO = #{arg0} and CLASS = #{arg1}
</select>
动态SQL:
<select id="findByCard" parameterType="Card" resultType="Card">
select * from card
<where>
<if test="CNO!=null">
CNO = #{CNO}
</if>
<if test="NAME!=null">
and NAME = #{NAME}
</if>
<if test="CLASS!=null">
and CLASS = #{CLASS}
</if>
</where>
</select>do
常规写法需要实体类对应接口中定义三个方法,而动态接口只需要定义一个方法
public interface CardMapper {
//普通sql
public Card findByCno(String CNO);
public Card findByCnoandName(String CNO,String NAME);
public Card findByCnoandClass(String CNO,String CLASS);
//动态sql
public Card findByCard(Card card);
}
定义需要传入对象的参数便可动态生成所需的SQL语句
//普通sql
System.out.println(cardMapper.findByCno("sx001"));
System.out.println(cardMapper.findByCnoandClass("sx001", "c01"));
System.out.println(cardMapper.findByCnoandName("sx007", "宝乐"));
//动态sql语句 传入的参数是Card
Card card = new Card();
card.setCNO("sx001");
card.setNAME("宝乐01");
System.out.println(cardMapper.findByCard(card));
以上为动态sql与普通sql的对比
——————————————————————————————
< when > 和 < if > 区别
< where > < if > 搭配使用,if 标签用来处理流程控制,动态判断是否添加某个表达式, where 标签结合多条件判断语句使用,而且动态处理sql语句中的 … where and … ,当 where 直连 and 的时候,自动删除 and
< choose > < when> 跟 < where > < if > 作用基本无差,但区别在于,当第一个 when 成立时,后面的 when 不做判断直接忽略 ,类似 switch case break
<select id="findByCard2" parameterType="Card" resultType="Card">
select * from card
<where>
<choose>
<when test="CNO!=null">
CNO = #{CNO}
</when>
<when test="NAME!=null">
and NAME = #{NAME}
</when>
<when test="CLASS!=null">
CLASS = #{CLASS}
</when>
</choose>
</where>
</select>
< set > 标签
作用于 update 操作,会根据参数选择生成修改的SQL语句
<update id="update" parameterType="Card" >
<!--update card set NAME = #{NAME},CLASS = #{CLASS} where CNO = #{CNO}-->
update card
<set>
<if test="NAME!=null">
NAME = #{NAME}
</if>
<if test="CLASS!=null">
and CLASS = #{CLASS}
</if>
</set>
where CNO = #{CNO}
</update>
< foreach > 标签
迭代生成一系列值,主要用于 in 查询
<select id="findByCard3" parameterType="Card" resultType="Card">
select * from card
<where>
<foreach collection="IDS" open="CNO in (" close=")" item="CNO" separator=",">
#{CNO}
</foreach>
</where>;
</select>
-
collection :实体类对象定义的集合名字
-
open、close :对应拼接SQL条件的开始和结尾的字符串
-
index :自定义的变量名
-
separator :数据之间的分隔符号