命名空间(Namespaces)

  1. 可以简单将mapper.xml文件看作是接口的实现类,将命名空间理解为 implements (可能不够准确,但容易理解)
  2. 在早期版本的Mybatis中命名空间是可选的, 但现在,随着命名空间越发重要,你必须指定命名空间。
  3. 命名空间的值应当使用完全限定名(比如 “com.mypackage.MyMapper.selectAllThings")

查询操作(SELECT)

  • 查询语句是 MyBatis 中最常用的元素之一
  • select标签的属性

    • id

      • 命名空间中唯一的标识符
      • 与接口中的方法名一一对应并保持一致
    • parameterType

      • 传入SQL语句的参数类型
      • 这个参数是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler) 推断出具体传入语句的参数,默认值为未设置(unset)。
    • resultType

      • SQL语句的返回值类型
      • 注意:如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身。

练习:根据ID查询用户

  1. 在UserMapper接口中添加对应的方法
   public interface UserMapper {
       /**

        * 获取所有用户

        */
       List<User> getAllUser();
   
       /**

        * 根据ID获取用户

        */
       User getUserById(int id);
   }
  1. 在UserMapper.xml中添加对应的SQL语句
   <select id="getUserById" resultType="com.sstype.mybatis.pojo.User">
       select id,username,password from user where id = #{id}
   </select>
  1. 编写测试代码
   @Test
   public void getUserById() {
       //获取 SqlSession
       SqlSession sqlSession = MybatisUtils.getSession();
       //获取 Mapper
       UserMapper mapper = sqlSession.getMapper(UserMapper.class);
       //查询
       User user = mapper.getUserById(1);
       System.out.println(user);
       //关闭连接
       sqlSession.close();
   }

输出如下

   User{id=1, username='user001', password='pass001'}

练习:根据id和name查询用户

@Param注解

在接口需要多个参数时需要使用@Param注解,否则XML中应该这样编写:

   <select id="getUserByIdAndName" resultType="com.sstype.mybatis.pojo.User">
       select id,username,password from user where id = #{param1} and username = #{param2}
   </select>

@Param注解只有一个value参数:

   public @interface Param {
       String value();
   }

该注解的作用是用于传递参数,从而可以与数据库中的的字段名相对应,一般在 2=<参数数量<=5 时使用最佳。

使用Param的实现

  1. 在UserMapper中添加对应的方法
       /**

        * 根据ID和用户名获取用户

        */
       User getUserByIdAndName(@Param("id") int id,@Param("username") String username);
  1. 在UserMapper.xml中添加对应的SQL语句
   <select id="getUserByIdAndName" resultType="com.sstype.mybatis.pojo.User">
       select id,username,password from user where id = #{id} and username = #{username}
   </select>
  1. 编写测试方法
   @Test
   public void getUserByIdAndName() {
       //获取 SqlSession
       SqlSession sqlSession = MybatisUtils.getSession();
       //获取 Mapper
       UserMapper mapper = sqlSession.getMapper(UserMapper.class);
       //查询
       User user = mapper.getUserByIdAndName(1,"user001");
       System.out.println(user);
       //关闭连接
       sqlSession.close();
   }
输出如下
   User{id=1, username='user001', password='pass001'}

使用map的实现

除了使用 @Param 注解我们还可以通过map实现,操作步骤如下:

  1. 将UserMapper接口中的getUserByIdAndName方法参数改为map
       /**

        * 根据ID和用户名获取用户

        */
       User getUserByIdAndName(Map<String,Object> map);
  1. 编写sql语句的时候,需要传递参数类型,参数类型为map
   <select id="getUserByIdAndName" parameterType="map" resultType="com.sstype.mybatis.pojo.User">
       select id,username,password from user where id = #{id} and username = #{username}
   </select>
  1. 在使用方法的时候,Map的 key 为 sql中取的值即可
   @Test
   public void getUserByIdAndName() {
       //获取 SqlSession
       SqlSession sqlSession = MybatisUtils.getSession();
       //获取 Mapper
       UserMapper mapper = sqlSession.getMapper(UserMapper.class);
       //查询
       //        User user = mapper.getUserByIdAndName(1,"user001");
       Map<String,Object> map = new HashMap<String, Object>();
       map.put("id",1);
       map.put("username","user001");
       User user = mapper.getUserByIdAndName(map);
       System.out.println(user);
       //关闭连接
       sqlSession.close();
   }

