MyBatis特殊SQL的执行
Posted 热爱编程的小白白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis特殊SQL的执行相关的知识,希望对你有一定的参考价值。
🍓个人主页:个人主页
🍒系列专栏:SSM框架
目录
1.模糊查询
接口:
public interface SelectMapper
List<User> getUserByLike(@Param("mohu") String mohu);
SQL(错误示范):
<select id="getUserByLike" resultType="com.atguigu.mybatis.pojo.User">
SELECT * FROM t_user WHERE PASSWORD LIKE '%#mohu%'
</select>
测试:
public void test7()
SqlSessionUtils sqlSessionUtils = new SqlSessionUtils();
SqlSession sqlSession = sqlSessionUtils.getSqlSession();
SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
List<User> userByLike = mapper.getUserByLike("123");
System.out.println(userByLike);
运行结果:
SQL: SELECT * FROM t_user WHERE PASSWORD LIKE '%?%'
因为:#:相当于参数占位符,且会对自动传入的数据加一个双引号,外面已经有一层引号,所以报错。
SQL(正确示范,以下3种都行):
- select * from t_user where password like '%$mohu%'
- select * from t_user where password like concat('%',#mohu,'%')
- select * from t_user where password like "%"#mohu"%"
2.批量删除
接口:
/**
*
* @param ids
* @return
*/
int deleteMoreUser(@Param("ids") String ids);
SQL:
<delete id="deleteMoreUser">
delete from t_user where id in($ids)
</delete>
测试:
public void test8()
SqlSessionUtils sqlSessionUtils = new SqlSessionUtils();
SqlSession sqlSession = sqlSessionUtils.getSqlSession();
SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
int i = mapper.deleteMoreUser("1,2");
表:
运行结果:
3.动态设置表名
当有多张表时,例如 VIP表 和 普通表 ,这时需要动态设置表名。
接口:
List<User> getAllUser(@Param("tableName") String tableName);
SQL:
select * from $tableName
注意:不能使用 #
select * from #tableName
因为# 会自动添加单引号,就变成了:
select * from '表名'
4.添加功能获取自增的主键
场景模拟: t_clazz(clazz_id,clazz_name) t_student(student_id,student_name,clazz_id) 1 、添加班级信息 2 、获取新添加的班级的 id 3 、为班级分配学生,即将某学的班级 id 修改为新添加的班级的 id
接口:
int insertUser(User user);
SQL:
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
insert into t_user values(null,#username,#password,#age,#sex,#email)
</insert>
测试:
public void test9()
SqlSessionUtils sqlSessionUtils = new SqlSessionUtils();
SqlSession sqlSession = sqlSessionUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User(null,"小K","183918389",22,"男","13121178@qq.com");
mapper.insertUser(user);
System.out.println(user);
效果:
如果把 useGeneratedKeys keyProperty 删除
运行结果:
发现id=null
useGeneratedKeys:设置使用自增的主键
keyProperty:因为增删改有统一的返回值是受影响的行数,因此只能将获取的自增的主键放在传输的参数user对象的某个属性中
mybatis if判断中的特殊符号
在使用mybatis 时我们sql是写在xml 映射文件中,如果写的sql中有一些特殊的字符的话,在解析xml文件的时候会被转义,但我们不希望他被转义,所以我们要使用<![CDATA[ ]]>来解决。
<![CDATA[ ]]> 是什么,这是XML语法。在CDATA内部的所有内容都会被解析器忽略。
如果文本包含了很多的"<"字符 <=和"&"字符——就象程序代码一样,那么最好把他们都放到CDATA部件中。
但是有个问题那就是 <if test=""> </if> <where> </where> <choose> </choose> <trim> </trim> 等这些标签都不会被解析,所以我们只把有特殊字符的语句放在 <![CDATA[ ]]> 尽量缩小 <![CDATA[ ]]> 的范围。
实例如下:
<select id="query" resultType="com.xdt.ibs.environ.device.bean.Condition"> <!CDATA[[ SELECT id,pid,logicid,`name`,ip_addr AS ipAddr,`port`,modbus_addr AS modbusAddr,`power`,
`mode`,fan,temp_set AS tempSet,conn_status AS connStatus,update_time AS updateTime,create_time AS createTime FROM `condition` WHERE id <= #{id} ]]> <if test="ver > 0"> AND ver >= #{ver} </if> </select>
因为这里有 ">" "<=" 特殊字符所以要使用 <![CDATA[ ]]> 来注释,但是有<if> 标签,所以把<if>等 放外面
或者使用转义字符:
<update id="updateCondition" parameterType="com.xdt.ibs.environ.device.bean.Condition"> UPDATE `condition` SET <if test="pid > 0"> pid = #{pid}, </if> <if test="logicid > 0"> logicid = #{logicid}, </if> <if test="name != null"> `name` = #{name}, </if> <if test="power == 0 or power == 1"> `power` = #{power}, </if> <if test="fan >= 0 and fan <= 3"> fan = #{fan}, </if> <if test="connStatus == 1 or connStatus == 2"> conn_status = #{connStatus}, </if> update_time = NOW() WHERE id = #{id} </update>
但是 为什么 > 可以不用转义?
以上是关于MyBatis特殊SQL的执行的主要内容,如果未能解决你的问题,请参考以下文章