本篇介绍了什么是MyBatis,MyBatis的前期配置,MyBatis操作数据库的两种方式:.xml文件 / 注释,使用MyBatis的一些注意,如有错误,请在评论区指正,让我们一起交流,共同进步!
MyBatis(ORM: 对象关系映射框架): 一个持久层框架,也是一个工具实现程序与数据库交互,从而更简单的操作数据库的框架;
为什么使用MyBatis ?
MyBatis 省略了复杂的JDBC操作,可以通过.xml文件的方式 或 注释的方式实现数据库的快速操作;
在之前创建的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的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
1.接口:定义接口,方法的声明 - 给Service层调用
@Mapper // MyBatis中的接口使用注释Mapper - 数据持久层标识
public interface UserMapper {
//接口只声明即可
List<Userinfo> getUser();
}
2.XML:实现接口,对数据库进行具体操作增删改查等等;
<?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();
对于参数注入有两种:${}, #{}
① ${xxx} :及时执行,不安全,会发生sql注入;
执行过程:将 ${}位置直接替换;直接执行;
② #{xxx}:预执行;安全可以防止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命令时使用, 结果可以被穷举;
解决方法:
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>
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>
✨✨✨各位读友,本篇分享到内容如果对你有帮助给个赞鼓励一下吧!!
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!