如果参数比较少(2>=参数数量>=5)则按照第一种方式进行传参,如果参数比较多的情况下可以考虑使用map实现。

新增操作(INSERT)

上边写了查询操作,这里来写一下新增的操作,新增和查询差不多,有一个点需要注意:增删改默认需要提交事务

练习:新增一个用户

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

        * 新增用户

        */
       int addUser(User user);
  1. 在UserMapper.xml中编写对应的INSERT语句
       <insert id="addUser" parameterType="com.sstype.mybatis.pojo.User">
           insert into user (username,password) values (#{username},#{password})
       </insert>

注意:因为我们的主键(id)是自动生成的,所以这里不需要填写。

  1. 编写测试方法

        @Test
        public void addUser() {
            //获取 SqlSession
            SqlSession sqlSession = MybatisUtils.getSession();
            //获取 Mapper
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);

            //构建User
            User user = new User();
            user.setUsername("user004");
            user.setPassword("pass004");
            //新增操作
            mapper.addUser(user);
            //提交事务
            sqlSession.commit();
            //查出来看看
            for (User u : mapper.getAllUser()) {
                System.out.println(u);
            }
            //关闭连接
            sqlSession.close();
        }

修改操作(UPDATE)

修改使用update标签,和新增差不多,写一下!

练习:修改用户的信息

  1. 在UserMapper新增对应的接口
       /**

        * 修改用户的信息

        */
       int updateUser(User user);
  1. 在UserMapper.xml中编写对应的UPDATE语句
   <update id="updateUser" parameterType="com.sstype.mybatis.pojo.User">
       update user set username = #{username} , password = #{password} where id = #{id}
   </update>
  1. 编写测试方法
       @Test
       public void updateUser() {
           //获取 SqlSession
           SqlSession sqlSession = MybatisUtils.getSession();
           //获取 Mapper
           UserMapper mapper = sqlSession.getMapper(UserMapper.class);
   
           //构建User
           User user = new User(3,"updateuser","updatepass");
           //新增操作
           mapper.updateUser(user);
           //提交事务
           sqlSession.commit();
           //查出来看看
           System.out.println(mapper.getUserById(3));
           //关闭连接
           sqlSession.close();
       }

删除操作(DELETE)

使用delete标签进行删除操作,它的使用方法和上面的也没啥区别!

练习:删除刚刚修改的用户

  1. 在UserMapper新增对应的接口
       /**

        * 删除用户

        */
       int deleteUserById(int id);
  1. 在UserMapper.xml中编写对应的UPDATE语句
       <delete id="deleteUserById" parameterType="int">
           delete from user where id = #{id}
       </delete>
  1. 编写测试方法
       @Test
       public void deleteUserById() {
           //获取 SqlSession
           SqlSession sqlSession = MybatisUtils.getSession();
           //获取 Mapper
           UserMapper mapper = sqlSession.getMapper(UserMapper.class);
           //删除用户
           mapper.deleteUserById(3);
           //提交事务
           sqlSession.commit();
           //查出来看看
           System.out.println(mapper.getUserById(3));
           //关闭连接
           sqlSession.close();
       }

总结

  1. 增删改查在mapper.xml中使用对应的标签进行操作,各个标签都差不多。
  2. 根据情况使用@Param注解或者map传递参数,也可以使用对象传递参数
  3. 增删改默认需要提交事务
Last modification:February 18th, 2020 at 09:49 pm
如果觉得我的文章对你有用,请随意赞赏