小言_互联网的博客

【SSM】MyBatis 操作数据库(重点:Mybatis两种使用方式)

358人阅读  评论(0)

【大家好,我是爱干饭的猿,本文重点介绍ORM 框架和Mybatis的关系、如何通过注解 或者 通过XML配置文件的使用Mybatis,以及参数占位符 #{} 和 ${} 的区别, 什么是sql 注入。

后续会继续分享其他重要知识点总结,如果喜欢这篇文章,点个赞👍,关注一下吧】

上一篇文章:《【SSM】Spring AOP 统一问题处理(重点:Spring AOP 实现原理)》


🤞目录🤞

🎁1.MyBatis 是什么?

🎁2. 什么是ORM框架?

🎁3. MyBatis 的使用

3.1 添加MyBatis框架支持

1. 新项目添加MyBatis框架

2. 旧项目添加MyBatis框架

3.2 配置连接字符串和MyBatis

1. 配置连接字符串

2. 配置 MyBatis 中的 XML 路径

3.3 通过注解使用Mybatis

1. 查询

2. 插入

3. 修改

4. 删除

5. 总览(增删查改)

3.4 通过XML配置文件的形式使用Mybatis

0. 关于resultMap

1. 查询

2. 插入

3. 修改

4. 删除

5. 总览(增删查改)

3.5 参数占位符 #{} 和 ${} 和 sql 注入


🎁1.MyBatis 是什么?

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 去除了几乎所有的 JDBC 代码以及设置参数和获 取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

简单来说 MyBatis 是更简单完成程序和数据库交互的工具,也就是更简单的操作和读取数据库工具。

🎁2. 什么是ORM框架?

ORM 把数据库映射为对象:

  • 数据库表(table)--> 类(class)
  • 记录(record,行数据)--> 对象(object)
  • 字段(field) --> 对象的属性(attribute)

一般的 ORM 框架,会将数据库模型的每张表都映射为一个 Java 类。 也就是说使用 MyBatis 可以像操作对象一样来操作数据库中的表,可以实现对象和数据库表之间的转换。

MyBatis 也是一个 ORM 框架,ORM(Object Relational Mapping),即对象关系映射。在面向对象编程语言中,将关系型数据库中的数据 与对象建立起映射关系,进而自动的完成数据与对象的互相转换:

1. 将输入数据(即传入对象)+SQL 映射成原生 SQL

2. 将结果集映射为返回对象,即输出对象

 

一些其他框架:

  • Hibernate框架:偏向简化SQL的模式
  • MyBatis框架:偏向ORM的模式
  • Spring 内部提供的JdbcTemplate:偏向简化SQL的模式
  • JPA :完全倒向了ORM的形式,建表的过程都被抽象,我们看到的只有类(我写了类,框架根据类建表)

🎁3. MyBatis 的使用

3.1 添加MyBatis框架支持

1. 新项目添加MyBatis框架

2. 旧项目添加MyBatis框架

a. 使用 EditStarters插件

 

b. 手动添加


  
  1. <!-- 把 DataSource对象注册到Spring 中-->
  2. <dependency>
  3. <groupId>org.springframework.boot </groupId>
  4. <artifactId>spring-boot-starter-data-jdbc </artifactId>
  5. </dependency>
  6. <!-- 添加 mybatis 框架 -->
  7. <dependency>
  8. <groupId>org.mybatis.spring.boot </groupId>
  9. <artifactId>mybatis-spring-boot-starter </artifactId>
  10. <version>2.2.2 </version>
  11. </dependency>
  12. <!-- 添加 MySQL 驱动 -->
  13. <dependency>
  14. <groupId>mysql </groupId>
  15. <artifactId>mysql-connector-java </artifactId>
  16. <scope>runtime </scope>
  17. </dependency>

3.2 配置连接字符串和MyBatis

此步骤需要进行两项设置,数据库连接字符串设置和 MyBatis 的 XML 文件配置。

