MyBatis 是?款优秀的持久层框架,它?持?定义 SQL、存储过程以及?级映射。
简单来说 MyBatis 是更简单完成程序和数据库交互的?具,也就是更简单的操作和读取数据库?具
MyBatis 在整个框架中的定位,框架交互流程图:
为什么要实现 InterFace ,而不直接实现类:
原理:
MyBatis 也是?个 ORM 框架,ORM(Object Relational Mapping),即对象关系映射。
在?向对象编程语?中,将关系型数据库中的数据与对象建?起映射关系
进??动的完成数据与对象的互相转换:
ORM 把数据库映射为对象:
?般的 ORM 框架,会将数据库模型的每张表都映射为?个 Java 类。
也就是说使? MyBatis 可以像操作对象?样来操作数据库中的表,可以实现对象和数据库表之间的转换
那已经有了 JDBC 了,为什么还要学习 MyBatis?
从上述代码和操作流程可以看出,对于 JDBC 来说,整个操作?常的繁琐
MyBatis 可以帮助我们更?便、更快速的操作数据库
application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/mycnblog
username: root
password: 200337qqq
driver-class-name: com.mysql.cj.jdbc.Driver
MyBatis 的 XML 中保存是查询数据库的具体操作 SQL,配置如下:
# 配置 mybatis xml 的?件路径,在 resources/mapper 创建所有表的 xml ?件
mybatis:
mapper-locations: classpath:mapper/**Mapper.xml
mybatis 组成 2 部分:
按照后端开发的?程思路,也就是下?的流程来实现 MyBatis 查询所有?户的功能:
先添加?户的实体类:
import lombok.Data;
import java.util.Date;
@Data
public class Userinfo {
private Integer id;
private String username;
private String password;
private String photo;
private Date createTime;
private Date updateTime;
}
数据持久层的接?定义:
@Mapper
public interface UserinfoMapper {
List<Userinfo> getAll(Integer id);
}
数据持久成的实现,mybatis 的固定 xml 格式:
namespace
id
resultType
${id}
<?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.mybatistest.mapper.UserinfoMapper">
<select id="getAll" resultType="com.example.mybatistest.entity.Userinfo">
select * from userinfo where id =${id}
</select>
</mapper>
@Service
public class MybatisServiceImp implements MybatisService {
@Autowired
private UserinfoMapper userinfoMapper;
@Override
public List<Userinfo> getAll(Integer id) {
return userinfoMapper.getAll(id);
}
}
控制器层的实现代码如下:
@RestController
@RequestMapping("/user")
public class MybatisController {
@Autowired
MybatisService mybatisService;
@RequestMapping("/getuser") //因为Windows不区分大小写,所以尽量使用 小写 ,替代:中划线 get-user
public List<Userinfo> getuser(Integer id){
if(id == null){
return null;
}
return mybatisService.getAll(id);
}
}
返回值为 list的时候,填 list中的类型
List<Userinfo> getAll();
<select id="getAll" resultType="com.example.mybatis3.entity.Userinfo">
select * from userinfo
</select>
步骤:
在mapper中声明方法
传递的是对象
int add(Userinfo userinfo);
在 mapper.xml 中 提供 sql实现
赋值的是对象属性
<insert id="add" >
insert into userinfo(username, password, createtime, updatetime)
values(#{username},#{password},#{createTime},#{updateTime})
</insert>
如何拿到 插入实体类对应的 id
<insert id="add" useGeneratedKeys="true" keyProperty="id">
insert into userinfo(username, password, createtime, updatetime)
values(#{username},#{password},#{createTime},#{updateTime})
</insert>
测试:
int upUser(Userinfo userinfo);
<update id="upUser">
update userinfo set username=#{username} where id = #{id}
</update>
int deleteUser(Integer id);
<delete id="deleteUser">
delete from userinfo where id=#{id}
</delete>
<select id="isLogin" resultType="com.example.demo.model.User">
select * from userinfo where username='${name}' and password='${pwd}'
</select>
结论:?于查询的字段,尽量使? #{} 预查询的?式
#{} 当作预处理,填充到 原来的value上
预查询:
like 使? #{} 报错
<select id="findUserByName2" resultType="com.example.demo.model.User">
select * from userinfo where username like '%#{username}%';
</select>
这个是不能直接使? ${}
可以考虑使? mysql 的内置函数 concat() 来处理,实现代码如下:
将 username,% 拼接起来
<select id="findUserByName3" resultType="com.example.demo.model.User">
select * from userinfo where username like concat('%',#{username},'%');
</select>