前言
本篇介绍了什么是MyBatis,MyBatis的前期配置,MyBatis操作数据库的两种方式:.xml文件 / 注释,使用MyBatis的一些注意,如有错误,请在评论区指正,让我们一起交流,共同进步!
文章目录
- 前言
- 1. 什么是MyBatis?
- 2. 使用MyBatis - 前期准备
- 3. MyBatis 操作数据库:
- 方式一:定义接口 + 实现.xml文件(实现接口)- 实现操作数据库
- 方式二:定义接口 + 注释 - 实现操作数据库
- 4. 使用MyBatis注意事项
- 获取自增主键
- 使用like查询
- 总结
本文开始
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>
总结
✨✨✨各位读友,本篇分享到内容如果对你有帮助给个👍赞鼓励一下吧!!
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!