利用MyBatis框架操作数据库1

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 利用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
目录
相关文章
|
2天前
|
前端开发 Java 数据库连接
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
本文是一份全面的表白墙/留言墙项目教程,使用SpringBoot + MyBatis技术栈和MySQL数据库开发,涵盖了项目前后端开发、数据库配置、代码实现和运行的详细步骤。
7 0
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
|
2月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
2月前
|
Java 数据库连接 mybatis
mybatis框架图
文章介绍了MyBatis框架的起源、发展和其作为持久层框架的功能,提供了MyBatis的框架图以帮助理解其结构和组件。
mybatis框架图
|
2月前
|
SQL Java 数据库连接
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。通过映射机制,它可以自动处理对象与数据库表之间的转换,支持主流数据库,提高了代码的可移植性和可维护性。其核心接口包括 SessionFactory、Session 和 Transaction 等,通过它们可以执行数据库的 CRUD 操作。配置方面,需在项目中引入 Hibernate 及数据库驱动依赖,并创建 `hibernate.cfg.xml` 配置文件来设置数据库连接和 Hibernate 行为参数。
38 1
|
2月前
|
SQL 关系型数据库 MySQL
解决:Mybatis-plus向数据库插入数据的时候 报You have an error in your SQL syntax
该博客文章讨论了在使用Mybatis-Plus向数据库插入数据时遇到的一个常见问题:SQL语法错误。作者发现错误是由于数据库字段中使用了MySQL的关键字,导致SQL语句执行失败。解决方法是将这些关键字替换为其他字段名称,以避免语法错误。文章通过截图展示了具体的操作步骤。
|
2月前
|
XML SQL JavaScript
在vue页面引入echarts,图表的数据来自数据库 springboot+mybatis+vue+elementui+echarts实现图表的制作
这篇文章介绍了如何在Vue页面中结合SpringBoot、MyBatis、ElementUI和ECharts,实现从数据库获取数据并展示为图表的过程,包括前端和后端的代码实现以及遇到的问题和解决方法。
在vue页面引入echarts,图表的数据来自数据库 springboot+mybatis+vue+elementui+echarts实现图表的制作
|
2月前
|
Java 数据库连接 mybatis
后端框架的学习----mybatis框架(9、多对一处理和一对多处理)
这篇文章介绍了在MyBatis框架中如何处理多对一和一对多的关联查询,通过定义`<resultMap>`和使用`<association>`与`<collection>`元素来实现对象间的关联映射。
|
2月前
|
Java 数据库连接 测试技术
后端框架的学习----mybatis框架(8、lombok)
这篇文章介绍了如何在MyBatis框架中使用lombok库来简化Java实体类的编写,包括在IDEA中安装Lombok插件、在项目中导入lombok依赖以及在实体类上使用Lombok提供的注解。
|
2月前
|
SQL Java 数据库连接
【Java 第十三篇章】MyBatis 框架介绍
MyBatis 原名 iBATIS,2001 年由 Clinton Begin 创建,以其简易灵活著称。2010 年更名以重塑品牌形象。MyBatis 通过 SQL 映射文件将 SQL 语句与 Java 代码分离,支持编写原生 SQL 并与方法映射。具备对象关系映射功能,简化数据库记录处理。支持动态 SQL 构建,灵活应对不同查询条件。内置缓存机制,提升查询效率。相比全功能 ORM,MyBatis 提供更高 SQL 控制度和更好的维护性,并易于与 Spring 等框架集成,广泛应用于 Java 数据访问层。
23 0
|
2月前
|
druid Java 数据库连接
SpringBoot项目整合MybatisPlus持久层框架+Druid数据库连接池,以及实现增删改查功能
SpringBoot项目整合MybatisPlus和Druid数据库连接池,实现基本的增删改查功能。
185 0