目录
MyBatis获取参数值的两种方式,一种是#{},一种是${}。其中#{}的实质填充占位符,而${}的实质是字符串的拼接;#{}会自动加单引号的,而${}需手动添加单引号。大多数情况下倾向于使用#{},但是在个别情况下需要使用${}。如模糊查询、批量删除、动态设置表明等功能在实现的时候,不能直接使用#{},否则出现各种问题,下面针对于这些问题提出解决方案。
1、前言
实体类以User类为例,数据库表以t_user表为例。User类结构、表结构以及数据库连接获取等参考NO.2 MyBatis框架:创建Mapper接口和映射文件,实现基本增删改查_qq_46053741的博客-CSDN博客
2、模糊查询
在Mapper接口中声明getUserByVague(@Param("str") String str)方法,方法返回值为List集合,集合中存储的类型是User类型,采用@Param注解的方式获取形参。
//通过模糊查询查找李姓
List<User> getUserByVague(@Param("str") String str);
在映射文件中实现Sql语句,分别使用${}和#{}的方式获取形参值,注意:使用${}要手动加单引号。
<!-- List<User> getUserByVague(@Param("str") String str);-->
<select id="getUserByVague" resultType="User">
<!--
方式一:使用${}获取参数
select *from t_user where username like '${str}%'
-->
<!--
方式二:使用#{}获取参数
select *from t_user where username like #{str}"%"
-->
<!--
方式三:使用#{}与concat获取参数
-->
select *from t_user where username like concat(#{str},"%")
</select>
3、批量删除
对于批量删除操作,Sql语句使用in()的方式筛选需要删除的数据,该操作不需要设置结果类型resultType。实参采用拼接字符串的方式将字符串传递给形参,只能使用${}的方式获取形参值,此时不需要在${}外添加单引号;如果使用#{}方式获取形参值,则Sql语句中会自动拼接上单引号导致Sql语法错误。
例:
实参采用拼接字符串的方式将字符串传递给形参,在Mapper接口中声deleteByIds(@Param("ids") String ids)方法,采用@Paran注解的方式获取形参。
//通过拼接字符串ids实现批量删除
int deleteByIds(@Param("ids") String ids);
在映射文件中实现Sql语句,只能通过${}方式获取参数值。
<!-- void deleteByIds(@Param("ids") String ids);-->
<delete id="deleteByIds">
delete from t_user where id in(${ids})
<!--
假设ids="4,5",使用#{}则Sql语句:
delete from t_user where id in(#{ids})
等同于
delete from t_user where id in(’4,5‘)导致Sql语句出错。
-->
</delete>
4、动态获取表名
动态获取表名和批量删除操作类似,只能通过${}方式获取形参值,此时不需要添加单引号,否则Sql语句出错。
例:
在Mapper接口中声明getAllUserByTablename(@Param("tablename") String tablename)方法,方法的返回值为List集合,List集合存储的类型为User类型,采用@Param注解的方式获取形参。
//获取表名查询所有用户信息
List<User> getAllUserByTablename(@Param("tablename") String tablename);
在映射文件中实现Sql语句,结果类型resultType为User类型
<!-- List<User> getAllUserByTablename(@Param("tablename") String tablename);-->
<select id="getAllUserByTablename" resultType="User">
select *from ${tablename}
<!--
假设tablename="t_user",使用#{}则Sql语句:
select *from #{tablename}
等同于
select *from 't_user'导致Sql语句出错。
-->
</select>
5、对于添加功能,获取数据库中自增的主键
在设计表结构时,表的字段名id通常设为自增,并且在向表中添加数据时,实体类(如:User)的id属性通常赋值为NULL。此时要想获取表自增生成的id值要通过useGeneratedKeys和keyProperty属性获取id值。其中useGenerated属性默认值为false,要将其设置为true;keyProperty属性设置为想要获取的字段名(如:id)。
例:
在Mapper接口中声明insertUserAndGetId(User user)方法。
//添加user信息并获取user的id值
int insertUserAndGetId(User user);
在映射文件中实现Sql语句,此时可以通过#{}和${}两种方式访问user的属性获取对应的参数值,注意:${}需手动添加单引号。在insert标签中设置useGenerated属性值为true,keyProperty设置为id。
<!-- int insertUserAndGetId(User user);-->
<insert id="insertUserAndGetId" useGeneratedKeys="true" keyProperty="id">
insert into t_user(id,userName,password,age,gender) values(null,#{userName},#{password},#{age},#{gender})
</insert>
6、测试类中的测试方法
在下面测试类中测试本篇中的操作方法
public class UserMapperTest {
@Test
public void getUserByvague() {
SqlSession sqlSession= JdbcUtil.getSqlSession();
///获取UserMapper的代理实现类对象
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
List<User> list=userMapper.getUserByVague("李");
for(User user:list){
System.out.println(user);
}
JdbcUtil.closeSqlSessionAndCommit(sqlSession);
}
@Test
public void deleteByIds() {
SqlSession sqlSession= JdbcUtil.getSqlSession();
///获取UserMapper的代理实现类对象
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
int result=0;
result=userMapper.deleteByIds("15,16,17");
if(result>0){
System.out.println("数据删除成功");
}else{
System.out.println("数据删除失败");
}
JdbcUtil.closeSqlSessionAndCommit(sqlSession);
}
@Test
public void getAllUserByTablename() {
SqlSession sqlSession= JdbcUtil.getSqlSession();
///获取UserMapper的代理实现类对象
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
List<User> list=userMapper.getAllUserByTablename("t_user");
for(User user:list){
System.out.println(user);
}
JdbcUtil.closeSqlSessionAndCommit(sqlSession);
}
@Test
public void insertUserAndGetId() {
SqlSession sqlSession= JdbcUtil.getSqlSession();
///获取UserMapper的代理实现类对象
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
int isInsert=0;
List<User> list=new ArrayList<>();
list.add(new User(null,"韩信","hanxin",23,'男'));
for (User user:list) {
isInsert=userMapper.insertUserAndGetId(user);
if(isInsert>0){
System.out.println("数据添加成功,id值:"+user.getId());
}else{
System.out.println("数据添加失败");
}
}
JdbcUtil.closeSqlSessionAndCommit(sqlSession);
}
}