MyBatis实现CRUD操作

1、namespace

​ 配置文件中namespace中的名称为对应Mapper接口或者Dao接口的完整包名,必须一致!

2、select

选择、查询语句

  • select标签是mybatis中最常用的标签之一
  • select语句有很多属性可以详细配置每一条SQL语句
    • SQL语句返回值类型。【完整的类名或者别名】
    • 传入SQL语句的参数类型 。【万能的Map,可以多尝试使用】
    • 命名空间中唯一的标识符
    • 接口中的方法名与映射文件中的SQL语句ID 一一对应
    • id:就是对应的namespace中的方法名
    • resultType:SQL语句执行的返回值类型 Class,基本数据类型
    • parameterType:参数类型

根据id查询用户

  1. 在UserMapper中编写对应的接口

    public interface UserMapper {
        //根据id查询用户
        User getUserById(int id);
    }
    
  2. 在UserMapper.xml中编写对应的sql语句

    <!-- 根据id查询用户 -->
    <select id="getUserById" parameterType="int" resultType="com.jh.domain.User">
        select *
        from mybatis.user
        where id = #{id};
    </select>
    
  3. 在测试类中测试结果

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

根据用户名和密码查询用户

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

  • Map传递参数,直接在sql中取出key即可!【parameterType="map"】

  • 对象传递参数,直接在sql中取出属性即可!【parameterType="对应的对象类型"】

  • 只有一个基本类型的情况下,可以直接在sql中取到!

多个参数使用map,或者注解

方式一:直接在方法中传递参数

  1. 在接口方法的参数前加 @Param属性

    public interface UserMapper {
    	// 根据用户名和密码查询用户
        User getUserByNameAndPwd(@Param("name")String name,@Param("pwd")String pwd);
    }
    
  2. Sql语句编写的时候,直接取@Param中设置的值即可,不需要单独设置参数类型

    <select id="getUserByNameAndPwd" resultType="com.jh.domain.User">
        select *
        from mybatis.user
        where name = #{name}
          and pwd = #{pwd}
    </select>
    

方式二:使用Map进行参数的传递

  1. 在接口方法中,参数直接传递Map;

    User selectUserByNameAndPwd(Map<String,Object> map);
    
  2. 编写sql语句的时候,需要传递参数类型,参数类型为map

    <select id="selectUserByNameAndPwd" resultType="com.jh.domain.User">
        select *
        from mybatis.user
        where name = #{userName}
        and pwd = #{userPassword}
    </select>
    
  3. 在使用方法的时候,Map的 key 为 sql中取的值即可,没有顺序要求!

    Map<String, Object> map = new HashMap<String, Object>();
    map.put("userName","小明");
    map.put("userPassword","123456");
    User user = mapper.selectUserByNameAndPwd(map);
    

总结:如果参数过多,我们可以考虑直接使用Map实现,如果参数比较少,直接传递参数即可

3、insert

使用insert标签进行插入操作,它的配置和select标签差不多!

给数据库增加一个用户

  1. 在UserMapper接口中添加对应的方法

    public interface UserMapper {
        //insert 一个用户
        int addUser(User user);
    }
    
  2. 在UserMapper.xml中添加insert语句

    <insert id="addUser" parameterType="com.jh.domain.User">
        insert into mybatis.user(id, name, pwd)
        values (#{id}, #{name}, #{pwd});
    </insert>
    
  3. 测试代码

    @Test
    public void addUser() {
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        int result = userMapper.addUser(new User(4, "小明", "123456"));
        System.out.println(result);
        // 提交事务,MyBatis默认不自动提交事务
        sqlSession.commit();// 重点!不写的话不会提交到数据库
        sqlSession.close();
    }
    

注意:增、删、改操作需要提交事务!

4、update

使用update标签进行更新操作,它的配置和select标签差不多!

修改用户的信息

  1. 在UserMapper接口中添加对应的方法

    public interface UserMapper {
        // 修改用户
        int updateUser(User user);
    }
    
  2. 在UserMapper.xml中添加insert语句

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

    @Test
    public void updateUser() {
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        int result = userMapper.updateUser(new User(4, "修改后", "123456"));
        System.out.println(result);
        // 提交事务,MyBatis默认不自动提交事务
        sqlSession.commit();// 重点!不写的话不会提交到数据库
        sqlSession.close();
    }
    

5、delete

使用delete标签进行删除操作,它的配置和select标签差不多!

根据id删除一个用户

  1. 在UserMapper接口中添加对应的方法

    public interface UserMapper {
        // 删除一个用户 
        int deleteUser(int id);
    }
    
  2. 在UserMapper.xml中添加insert语句

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

    @Test
    public void updateUser() {
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        int result = userMapper.deleteUser(4);
        System.out.println(result);
        // 提交事务,MyBatis默认不自动提交事务
        sqlSession.commit();// 重点!不写的话不会提交到数据库
        sqlSession.close();
    }
    

6、总结

  • 所有的增删改操作都需要提交事务!
  • 接口所有的普通参数,尽量都写上@Param参数,尤其是多个参数时,必须写上!
  • 有时候根据业务的需求,可以考虑使用map传递参数!
  • 为了规范操作,在SQL的配置文件中,我们尽量将Parameter参数和resultType都写上!

7、分析错误

  • 标签不要匹配错
  • resource绑定mapper,需要使用路径!
  • 程序配置文件必须符合规范!
  • NullPointserException,没有注册到资源!
  • 输出的xml文件中存在乱码问题!
  • maven资源没有导出问题!

7、模糊查询

  1. Java代码执行的时候,传递sql通配符%%

    list<name> names = mapper.selectlike("%李%");
    
  2. 在sql拼接中使用通配符!

    <select id=”selectlike”>
        select * from foo where bar like "%"#{value}"%"
    </select>
    
posted @ 2021-01-06 11:20  天下御免  阅读(45)  评论(0编辑  收藏  举报