认识 MyBatis + MyBatis如何使用 (MyBatis操作数据库)


前言

本篇介绍了什么是MyBatis,MyBatis的前期配置,MyBatis操作数据库的两种方式:.xml文件 / 注释,使用MyBatis的一些注意,如有错误,请在评论区指正,让我们一起交流,共同进步!



本文开始

1. 什么是MyBatis?

MyBatis(ORM: 对象关系映射框架): 一个持久层框架,也是一个工具实现程序与数据库交互,从而更简单的操作数据库的框架;

为什么使用MyBatis ?
MyBatis 省略了复杂的JDBC操作,可以通过.xml文件的方式 或 注释的方式实现数据库的快速操作;

2. 使用MyBatis - 前期准备

在之前创建的spring boot项目上 + 添加依赖MyBatis + 它操作的数据库(MySQL Driver)

运行程序验证项目是否创建成功:

问题:直接运行MyBatis,会报错;

在这里插入图片描述

  • 原因:未设置要连接的具体MySQL信息;

解决方式:需要先配置数据库信息 + MyBatis信息;
在application.properties文件下配置:

  • 数据库连接配置:
//配置数据库连接信息
spring.datasource.url= jdbc:mysql://localhost:3306/数据库名称?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=xxx
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  • MyBatis配置保存路径 + 保存的命名格式;
//设置MyBatis的xml保存路径 和 命名格式
mybatis.mapper-locations=classpath:mybatis/*Mapper.xml
//1.classpath:根目录, mybatis : 保存文件夹名称 - 可以任意起名(resoures文件之下的文件都会生成到根目录中)
//2.命名格式作用:读取mybatis文件下所有以 Mapper.xml为后缀的文件;

#配置 MyBatis 执行时打印SQL
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#配置打印MyBatis执行的SQL - 设置默认日志级别
logging.level.com.example.demo=debug

3. MyBatis 操作数据库:

方式一:定义接口 + 实现.xml文件(实现接口)- 实现操作数据库

1.接口:定义接口,方法的声明 - 给Service层调用

  • 定义接口过程:
    1.在数据持久层定义一个接口类
    2.实现定义接口 - 接口类只能定义接口,不能实现;
    3.如果接口参数需要实体类,还需要在model实体层创建对应类;
    4.实体类实现的属性,与之对应操作的数据库相应表的属性值一样;
@Mapper // MyBatis中的接口使用注释Mapper - 数据持久层标识
public interface UserMapper {
    //接口只声明即可
    List<Userinfo> getUser();
}

2.XML:实现接口,对数据库进行具体操作增删改查等等;

  • xml实现接口过程:
    1.根据定义的MyBatis XML中的命名的文件夹名称mybatis
    2.在对应的文件夹(mybatis)下创建对应的xxxMapper.xml文件;
    3.配置xml文件格式,通过namespace实现对应接口路径(也就是之前声明的文件) - 参数为包名+类名;
    4.在文件中写sql标签,select, delete等等;再为标签设置属性 id: 方法的名称, resultType: 设置对应接口的返回类型;
    5.写正常的sql语句,不用加分号;
<?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.demo.dao.UserMapper">
    <select id="getUser" resultType="com.example.demo.model.Userinfo">
        select * from userinfo
    </select>
</mapper>

实现时创建的目录示例:

在这里插入图片描述

方式二:定义接口 + 注释 - 实现操作数据库

示例:注解方式实现 单表 或 多表 查询 (update,detele等等操作数据库的方式也可以)
1.定义接口: 与方法一样,在mapper / dao包地下定义接口即可;
2.写对应注释:在定义的接口上,写上要操作数据库的sql语句;

@Select("select * from articleinfo where id=#{id}")
  List<Articleinfo> getListByUid(@Param("id")Integer id);
  
@Select("select a.*,u.username from articleinfo a " +
            "left join userinfo u on a.uid=u.id")
    List<Articleinfo> getAllInfo();

4. 使用MyBatis注意事项

对于参数注入有两种:${}, #{}
① ${xxx} :及时执行,不安全,会发生sql注入;
执行过程:将 ${}位置直接替换;直接执行;
② #{xxx}:预执行;安全可以防止SQL注入;
执行过程:将#{}替换为占位符 ? 并且 ?不能为sql语句;

  • 问题1:SQL注入问题: 在登录时,正常是通过正确的用户+密码,而sql注入,可以通过非法的用户+密码正确登录;

示例:查询数据库时, 输入非法密码,使用${}直接替换而产生问题;

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

//输入密码为 ' or 1='1
//sql进行替换
...where username='user_name' and password='' or 1 ='1';
//判断就变为了,密码为假,但是1='1'为真,从而登录成功;

【注】${} 使用场景:业务需要传递sql命令时使用, 结果可以被穷举;

  • 问题2:MyBatis通过名称进行映射,当 类中属性数据库的表中字段名 不一致时,查询结果为null

解决方法:
1.将类中属性名称 与 数据库中表中的字段名保存一样;
2.使用sql语句 as 进行字段名重命名,字段名==属性名;
3.定义一个resultMap, 将属性名 与 字段名手动映射;
主键使用 < id > 标签,column是字段名,property是属性名;

在这里插入图片描述

获取自增主键

1.定义接口,与正常方式一样;
2.实现接口:需要设置两个属性
useGeneratedKeys: 是否开启自增;
keyConlumn: 数据库中自增的字段名称 ;
keyProerty: 数据库自增的id赋值给此属性;

 <insert id="add2" useGeneratedKeys="true" keyProperty="id">
        insert userinfo(username, password)
        values(#{username}, #{password})
    </insert>

使用like查询

1.定义接口:
List getLikeList(@Param(“name”)String name);
2.实现接口:使用数据库中的函数 concat 拼接参数
示例:获取的最终结果:‘%name%’

<select id="getLikeList" resultType="com.example.demo.model.User">
        select * from user where
       	name like concat('%',#{name},'%')
    </select>

总结

✨✨✨各位读友,本篇分享到内容如果对你有帮助给个👍赞鼓励一下吧!!
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值