利用MyBatis框架操作数据库1

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 利用MyBatis框架操作数据库

一、MyBatis框架简介

MyBatis是一个持久化框架,支持自定义SQL、存储过程以及高级映射,是一个优秀的ORM(对象关系映射)的框架。

MyBatis框架的特点就是比较灵活。

二、创建Mybatis项目

1、在Mysql中创建要进行操作的数据库和数据表。

2、创建项目并添加MyBatis依赖

#配置数据库的连接信息
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/mycnblog?characterEncoding=utf8
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

3、配置MyBatis连接字符串以及保存的xml目录。

配置数据库连接信息:

#配置数据库的连接信息
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/mycnblog?characterEncoding=utf8
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

xml文件保存路径:

#设置MyBatis的xml保存路径
mybatis:
  mapper-locations: classpath:mybatis/**Mapper.xml

4、添加业务代码

a、创建model包,添加UserInfo实体类:

@Data
public class UserInfo {
    private Integer id;
    private String username;
    private String password;
    private String photo;
    private String createTime;
    private String updateTime;
    private int state;
}

b、创建mapper包,定义UserMapper接口:

@Mapper
public interface UserMapper {
    public UserInfo getUserInfoById(@Param("id") Integer id);
 
}

在resources目录下创建mybatis文件夹,创建UserMapper.xml文件,文件内容如下,其中select标签的id表示要执行的方法名,resultType表示返回的类的路径:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--设置实现接口的具体的包名加类名-->
<mapper namespace="com.example.mybatisdemo.mapper.UserMapper">
    <select id="getUserInfoById" resultType="com.example.mybatisdemo.model.UserInfo">
        select * from userinfo where id=${id}
    </select>
</mapper>

创建service包,创建UserService类,获取到UserMapper并实现getUserInfoById方法:

@Service
public class UserService {
    @Resource
    public UserMapper userMapper;
    public UserInfo getUserInfoById(Integer id){
        return userMapper.getUserInfoById(id);
    }
}

创建controller包,创建UserController类,获取到UserService类并实现getUserInfoById方法:

@Controller
public class UserController {
    @Autowired
    private UserService userService;
    @ResponseBody
    @RequestMapping("/getuserinbyid")
    public UserInfo getUserInfoById(Integer id){
        if(id == null){
            return null;
        }
        return userService.getUserInfoById(id);
    }
}

访问验证:

三、利用MyBatis操作数据库

在操作数据库之前,首先了解一下单元测试,单元测试可以针对某一方法进行测试,并且不需要再启动SpringBoot项目,使用单元测试有如下好处:

  • 使用单元测试可以非常直观、简单地测试某一功能的正确性;
  • 使用单元测试可以帮助在打包的时候发现一些错误,因为在打包之前要求所有的单元测试都必须通过。
  • 使用单元测试不会对原有的数据库造成污染。

如果不想对数据库造成污染,就需要添加@Transactional注解,其原理是先执行sql语句,在进行回滚操作。

使用单元测试的一般步骤:

先生成单元测试的类:

在接口中右击鼠标,单击generate:

选择test,出现如下界面:

点击ok之后就会自动生成测试类。

增加数据

增加一条用户信息,并返回受影响的行数。

首先需要在UserMapper接口中声明方法。

 //添加用户信息,返回受影响的行数
    public int addUserInfo(UserInfo userInfo);

然后需要在resources文件夹下的MyBatis文件下的UserMapper.xml文件中新增如下的insert标签:

<!--增加用户信息,返回受影响的行数 -->
    <insert id="addUserInfo">
        insert into userinfo(id,username,password,photo) values(#{id},#{username},#{password},#{photo})
    </insert>

在生成的测试类中编写代码:

    @Test
    void addUserInfo() {
        UserInfo userInfo = new UserInfo();
        userInfo.setId(2);
        userInfo.setUsername("lucy");
        userInfo.setPassword("1234");
        userInfo.setPhoto("test.jpg");
        int i =userMapper.addUserInfo(userInfo);
        Assertions.assertEquals(1,i);//使用断言测试返回受影响的行数是否为1
    }


启动单元测试的结果:

由于当时在新建数据表时id是默认自增的,就需要在xml文件中的 insert添加如下属性:

<!--增加用户信息,返回受影响的行数 如下参数表示id为自增的-->
    <insert id="addUserInfo" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
        insert into userinfo(username,password,photo) values(#{username},#{password},#{photo})
    </insert>

删除数据

删除指定id的用户信息,并返回受影响的行数。

在UserMapper接口中定义删除数据的方法:

@Transactional //删除用户信息不污染数据库
    //根据ID查询User信息
    public int deleteUserInfo(@Param("id") Integer id);

在xml文件下添加delete标签:

    <!-- 通过指定id删除用户信息 -->
    <delete id="deleteUserInfo">
        delete from userinfo where id=#{id}
    </delete>

在测试类中编写代码:

    //根据ID删除UserInfo信息
    @Test
    void deleteUserInfo() {
        int i =userMapper.deleteUserInfo(3);
        Assertions.assertEquals(1,i);//使用断言测试返回受影响的行数是否为1
    }

启动单元测试运行结果:

修改数据

修改指定id的用户名。

在UserMapper接口中定义修改数据方法:

//根据id修改用户名
    public int updateUserInfo(@Param("id") Integer id,@Param("username") String username);

在xml文件中添加update标签:

<!--指定id修改用户名-->
    <update id="updateUserInfo">
        update userinfo set username=#{username} where id=${id}
    </update>

在生成的测试类中编写测试代码:

//根据id修改用户名
    @Test
    void updateUserInfo() {
        int i = userMapper.updateUserInfo(2,"mary");
        Assertions.assertEquals(1,i);//使用断言测试返回受影响的行数是否为1
    }

测试运行结果:

查询数据

根据id查询用户信息。

在UserMapper中定义查询方法:

@Transactional
    //根据id查询UserInfo信息
    public UserInfo getUserInfoById(@Param("id") Integer id);

在xml文件中添加select标签,其中resultType标签表示返回的对象所属类的路径

<!-- 通过id查询用户信息 -->
    <select id="getUserInfoById" resultType="com.example.mybatisdemo.model.UserInfo">
        select * from userinfo where id=${id}
    </select>

在测试类中编写测试代码:

//通过id查询用户信息
    @Test
    void getUserInfoById() {
        UserInfo userInfo = userMapper.getUserInfoById(1);
        Assertions.assertNotNull(userInfo);
    }

测试运行结果:

在之前的xml文件中使用${}和#{} 这两种参数占位符,那么这两种占位符有如下区别:

定义不同:${}直接替换,#{}会进行预处理;

用法不同:${}只适用于整数替换,#{}适合所有的数据类型;

安全性不同:${}会导致sql注入安全问题,#{}的性能高,并且不存在安全问题。

${}如何会引起sql注入呢?

在userinfo信息表中有username和password两个属性,那么在查询的时候给password属性传入‘or 1= ‘1’’就会导致查出所有的用户信息包含用户的密码:

xml文件中新增如下的select标签:

<!-- 通过用户名和密码查询用户信息 -->
    <select id="getUserInfoByNameAndPwd" resultType="com.example.mybatisdemo.model.UserInfo">
        select * from userinfo where username='${username}' and password=${password}
    </select>

使用如下测试代码:

 //根据用户名和密码查询用户信息
    @Test
    void getUserInfoByNameAndPwd() {
        String username = "admin";
        String password = "''or 1 ='1'";
        userMapper.getUserInfoByNameAndPwd(username,password);
    }

查询到了所有的userinfo导致sql注入问题:

但是将参数占位符换为#{},再进行测试:

#{}占位符会进行预处理,不会直接进行替换,就不会出现sql注入的问题。

那么?{}就没有应用场景了吗?答案当然是否定的,任何东西存在即合理,当传递的参数是sql关键字或sql命令时就需要使用?{}占位符,因为需要直接替换,不需要#{}来进行预处理为字符串,否则就会报错。

利用MyBatis框架操作数据库2:https://developer.aliyun.com/article/1521802?spm=a2c6h.13148508.setting.18.55b44f0eiXO8eW

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
13天前
|
SQL Java 数据库连接
深入 MyBatis-Plus 插件:解锁高级数据库功能
Mybatis-Plus 提供了丰富的插件机制,这些插件可以帮助开发者更方便地扩展 Mybatis 的功能,提升开发效率、优化性能和实现一些常用的功能。
90 26
深入 MyBatis-Plus 插件:解锁高级数据库功能
|
12天前
|
SQL Java 数据库连接
持久层框架MyBatisPlus
持久层框架MyBatisPlus
30 1
持久层框架MyBatisPlus
|
18天前
|
SQL 安全 Java
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
13 1
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
|
1月前
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
68 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库
|
1月前
|
前端开发 Java 数据库连接
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
本文是一份全面的表白墙/留言墙项目教程,使用SpringBoot + MyBatis技术栈和MySQL数据库开发,涵盖了项目前后端开发、数据库配置、代码实现和运行的详细步骤。
43 0
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
|
26天前
|
缓存 Cloud Native 安全
探索阿里巴巴新型ORM框架:超越MybatisPlus?
【10月更文挑战第9天】在Java开发领域,Mybatis及其增强工具MybatisPlus长期占据着ORM(对象关系映射)技术的主导地位。然而,随着技术的发展,阿里巴巴集团推出了一种新型ORM框架,旨在提供更高效、更简洁的开发体验。本文将对这一新型ORM框架进行探索,分析其特性,并与MybatisPlus进行比较。
28 0
|
3月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
3月前
|
SQL Java 数据库连接
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。通过映射机制,它可以自动处理对象与数据库表之间的转换,支持主流数据库,提高了代码的可移植性和可维护性。其核心接口包括 SessionFactory、Session 和 Transaction 等,通过它们可以执行数据库的 CRUD 操作。配置方面,需在项目中引入 Hibernate 及数据库驱动依赖,并创建 `hibernate.cfg.xml` 配置文件来设置数据库连接和 Hibernate 行为参数。
47 1
|
3月前
|
SQL 关系型数据库 MySQL
解决:Mybatis-plus向数据库插入数据的时候 报You have an error in your SQL syntax
该博客文章讨论了在使用Mybatis-Plus向数据库插入数据时遇到的一个常见问题:SQL语法错误。作者发现错误是由于数据库字段中使用了MySQL的关键字,导致SQL语句执行失败。解决方法是将这些关键字替换为其他字段名称,以避免语法错误。文章通过截图展示了具体的操作步骤。
|
3月前
|
SQL Java 数据库连接
【Java 第十三篇章】MyBatis 框架介绍
MyBatis 原名 iBATIS,2001 年由 Clinton Begin 创建,以其简易灵活著称。2010 年更名以重塑品牌形象。MyBatis 通过 SQL 映射文件将 SQL 语句与 Java 代码分离,支持编写原生 SQL 并与方法映射。具备对象关系映射功能,简化数据库记录处理。支持动态 SQL 构建,灵活应对不同查询条件。内置缓存机制,提升查询效率。相比全功能 ORM,MyBatis 提供更高 SQL 控制度和更好的维护性,并易于与 Spring 等框架集成,广泛应用于 Java 数据访问层。
37 0