1. 配置连接字符串

如果是 application.yml 添加如下内容:


  
  1. spring:
  2. datasource:
  3. url: jdbc:mysql://127.0.0.1:3306/***?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
  4. username: root
  5. password: 123456

2. 配置 MyBatis 中的 XML 路径

通过XML配置文件的形式使用Mybatis 时需要配置,通过注解使用Mybatis时,不需要配置


  
  1. mybatis:
  2. mapper-locations: classpath:mapper/**.xml

3.3 通过注解使用Mybatis

定义Mapper 接口


  
  1. @Repository // 消除报错
  2. @Mapper // Mapper 注解
  3. public interface UserMapper {
  4. }

1. 查询


  
  1. // 1. 查询
  2. // 1.1 通过uid 查询得到Map对象
  3. @Select("select uid, username, password from users where uid = #{uid}")
  4. Map<String, Object> select1 (@Param("uid") int uid);
  5. // 1.2 通过uid 查询得到User类对象
  6. @Select("select uid, username, password from users where uid = #{uid}")
  7. UserDO select2 (@Param("uid") int uid);

2. 插入


  
  1. // 2. 插入
  2. // 2.1 插入,返回插入成功的条数
  3. @Insert("insert into users (username, password) values (#{username}, #{password})")
  4. int insert1 (UserDO userDO);
  5. // 2.2 由于用不到这个返回值,所以写成 void 更常见
  6. @Insert("insert into users (username, password) values (#{username}, #{password})")
  7. void insert2 (UserDO userDO);
  8. // 2.3 插入后拿到自增id
  9. // 通过 @Options 注解,添加一些配置,得到自增主键,设置成 uid
  10. // keyProperty : 对象的属性名是 uid
  11. // keyColumn : 表的字段名的 uid
  12. @Insert("insert into users (username, password) values (#{username}, #{password})")
  13. @Options(useGeneratedKeys = true, keyProperty = "uid", keyColumn = "uid")
  14. void insert3 (UserDO userDO);

3. 修改


  
  1. // 3. 修改
  2. @Update("update users set username = #{username}, password = #{password} where uid = #{uid}")
  3. int update (UserDO userDO);

4. 删除


  
  1. // 4. 删除
  2. @Delete("delete from users where uid = #{uid}")
  3. int delete (@Param("uid") int uid);

5. 总览(增删查改)


  
  1. import org.apache.ibatis.annotations.*;
  2. import org.springframework.stereotype.Repository;
  3. import java.util.Map;
  4. @Repository // 消除报错
  5. @Mapper // Mapper 注解
  6. public interface UserMapper {
  7. // 1. 查询
  8. // 1.1 通过uid 查询得到Map对象
  9. @Select("select uid, username, password from users where uid = #{uid}")
  10. Map<String, Object> select1 (@Param("uid") int uid);
  11. // 1.2 通过uid 查询得到User类对象
  12. @Select("select uid, username, password from users where uid = #{uid}")
  13. UserDO select2 (@Param("uid") int uid);
  14. // 2. 插入
  15. // 2.1 插入,返回插入成功的条数
  16. @Insert("insert into users (username, password) values (#{username}, #{password})")
  17. int insert1 (UserDO userDO);
  18. // 2.2 由于用不到这个返回值,所以写成 void 更常见
  19. @Insert("insert into users (username, password) values (#{username}, #{password})")
  20. void insert2 (UserDO userDO);
  21. // 2.3 插入后拿到自增id
  22. // 通过 @Options 注解,添加一些配置,得到自增主键,设置成 uid
  23. // keyProperty : 对象的属性名是 uid
  24. // keyColumn : 表的字段名的 uid
  25. @Insert("insert into users (username, password) values (#{username}, #{password})")
  26. @Options(useGeneratedKeys = true, keyProperty = "uid", keyColumn = "uid")
  27. void insert3 (UserDO userDO);
  28. // 3. 修改
  29. @Update("update users set username = #{username}, password = #{password} where uid = #{uid}")
  30. int update (UserDO userDO);
  31. // 4. 删除
  32. @Delete("delete from users where uid = #{uid}")
  33. int delete (@Param("uid") int uid);
  34. }

3.4 通过XML配置文件的形式使用Mybatis

先配置 MyBatis 中的 XML 路径,然后在mapper下 .xml 文件中写

 

定义Mapper 接口:


  
  1. import org.apache.ibatis.annotations.Mapper;
  2. import org.apache.ibatis.annotations.Param;
  3. import org.springframework.stereotype.Repository;
  4. import java.util.List;
  5. @Repository
  6. @Mapper
  7. public interface UserMapper {
  8. // 1. 查询
  9. // 1.1 单个查询
  10. User selectOneByUid (@Param("uid") int uid);
  11. // 1.2 多个查询
  12. List<User> selectListByUidList (@Param("uidList") List<Integer> uidList);
  13. // 1.3 动态查询
  14. User selectByUser (@Param("user") User user);
  15. // 2. 插入
  16. // 2.1 单个插入
  17. int insertOneUser (@Param("user") User user);
  18. // 2.1 批量插入
  19. int insertBatch (@Param("userList") List<User> userList);
  20. // 3. 修改
  21. void update (int uid , String username);
  22. // 4. 删除
  23. void delete (int uid);
  24. }

0. 关于resultMap

使用场景:

  • 字段名称和程序中的属性名不同的情况,可使用 resultMap 配置映射;
  • 一对一和一对多关系可以使用 resultMap 映射并查询数据。

  
  1. <!-- 返回字典映射-->
  2. <resultMap id="xxx" type="com.haomin.mybatis_xml.User">
  3. <id property="uid" javaType="Integer" column="uid" jdbcType="INTEGER" />
  4. <result property="username" javaType="String" column="username" jdbcType="VARCHAR" />
  5. <result property="password" column="password" />
  6. </resultMap>

1. 查询


  
  1. <!-- 1.1 单个查询 -->
  2. <select id="selectOneByUid" resultType="com.haomin.mybatis_xml.User" parameterType="int">
  3. select uid, username, password from users where uid = #{uid}
  4. </select>
  5. <!-- 1.2 多个查询 -->
  6. <select id="selectListByUidList" resultMap="xxx" parameterType="List">
  7. select uid, username, password from users where uid in (
  8. <foreach collection="uidList" item="id" separator=", ">
  9. #{id}
  10. </foreach>
  11. ) order by uid
  12. </select>
  13. <!-- 1.3 动态查询-->
  14. <select id="selectByUser" resultMap="xxx" parameterType="com.haomin.mybatis_xml.User">
  15. select uid, username, password from users where
  16. <if test="user.uid != null">
  17. uid = #{user.uid}
  18. </if>
  19. <if test="user.username != null">
  20. and username = #{user.username}
  21. </if>
  22. <if test="user.password != null">
  23. and password = #{user.password}
  24. </if>
  25. </select>

2. 插入


  
  1. <!-- 2.1 单个插入-->
  2. <insert id="insertOneUser" useGeneratedKeys="true" keyProperty="uid" keyColumn="uid">
  3. insert into users (username, password) values
  4. (#{user.username}, #{user.password})
  5. </insert>
  6. <!-- 2.2 批量插入-->
  7. <insert id="insertBatch" useGeneratedKeys="true" keyProperty="uid" keyColumn="uid">
  8. insert into users (username, password) values
  9. <foreach collection="userList" item="user" separator=", ">
  10. (#{user.username}, #{user.password})
  11. </foreach>
  12. </insert>

3. 修改


  
  1. <!-- 3. 修改-->
  2. <update id="update">
  3. update users set username = #{username} where uid = #{uid}
  4. </update>

4. 删除


  
  1. <!-- 4. 删除-->
  2. <delete id="delete">
  3. delete from users where uid = #{uid}
  4. </delete>

5. 总览(增删查改)


  
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.haomin.mybatis_xml.UserMapper">
  4. <!-- 返回字典映射-->
  5. <resultMap id="xxx" type="com.haomin.mybatis_xml.User">
  6. <id property="uid" javaType="Integer" column="uid" jdbcType="INTEGER" />
  7. <result property="username" javaType="String" column="username" jdbcType="VARCHAR" />
  8. <result property="password" column="password" />
  9. </resultMap>
  10. <!-- 1.1 单个查询 -->
  11. <select id="selectOneByUid" resultType="com.haomin.mybatis_xml.User" parameterType="int">
  12. select uid, username, password from users where uid = #{uid}
  13. </select>
  14. <!-- 1.2 多个查询 -->
  15. <select id="selectListByUidList" resultMap="xxx" parameterType="List">
  16. select uid, username, password from users where uid in (
  17. <foreach collection="uidList" item="id" separator=", ">
  18. #{id}
  19. </foreach>
  20. ) order by uid
  21. </select>
  22. <!-- 1.3 动态查询-->
  23. <select id="selectByUser" resultMap="xxx" parameterType="com.haomin.mybatis_xml.User">
  24. select uid, username, password from users where
  25. <if test="user.uid != null">
  26. uid = #{user.uid}
  27. </if>
  28. <if test="user.username != null">
  29. and username = #{user.username}
  30. </if>
  31. <if test="user.password != null">
  32. and password = #{user.password}
  33. </if>
  34. </select>
  35. <!-- 2.1 单个插入-->
  36. <insert id="insertOneUser" useGeneratedKeys="true" keyProperty="uid" keyColumn="uid">
  37. insert into users (username, password) values
  38. (#{user.username}, #{user.password})
  39. </insert>
  40. <!-- 2.2 批量插入-->
  41. <insert id="insertBatch" useGeneratedKeys="true" keyProperty="uid" keyColumn="uid">
  42. insert into users (username, password) values
  43. <foreach collection="userList" item="user" separator=", ">
  44. (#{user.username}, #{user.password})
  45. </foreach>
  46. </insert>
  47. <!-- 3. 修改-->
  48. <update id="update">
  49. update users set username = #{username} where uid = #{uid}
  50. </update>
  51. <!-- 4. 删除-->
  52. <delete id="delete">
  53. delete from users where uid = #{uid}
  54. </delete>
  55. </mapper>

当然还有更多用法:可以参考 Mybatis 官方文档

3.5 参数占位符 #{} 和 ${} 和 sql 注入

#{}:预编译处理。

${}:字符直接替换。

#{}预编译处理是指:MyBatis 在处理#{}时,会将 SQL 中的 #{} 替换为?号,使用 PreparedStatement 的 set 方法来赋值,编译后会带上 ‘ ’。

${}直接替换:是 MyBatis 在处理 ${} 时,就是把 ${} 替换成变量的值。

结论:

  • 用于查询的字段,尽量使用 #{} 预查询的方式,如果用${} 可能会出现sql注入问题。
  • 使用 ${sort} 可以实现排序查询或者分页,而使用 #{sort} 就不能实现排序查询了,因为当使用 #{sort} 查询时,如果传递的值为 String 则会加单引号,就会导致 sql 错误。

sql 注入代码例子:

执行:

select * from userinfo where username = '${name}' and password = '${pwd}'

当sql 为 : ' or 1=1  时

执行语句:

select * from users where username = ' or 1=1  and password = ' or 1=1;

当然,Mybatis 还有更多用法:可以参考 Mybatis 官方文档

分享到此,感谢大家观看!!!

如果你喜欢这篇文章,请点赞关注吧,或者如果你对文章有什么困惑,可以私信我。

🏓🏓🏓


转载:https://blog.csdn.net/m0_62218217/article/details/127392647
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场