1.mybatis中使用select语法的两种格式:
1.一个判断条件----->直接在UserDAO接口类中的方法中给定形式参数是单个属性
例如:public User queryOne(Integer id);
2.多个判断条件----->
(1)第一步:在UserDAO接口类中的方法中给定形式参数是Object对象
例如:public List<User> query(User user);
(2)在实体类中创建类的无参构造方法和有参构造方法。
public User() {
}
public User(Integer id, String name, Boolean gender, Date registTime) {
this.id = id;
this.name = name;
this.gender = gender;
this.registTime = registTime;
}
(3)第二步:在调用方法的时候要New一个有参的类对象
即:new User(id,name,gender,createTime);
(4)第三步:将这个对象放入
List<User> query = userDAO.querySql03(new User(id,name,gender,createTime));
中,这时会将我们的参数传递给.xml文件中的sql语句中的where id = #{id} , name=#{name} 等使用。
例如:
UserDAO userDAO = sqlSession.getMapper(UserDAO.class);
User user1 = new User(2,null,false,null);
List<User> query = userDAO.querySql03(user1);
for (User user : query) {
System.out.println("user = " + user);
}
<select id="querySome" parameterType="User" resultType="User">
SELECT id,NAME,gender,regist_time as registTime
FROM t_user
where gender=#{gender} and name=#{name}
</select>
2.动态SQL语句中的if使用时会出现SQL语法错误:
第一种情况:在使用 if 时,select查询可能会出现错误:如下图
原因是:在第一个if语句不符合条件时,sql语句就变成了where 结尾或 where and id = #{id}
<select id="querySql03" parameterType="User" resultType="User">
SELECT id,NAME,gender,regist_time as registTime
FROM t_user
where <!--gender=#{gender} and name=#{name}-->
<if test="name != null and name != ''">
gender=#{gender} and name=#{name}
</if>
<if test="id != null">
and id = #{id}
</if>
</select>
解决方法:将代码中的where关键字改为<where></where>标签,就会自动忽略 下个and、or等关键词,或者在所有条件不符合时不执行<where>标签本身。例如
<select id="querySql03" parameterType="User" resultType="User">
SELECT id,NAME,gender,regist_time as registTime
FROM t_user
<where> <!--gender=#{gender} and name=#{name}-->
<if test="name != null and name != ''">
gender=#{gender} and name=#{name}
</if>
<if test="id != null">
and id = #{id}
</if>
</where>
</select>
<!-- 如果 name=null,id=3,则sql变为:
SELECT id,name,gender,regist_time FROM t_user
WHERE id>#{id}
-->
<!-- 如果 name=null,id=0,则sql变为:
SELECT id,name,gender,regist_time FROM t_user
-->
第二种情况:在使用 if 时,update修改可能会出现错误:如下图
原因是set之后第一个条件成立,第二个即最后一个条件不满足条件,则在sql语句最后会多个逗号,报sql语句语法错误。
SqlSession sqlSession = sqlSessionFactory.openSession();
UserDAO userDAO = sqlSession.getMapper(UserDAO.class);//new Date()
User user1 = new User(null,"李四",true,null);
userDAO.updateSql01(user1);
sqlSession.commit();
sqlSession.close();
<update id="updateSql01" parameterType="User">
UPDATE t_user
set
<if test="name != null">
name=#{name},
</if>
<if test="registTime != null">
regist_time=#{registTime}
</if>
WHERE
gender=#{gender}
</update>
这时解决的方案是:将set改为<set></set>标签。
<update id="updateSql01" parameterType="User">
UPDATE t_user
<set>
<if test="name != null">
name=#{name},
</if>
<if test="registTime != null">
regist_time=#{registTime}
</if>
</set>
WHERE
gender=#{gender}
</update>
注意:本题之外的错误:
在书写完成修改逻辑代码时并没有提交事务,所以执行后,不报错,但是不执行修改操作,数据库没有变化。
sqlSession.commit();
sqlSession.close();
除了以上两种方案解决此类错,还有<trim><trim>标签亦可以:
解决第一种情况:(select的情况)
<select id="querySql03" parameterType="User" resultType="User">
SELECT id,NAME,gender,regist_time as registTime
FROM t_user
<trim prefix="where" prefixOverrides="and | or">
<if test="name != null and name != ''">
gender=#{gender} and name=#{name}
</if>
<if test="id != null">
and id = #{id}
</if>
</trim>
</select>
<!-- <trim prefix="where" prefixOverrides="and|or"> 等价于 <where>
prefix="where":会添加一个where关键字
prefixOverrides="and|or":会去除开头的and 或 or
-->
UserDAO userDAO = sqlSession.getMapper(UserDAO.class);
User user1 = new User(1,null,true,null);
List<User> query = userDAO.querySql01(user1);
解决第二种情况:(update的情况)
<update id="updateSql01" parameterType="User">
UPDATE t_user
<trim prefix="set" suffixOverrides=",">
<if test="name != null">
name=#{name},
</if>
<if test="registTime != null">
regist_time=#{registTime}
</if>
</trim>
WHERE
gender=#{gender}
</update>
<!-- <trim prefix="set" suffixOverrides=","> 等价于 <set>
prefix="set":会添加一个set关键字
suffixOverrides=",":会去除最后的逗号
-->
UserDAO userDAO = sqlSession.getMapper(UserDAO.class);//new Date()
User user1 = new User(null,"李四",true,null);
userDAO.updateSql01(user1);
sqlSession.commit();
sqlSession.close();
3.在动态SQL语句中运算符有:某些符号要写成英文表示,可以让其更容易识别并运算
"," ...
"=" ...
"?" ...
"||" ...
"or" ...
"&&" ...
"and" ...
"|" ...
"bor" ...
"^" ...
"xor" ...
"&" ...
"band" ...
"==" ...
"eq" ...
"!=" ...
"neq" ...
"<" ...
"lt" ...
">" ...
"gt" ...
"<=" ...
"lte" ...
">=" ...
"gte" ...
"in" ...
"not" ...
"<<" ...
"shl" ...
">>" ...
"shr" ...
">>>" ...
"ushr" ...
"+" ...
"-" ...
"*" ...
"/" ...
"%" ...
"instanceof" ...
"." ...
"(" ...
"[" ...
<DYNAMIC_SUBSCRIPT> ...
"(" ...