MyBaits操作数据库之CRUD(补充)

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'}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值