MyBatis学习(二)

3. CRUD

3.1 namespace

namespace中的包名要和mapper接口一致

3.2 查询语句

  • id:就是对应的namespace中的方法名
  • resultType:Sql语句执行的返回值
  • parameterType:参数类型
  • 注意点:增删改需要提交事务 sqlSession.commit()!!!

3.2.1 Select

  1. 编写接口

    //根据ID查询用户
    User getUserById(int id);
    
  2. 编写对应mapper中的sql语句

    <select id="getUserById" parameterType="int" resultType="com.Yurrize.pojo.User">
        select * from mybatis.user where id=#{id}
    </select>
    
  3. 测试

    @Test
    public void getUserById(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
    
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User userById = mapper.getUserById(1);
        System.out.println(userById);
    
        sqlSession.close();
    }
    

3.2.2 Insert(需要提交事务)

  1. 编写接口

    //insert一个用户
    int addUser(User user);
    
  2. 编写对应mapper中的sql语句

    <!--对象中的属性可以直接取出来-->
    <insert id="addUser" parameterType="com.Yurrize.pojo.User">
        insert into mybatis.user(id, name, pwd) values (#{id},#{name},#{pwd});
    </insert>
    
  3. 测试

    //增删改需要提交事务
    @Test
    public void addUser(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
    
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        int res=mapper.addUser(new User(4,"小智","852369"));
        if(res>0){
            System.out.println("插入成功");
        }
        //提交事务
        sqlSession.commit();
    
        sqlSession.close();
    }
    

3.2.3 Update(需要提交事务)

  1. 编写接口

    //修改用户
    int updateUser(User user);
    
  2. 编写mapper中对应的sql语句

    <update id="updateUser" parameterType="com.Yurrize.pojo.User">
        update mybatis.user set name=#{name},pwd=#{pwd} where id=#{id};
    </update>
    
  3. 测试

    @Test
    public void updateUser(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
    
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        mapper.updateUser(new User(4,"小昔","5262356"));
        sqlSession.commit();
    
        sqlSession.close();
    }
    

3.2.4 Delete(需要提交事务)

  1. 编写接口

    //删除用户
    int deleteUser(int id);
    
  2. 编写mapper中的sql语句

    <delete id="deleteUser" parameterType="int">
        delete from mybatis.user where id=#{id};
    </delete>
    
  3. 测试

    @Test
    public void deleteUser(){
    SqlSession sqlSession = MyBatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    mapper.deleteUser(2);
    sqlSession.commit();
    sqlSession.close();
    }
    

3.3 分析错误

  • 标签注意不要匹配错误

  • resource绑定mapper需要时路径* */ *****/ ****

  • 程序配置文件需要符合规范

  • java.lang.NullPointerException空指针异常,没有注册到资源

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J4jQdorJ-1648437028952)(C:\Users\12044\AppData\Roaming\Typora\typora-user-images\image-20220310153439354.png)]

  • 输出xml文件中存在乱码问题,UTF-8编码

  • maven资源没有导出

3.4 万能的Map

假设,我们的实体类,或者数据据中的表,字段参数过多,我们应当使用map

//万能的Map
int addUser2(Map<String,Object>map);
<insert id="addUser2" parameterType="map">
    insert into mybatis.user(id,name,pwd) values (#{id},#{name},#{password});
</insert>
@Test
public void addUser2(){
    SqlSession sqlSession = MyBatisUtils.getSqlSession();

    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    HashMap<String, Object> map = new HashMap<>();
    map.put("id",5);
    map.put("name","小哥哥");
    map.put("password",5154665);
    mapper.addUser2(map);
    sqlSession.commit();
    sqlSession.close();
}

Map传递参数,直接在sql中取出key即可 (parameterType=“map”)

对象传递参数,直接在sql中取出对象即可(parameterType=“com.Yurrize.pojo.User”)

只有一个基本类型参数的情况下,可以直接在sql类型中取到 (parameterType=“int”)

多个参数用Map,或者注解

3.5 模糊查询

通常:

<select id="getUserLike" resultType="com.Yurrize.pojo.User">
    select * from mybatis.user where name like #{value}
</select>
List<User> userList = mapper.getUserLike("%小%");

问题: select * from mybatis.user where id=?

​ select * from mybatis.user where id=1(正常)

​ select * from mybatis.user where id=1 or 1=1(异常)

用#防止出现sql注入:

<select id="getUserLike" resultType="com.Yurrize.pojo.User">
    select * from mybatis.user where name like "%"#{value}"%"
</select>
List<User> userList = mapper.getUserLike("小");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值