MyBatis的参数传递与模糊查询
1、MyBatis查询时参数传递说明
- 对象传递参数,直接在sql中取对象的属性即可!
当我们想要向数据库添加(修改等同样适用)一条记录时,那么我们的参数是一个完整的对象,此时就可以使用对象传递参数【parameterType=“com.bjut.pojo.User”】,在sql语句中直接取出对象的属性使用即可。比如:
<!--对象中的属性可以直接取出来使用-->
<insert id="addUser" parameterType="com.bjut.pojo.User">
insert into mybatis.user(id,name,password) values (#{id},#{name},#{password});
</insert>
// 插入一个用户
int addUser(User user);
User user = new User(4,"花生的斯努比","123456");
int i = mapper.addUser(user);
- 只有一个基本类型参数的情况下,可以直接在sql中取到!
当我们想要对数据库进行操作只需要一个参数时,那么我们的参数是一个java基本数据类型,此时可以使用基本类型参数进行参数传递【parameterTyep=”int“】,在sql语句中直接获取对应参数的值即可。比如:
<delete id="deleteUser" parameterType="int">
delete from mybatis.user where id=#{id}
</delete>
// 删除一条用户信息
int deleteUser(int id);
int i = mapper.deleteUser(6);
-
如果我们想要传递的参数既不是一个对象也不是一个基本数据类型,那么就可以使用map来进行参数传递。
Map传递参数,【parameterType=“map”】,直接在sql中取出key即可。比如:
<update id="updateUser2" parameterType="java.util.Map"> update mybatis.user set name=#{username} where id=#{id}; </update>
// 更新记录的部分信息 int updateUser2(Map<String,Object> map);
@Test public void test7(){ // 第一步:获得sqlSession对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); try{ // 第二步:获取mapper对象,并执行查询 UserMapper mapper = sqlSession.getMapper(UserMapper.class); HashMap<String, Object> map = new HashMap<>(); map.put("username","花生酱"); // 想要更改的字段 map.put("id",5); // where后的条件 int i = mapper.updateUser2(map); if(i != 0){ System.out.println("修改记录成功"); } sqlSession.commit(); }catch(Exception e){ sqlSession.rollback(); e.printStackTrace(); }finally { // 第三步:关闭sqlSession sqlSession.close(); } }
map适用于更新记录对象的属性值太多,我们并不想对这些属性一一赋值,而且仅仅更新数据的某几个字段的情况下,省去了我们new一个新对象的繁琐操作,仅仅在map中添加想要修改的字段的key-value即可。
-
多个参数用Map或者使用注解
2、模糊查询
mybatis模糊查询有以下几种实现方式:
- java传递参数的的时候添加”%“通配符
@Test
public void testlike(){
// 第一步:获得sqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
try{
// 第二步:获取mapper对象,并执行查询
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.getUserLike("花生的%");
for (User user: userList) {
System.out.println(user.toString());
}
}catch(Exception e){
e.printStackTrace();
}finally {
// 第三步:关闭sqlSession
sqlSession.close();
}
}
- XML中的查询语句中添加通配符
<select id="getUserLike" resultType="com.bjut.pojo.User">
select * from mybatis.user where name like '%${value}%'; <!--这里的通配符使用单引号包裹-->
</select>
注意:这里使用的是${}进行字符拼接,不是#{}作为占位符,这中方法可能会引发sql注入的问题
以下两种方法既可以防止sql注入又可以在配置文件中实现模糊查询
- XML中的查询语句中添加通配符(推荐方法)
<select id="getUserLike" resultType="com.bjut.pojo.User">
select * from mybatis.user where name like "%"#{value}"%"; <!--这里的通配符使用双引号包裹 -->
</select>
- 借助mysql的函数实现拼接(为了提高查询的效率,尽量不要在查询语句的条件中使用函数,防止不能走索引)
<select id="getUserLike" resultType="com.bjut.pojo.User">
select * from mybatis.user where name like concat('%',#{value},'%');
</select>
补充:因为上边使用到了${}和#{},那么借此我们对这两种形式的使用做一个简单的说明
- #{ }是预编译处理,MyBatis在处理#{ }时,它会将sql中的#{ }替换为?,然后调用PreparedStatement的set方法来赋值,使用占位符的方式提高效率,可以防止sql注入。
[com.bjut.dao.UserMapper.getUserLike]-==> Preparing: select * from mybatis.user where name like "%"?"%";
[com.bjut.dao.UserMapper.getUserLike]-==> Parameters: 花生的(String)
[com.bjut.dao.UserMapper.getUserLike]-<== Total: 2
User{id=4, name='花生的斯努比', password='123456'}
User{id=7, name='花生的斯努比3', password='123456'}
- ${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中,可能引发sql注入。
[com.bjut.dao.UserMapper.getUserLike]-==> Preparing: select * from mybatis.user where name like '%花生的%';
[com.bjut.dao.UserMapper.getUserLike]-==> Parameters:
[com.bjut.dao.UserMapper.getUserLike]-<== Total: 2
User{id=4, name='花生的斯努比', password='123456'}
User{id=7, name='花生的斯努比3', password='123456'}