详解如何使用MyBatis实现数据库的CRUD

 更新时间:2024年12月02日 08:32:08   作者:爱上语文  
这篇文章主要为大家详细介绍了如何使用MyBatis实现数据库的CRUD操作,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

Mybatis中#占位符和$拼接符的区别

“#”占位符

在使用MyBatis操作数据库的时候,可以直接使用如下代码进行删除数据

@Delete("delete from user where id=5")
public Integer deleteById();

这个代码可以成功完成删除user表中id为5的用户,但是其实存在一个问题:硬编码。把这个删除的SQL语句写死了,假如说下一次需要删除id为6的用户就又要重新编写一条SQL了。所以说我们可以使用#占位符:

@Delete("delete from user where id=#{id}")
public Integer deleteById(Integer id);

这样写,需要给deleteById方法传递需要删除的id,并使用#进行占位,在编译时,就会将这条SQL语句编译为一条预编译SQL:delete from user where id=?。然后再用方法中的参数id去对预编译SQL中的?进行参数绑定(将 Java 方法中的参数与 SQL 语句中的占位符建立关联并赋值的动作),从而避免硬编码的问题,并且还可以提高SQL语句的执行效率(预编译SQL提高SQL语句的执行效率)。

“$”拼接符

和#占位符不同,$只是拼接符,是直接将参数值拼接在SQL中,并不能使SQL语句变成预编译SQL,所以说还是存在SQL注入问题和性能低下的问题,所以说用的十分少。但是当表名和字段名需要动态变化的时候,就只能使用$拼接符,如:"select * from ${tablename}"这种动态的表名会使用$拼接符。

Create

create操作是在数据库中新增一条数据,通过MyBatis中的@Insert注解可以便捷的完成数据的新增,当进行数据新增操作时,往往会涉及多个不同类型的属性。从数据组织和管理的角度出发,为了更好地维护数据的完整性和关联性,通常会将这些相关属性封装为一个实体对象。这种实体对象的设计遵循面向对象编程的原则,以业务逻辑中的实际实体为蓝本,例如在用户管理系统中,用户相关的属性(如用户名、密码、姓名、年龄等)会被封装在一个User实体对象中。这个实体对象会作为参数传递给负责新增数据的方法,SQL中的占位符会获取对象中的属性来拼接SQL:

@Insert("insert into user(id, username, password, name, age) " +
        "values (#{id}, #{username}, #{password}, #{name}, #{age})")
public Integer insertUser(User user);

values中的值就是User对象中的属性,是#占位符从User对象中的属性中获取的。(如何获取本文不过多赘述)

测试该方法:

@Test
public void testInsert() {
    User user = new User(null, "zhouyu", "123456", "周瑜", 23);
    Integer rows = userMapper.insertUser(user);
    System.out.println("影响的行数是:" + rows);
}

(因为id字段是主键,并且自增,所以说不需要传递id的参数。)

原数据表:

测试结果:

看到新增的方法成功在数据库表中插入了一条新的数据,代表新增方法成功了。需要说明的是:id是自增的,前面自测的时候创建了很多user,所以说id自增到了10,虽然删除了这些user,但是id也是从10开始自增的,所以说再次添加user,id从10自增,则变成11。

Read

Read操作是查询(读取)数据库中的数据,通过MyBatis中的@Select注解可以便捷的完成数据的查询:

@Select("select * from user where username = #{username} and password = #{password}")
public void selectUser(@Param("username")String username, @Param("password")String password);

此处只需要使用两个字段进行查找,没有必要将属性封装到User对象中,可以直接传递;但是需要非常注意的是此处传递的是参数名,#占位符绑定的也是参数名,但是在编译后方法中的参数名不会保留,只会保留参数的类型,而#占位符参数绑定是在编译后进行的,但是此时有两个参数,#占位符无法进行准确绑定,所以说就会报错。为了解决这个问题,需要在方法的参数之前添加@Param注解来指定该参数的名字,#占位符中也需要和@Param注解中相同的名字(参数名不重要),这样才可以指定参数。但是假如是官方的SpringBoot框架,无需使用@Param注解,只要保证#占位符中的参数和方法的参数名相同即可,也可以完成绑定。

测试方法:

@Test
public void testFind() {
    User user = userMapper.selectUser("liubei", "123456");
    System.out.println(user);
}

发现根据username和password成功查询到了User,说明查找方法成功。

Update

update操作是更新数据库中的数据,通过MyBatis中的@Update注解可以便捷的完成数据的删除:

