Java-bug点滴记录(八)

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> ...

​    "(" ...

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值