03-Mybatis增删改查的简单功能实现

增删改查的实现

在上文中已经建立了mybatis的环境,并且创建了UserMapper.xml、userMapper,并且完成了一个简单的查询操作,已经可以成功的运行(环境可以正常的跑起来了)

下面对整个数据库的基础操作:增删改查的代码进行编写

mybatis的方便之处便在于:搭建好运行环境之后,新的增删改查需求,只需要对UserMapper接口和UserMapper.xml中实现,并进行测试即可,配置文件等内容无需改动

1. 增(insert)

需求:在数据库表users中新加一个user对象

  1. UserMapper接口中新增抽象方法:inserUser()
// 新增一个user对象
void insertUser(Users user);
  1. UserMapper.xml中新增insert标签的sql操作语句

可以通过**#{属性名}**直接将对象的属性值取出来,注意:{}中的属性名需和数据库表的属性字段名对应

<!--增加一个user对象 对象中的属性值可以直接通过#{属性名字}取出来-->
<insert id="insertUser" parameterType="com.kevin.pojo.Users">
    insert into mybatis01.users (id, name, age, sex, password, address) values (#{id}, #{name}, #{age}, #{sex}, #{password}, #{address});
</insert>
  1. 测试类进行测试
@Test
public void insertUser(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    mapper.insertUser(new Users(8,"张小二",12,"man", "123321", "中国北京"));
    // 更改数据库之后,需要进行事务的提交
    sqlSession.commit();
    // 关闭连接
    sqlSession.close();

}

注意:对数据库进行更改操作时,需要提交事务:sqlSession.commit()

2. 删(delete)

需求:在数据库表users中删除指定id的user对象

  1. UserMapper接口中新增抽象方法:deleteUserById():
// 根据Id删除数据
void deleteUserById(int id);
  1. UserMapper.xml中新增delete标签的sql操作语句
<!--根据id删除指定的user对象-->
<delete id="deleteUserById" parameterType="int">
    delete from mybatis01.users where id = #{id};

</delete>
  1. 测试类进行测试
@Test
public void deleteUserById(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    mapper.deleteUserById(4);
    sqlSession.commit();
    sqlSession.close();
}

注意:删除表也是对表的修改,需要提交事务

3.改(update)

需求:在数据库表users中对指定对象进行修改属性内容

  1. UserMapper接口中新增抽象方法:updateUser():
// 更新user对象
void updateUser(Users user);
  1. UserMapper.xml中新增update标签的sql操作语句
<!--更新指定User对象-->
<update id="updateUser" parameterType="com.kevin.pojo.Users">
    update mybatis01.users set name=#{name}, age=#{age}, password=#{password}, address=#{address} where id=#{id};
</update>
  1. 测试类进行测试
@Test
public void updateUser(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    mapper.updateUser(new Users(2, "小美", 22, "woman", "xiaomei123", "中国河北"));
    sqlSession.commit();
    sqlSession.close();
}

注意:更新完数据表,也需要提交事务

4. 查(select)

需求:在数据库表users中根据Id查询对象

  1. UserMapper接口中新增抽象方法:selectUserById():
// 根据Id查询对象
Users selectUserById(int id);
  1. UserMapper.xml中新增select标签的sql操作语句
<!--根据id查询指定user信息-->
<select id="selectUserById" parameterType="int" resultType="com.kevin.pojo.Users">
    select * from mybatis01.users where id = #{id};
</select>
  1. 测试类进行测试
@Test
public void selectUserById(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    Users users = mapper.selectUserById(6);
    System.out.println(users);
    sqlSession.close();
}

总结:在搭建好mybatis的运行环境之后,只需对mapper接口、mapper.xml进行更改即可;在对数据库表进行更改(删除、增加、更改)操作之后,需要提交事务,才能更新表中的修改信息。

5. 思考1:万能的Map

一般情况下,一个项目包含多个数据库表,而每个数据库表中的字段属性有十好几个甚至上百个,而我们只需要对其中的一两个进行修改(新增),此时如果通过对象传参时,如果参数不能为空,则需要将所有属性都放到对象中,将会是一个很大的“工程”

解决方法:“万能的Map” 顾名思义,可以将需要的字段名和对应的值以键值对的形式存放到一个map中作为参数传递,在sql语句中取出所需要的键就可以了。

譬如:在本案例中,数据库表中有id、name、age、sex、password、address 6个字段,除了id主键不为空,其他字段内容可以为空,因此若在进行插入数据时,只想对其中一部分字段插入数据,若使用对象作为参数,则需要将不需要的字段均传null值,加入使用“万能的map”传参,只需通过键值对进行传参即可:

需求:新增数据,只传入部分字段值,其余值为null:

  1. 创建UserMapper接口的抽象方法:
// 传入参数为map
int insertUser2(Map map);
  1. 在UserMapper.xml中编写:insert标签方法,参数类型为map:#{}中的字段名称应与map中的键名保持一致
<!--将参数以map形式传入,插入数据   {}中的字段名称应与map中的键名保持一致-->
<insert id="insertUser2" parameterType="map">
    insert into mybatis01.users (id, name, age, password) values (#{id}, #{username}, #{age}, #{pwd})
</insert>
  1. 测试类代码:
@Test
public void insertUser2(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    // 将参数以map形式传入
    Map<String, Object> map = new HashMap<>();
    map.put("id", 9);
    map.put("username", "田老师");
    map.put("age", 40);
    map.put("pwd", "123123");
    mapper.insertUser2(map);
    // 提交事务
    sqlSession.commit();
    sqlSession.close();
}

运行,显示插入成功:
在这里插入图片描述

注意:

  • Map中传递参数,直接在sql中取出对应的key值即可,#{}中为与map中的键名相同;parameterType="map"

  • 对象传递参数,直接在sql中取出对象属性即可,#{}中的内容为对象的属性名;parameterType="Object"

  • 当只有一个基本类型作为参数时,直接在sql中取出,譬如:#{id}; parameterType="int"

  • 当方法中需要传递多个参数时,使用map或者注解(后面学习);

6. 思考2:模糊查询

  1. 在Java代码执行的时候,传递通配符%%
  • 编写UserMapper接口的抽象方法:
// 模糊查询 1 java代码参数传递通配符% %
List<Users> selectUsesLike1(String str);
  • 编写UserMapper.xml中的select标签内容:
<!--模糊查询1 通过java参数传递通配符-->
<select id="selectUsesLike1" parameterType="String" resultType="com.kevin.pojo.Users">
    select * from mybatis01.users where name like #{str};
</select>
  • 测试类:
@Test
public void selectUsesLike1(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    List<Users> users = mapper.selectUsesLike1("小%");
    for (Users user : users) {
        System.out.println(user);
    }
    sqlSession.close();
}
  • 查询结果:查询出名字以小开头的user信息

在这里插入图片描述

  1. 在UserMapper.xml中的sql语句中使用通配符:
  • 编写UserMapper接口的抽象方法:
// 模糊查询 2 sql语句中传递通配符% %
List<Users> selectUsesLike2(String str);
  • 编写UserMapper.xml中的select标签内容:
<!--模糊查询2 在sql中拼接使用通配符-->
<select id="selectUsesLike2" parameterType="String" resultType="com.kevin.pojo.Users">
    select * from mybatis01.users where name like "%"#{str}"%";
</select>
  • 测试类:
@Test
public void selectUsesLike2(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    List<Users> users = mapper.selectUsesLike2("小");
    for (Users user : users) {
        System.out.println(user);
    }
    sqlSession.close();
}
  • 查询结果:查询出名字中带小的所有user信息
    在这里插入图片描述
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值