@Update("update user set username=#{username}, password=#{password}, name=#{name}, age=#{age} where id=#{id}")
public Integer updateUser(User user);

和insert操作类似,需要将要更新的字段封装为对应实体对象的属性,然后通过#占位符获取属性,完成SQL语句的拼接,需要注意的是,在insert操作中,因为id是自增的,所以说不需要传递id属性,但是在update操作中,很多时候都需要根据id属性来找到要更新哪一条数据,所以说大多数时候是需要传递id的,但是也需要根据具体情况而定。

测试方法:

@Test
public void testUpdate() {
    User user = new User(1, "liubei", "123456", "刘备", 25);
    Integer rows = userMapper.updateUser(user);
    System.out.println("影响的行数是:" + rows);
}

测试前数据表:

测试结果:

发现id为1的用户被修改为了刘备,说明该修改方法成功修改。

Delete

delete操作是删除数据库中的数据,通过MyBatis中的@Delete注解可以便捷的完成数据的删除:

@Delete("delete from user where id=#{id}")
public Integer deleteById(Integer id);

在MyBatis中执行所有的DML语句都是有返回值的,是int类型,代表这条语句影响的记录数,通过测试方法来测试下这个删除方法: 原数据表:

测试方法:

@Test
public void testDelete() {
    Integer rows = userMapper.deleteById(5);
    System.out.println("影响的行数是:" + rows);
}

我们看到#占位符确实将SQL变成了一条预编译的SQL,并且这条SQL影响了一条记录。看看数据库中的变化:

id为5的记录确实被删除了,说明该方法测试成功。

以上就是详解如何使用MyBatis实现数据库的CRUD的详细内容,更多关于MyBatis实现数据库CRUD的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot后端解决跨域问题的3种方案分享

    SpringBoot后端解决跨域问题的3种方案分享

    这篇文章主要给大家分享介绍了关于SpringBoot后端解决跨域问题的3种方案,跨域指的是浏览器不能执行其他网站的脚本,它是由浏览器的同源策略造成的,是浏览器施加的安全限制,需要的朋友可以参考下
    2023-07-07
  • MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

    MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

    MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,需在需要动态数据(如Oracle序列、存储过程主键)时禁用缓存,避免缓存干扰查询结果
    2025-09-09
  • java 字符串转化为字符数组的3种实现案例

    java 字符串转化为字符数组的3种实现案例

    这篇文章主要介绍了java 字符串转化为字符数组的3种实现案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • spring框架中的本地缓存之spring cache基本使用详解

    spring框架中的本地缓存之spring cache基本使用详解

    Spring Cache 是 Spring 提供的一整套的缓存解决方案,它提供了一整套的接口和代码规范、配置、注解等,这样它就可以整合各种缓存方案了,本文给大家介绍spring框架中的本地缓存之spring cache基本使用,感兴趣的朋友一起看看吧
    2025-05-05
  • 解决spring-boot-maven-plugin报红的问题

    解决spring-boot-maven-plugin报红的问题

    这篇文章主要给大家介绍一下如何解决spring-boot-maven-plugin报红的问题,文中通过图文讲解的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2023-08-08
  • 分享几个写简洁java代码的小技巧

    分享几个写简洁java代码的小技巧

    成为一个优秀的Java程序员,有着良好的代码编写习惯是必不可少的,下面这篇文章主要给大家介绍了关于写java代码的小技巧,文中通过图文以及实例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • Java 实现二叉搜索树的查找、插入、删除、遍历

    Java 实现二叉搜索树的查找、插入、删除、遍历

    本文主要介绍了Java实现二叉搜索树的查找、插入、删除、遍历等内容。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • Spring Boot 整合 SSE的高级实践(Server-Sent Events)

    Spring Boot 整合 SSE的高级实践(Server-Sent Even

    SSE(Server-Sent Events)是一种基于HTTP协议的单向通信机制,允许服务器向浏览器持续发送实时更新,这篇文章主要介绍了Spring Boot 整合 SSE的高级实践(Server-Sent Events),需要的朋友可以参考下
    2025-04-04
  • Java基础强化训练输入错误即结束进程

    Java基础强化训练输入错误即结束进程

    本文主要介绍了Java编程的基础知识强化应用,文中实例涉及到了许多基础知识,new对象,控制台输入,if语句等。很实用,需要的朋友可以参考下
    2017-09-09
  • java1.5中访问环境变量

    java1.5中访问环境变量

    这篇文章主要介绍了如何在java1.5中访问环境变量,使用System.getenv()可以访问环境变量
    2014-01-01

最新评论