使用MyBatis对表执行CRUD操作——基于XML的实现

上一篇博文第一个MyBatis程序中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对users表执行CRUD操作。本文中使用到的测试环境是上一篇博文中的测试环境。

编写interface

public interface UserDao {
    /**执行查询操作,将查询结果自动封装成List返回*/
    List<User> getUserList();

    /**根据ID查询用户,将查询结果自动封装成pojo.User返回*/
    User getUserById(int id);
    /**insert*/
    int addUser(User user);
    /**update*/
    int updateUser(User user);
    /**delete*/
    int deleteUser(int id);
    
}

模糊查询

 /**模糊查询*/
    List<User> findUserByName(String value);

getUserById:映射xml文件中的statement中的id就要保持一致

返回值User:映射文件中的statement的resultType就要为User类型

参数值id:映射文件中的statement的parameterType就要为int类型
也可以使用全限定名java.lang.Integer,int是别名
mybatis自动帮我们进行了转换

Integer和int的区别

Integer是int的包装类, int是基本数据类型

最主要的区别就是这句 一个是基本数据类型, 一个是类,

但其实其中隐含的细节很多,比如:

  • Integer的默认初始值是null,而int的默认初试值是0。
  • Integer变量必须先实例,int变量则可以直接使用
  • 因为Integer是包装的类, 所以自带很多方法可以使用, 而int是基本数据类型只能做一些基本的±*/=等操作,当二者交叉就会出现很多问题,

定义sql映射xml文件

使用MyBatis对表执行CRUD操作——基于XML的实现_第1张图片

<select id="findUserByName" resultType="com.kuang.pojo.User" parameterType="string" >
       select * from mybatis.user where name LIKE "%"#{value}"%"
   select>

    <select id="getUserById" parameterType="java.lang.Integer" resultType="com.kuang.pojo.User">
        select * from mybatis.user where id = #{id}
    select>

    <insert id="addUser" parameterType="com.kuang.pojo.User" >
        insert into mybatis.user (id, name, pwd) value (#{id},#{name},#{pwd});
    insert>

    <update id="updateUser" parameterType="com.kuang.pojo.User" >
        update mybatis.user set name=#{name}, pwd=#{pwd}  where id = #{id}
    update>

    <delete id="deleteUser" parameterType="int" >
         delete from mybatis.user where id=#{id}
    delete>

mapper namespace

<mapper namespace="com.kuang.dao.UserMapper">

为mapper指定一个唯一的namespace,namespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的

例如namespace="com.kuang.dao.UserMapper"就是com.kuang.dao(包名)+UserMapper(UserMapper.xml文件去除后缀)

id

使用select来表示一个查询的statement,相当于statement.executeQuery

<select id="getUserList" resultType="com.kuang.pojo.User">
       select * from mybatis.user
   select>

id:表示该statement唯一标识

和 Mapper 的命名空间组合起来使用,是唯一标识符,供 MyBatis 调用

如果命名空间+id不唯一,那么 MyBatis 抛出异常

parameterType:输入参数类型

指定输入参数的java类型,可以填写别名或Java类的全限定名。别名的用法在详细讲解全局配置文件的时候会讲解到,在那边可以配置

resultType

指定输出结果的java类型,可以填写别名或Java类的全限定名。

resultType="com.kuang.pojo.User"就表示将查询结果封装成一个User类的对象返回

User类就是user表所对应的实体类

不需要返回结果可以不写,例如
在这里插入图片描述

#{}和${}的用法

#{}:相当于预处理中的占位符?

#{}里面的参数表示接收java输入参数的名称

#{}可以接受HashMap、简单类型、POJO类型的参数

简单类型:#{}里面可以是value,可以是任意值

POJO类型的参数:必须是POJO中的属性名

hashmap:key值名

------------------------------------------------------------------

${}:相当于拼接SQL串,对传入的值不做任何解释的原样输出。

${}会引起SQL注入,所以要谨慎使用。

${}可以接受HashMap、简单类型、POJO类型的参数。

当接受简单类型的参数时,${}里面只能是value

Map

Map是一个接口,即Interface Map,其中K-key类型和V-value的类型,<>里面的内容代表范式,比如 Map<String,int>就表示这个map的key是String,类型value是int类型,就是强制规定你map里面的类型,代码规范

MapMap<>中只能存放指定类型的key和指定类型的value如下

Map<String,Object>中只能存放String类型的键,Object类型的值

Object是所有类型的父类

实例

Map map=new HashMap();

//正确使用方式

map.put(“a”,1);

//错误使用方式,会导致无法通过编译

map.put(11,“abc”);

它的每个元素包含一个key对象和一个value对象,且在这两个对象之间存在一种映射的对应关系,所有从Map集合中访问元素时,只有指定了key就可以找到对应的value,因此key必须是唯一的且不能重复,当key相同时,后面的value值会覆盖之前的value值。

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

使用MyBatis对表执行CRUD操作——基于XML的实现_第2张图片

update

/**update*/
    int updateUser(User user);
    int updateUser2(Map<String,Object> map);
<update id="updateUser" parameterType="com.kuang.pojo.User" >
        update mybatis.user set pwd=#{pwd}  where id = #{id}
    update>

    <update id="updateUser2" parameterType="map">
        update mybatis.user set pwd=#{pwd}  where id = #{id}
    update>
 @Test
    public void updateUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        mapper.updateUser(new User(4,"玫瑰","123456"));

        sqlSession.commit();

        sqlSession.close();

    }
    @Test
    public void updateUser2(){

        //第一步:获得SqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();


        //方式一:getMapper
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        Map<String, Object> map = new HashMap<String, Object>();

        map.put("id",4);
        map.put("pwd","123456");

        int i = userMapper.updateUser2(map);

        sqlSession.commit();

        //关闭SqlSession
        sqlSession.close();
    }

多条件模糊查询

List<User> getUserByIdAndName(Map<String,Object> map);
 <select id="getUserByIdAndName"  parameterType="map" resultType="com.kuang.pojo.User">
            select * from   user  where id= #{id}  and name like concat("%"#{name}"%")
        select>
@Test
    public void getUserByIdAndName(){
        //第一步:获得SqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        //方式一:getMapper
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        Map<String, Object> map = new HashMap<String, Object>();

        map.put("id",3);
        map.put("name","李");

        List<User> userByIdAndName = userMapper.getUserByIdAndName(map);

        for (User user : userByIdAndName) {
            System.out.println(user);
        }
        //关闭SqlSession
        sqlSession.close();
    }

你可能感兴趣的:(mybatis,xml,sql,java)