目录
MyBatis 是什么?
配置 MyBatis 开发环境
方法一:创建项目时添加依赖
方法二:创建项目后添加依赖
配置连接字符串
配置 MyBatis 中的 XML 路径
业务代码
添加实体类
添加 Service
添加 Controller
增加,删除和修改操作
增加用户操作
修改用户操作
删除用户操作
参数占位符 #{} 和 ${}
like 查询(模糊匹配)
多表查询
下期我们继续了解更多关于mybatis框架的知识,喜欢就关注我吧~
MyBatis 是什么?
MyBatis 是一款款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 去除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
一句话概括就是 MyBatis 是更简单完成程序和数据库交互的工具
配置 MyBatis 开发环境
方法一:创建项目时添加依赖
首先我们创建一个新项目,如下图所示:
然后点击next
最后我们就创建好了一个项目
如果创建好了一个项目想添加mybatis依赖怎么办?
别急,我们还有planB
方法二:创建项目后添加依赖
我们先在插件(settings)里面下载 EditStarters,如下图所示:
EditStarters 插件的使法:
点击蓝色框框:
搜索“MyBatis”添加即可:
配置连接字符串
在 application.yml 添加如下内容:
# 数据库连接配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/mycnblog?characterEncoding=utf8&useSSL=false
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
配置 MyBatis 中的 XML 路径
MyBatis 的 XML 中保存是查询数据库的具体操作 SQL,配置如下:
# 配置 mybatis xml 的⽂件路径,在 resources/mapper 创建所有表的 xml ⽂件
mybatis:
mapper-locations: classpath:mapper/**Mapper.xml
把这段代码放在配置连接字符串的下面
业务代码
添加实体类
先添加用户的实体类:
import lombok.Data;
import java.util.Date;
@Data
public class User {
private Integer id;
private String username;
private String password;
private String photo;
private Date createTime;
private Date updateTime;
}
添加 mapper 接口:
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface UserMapper {
public List<User> getAll();
}
添加 UserMapper.xml:
在这里建一个包,再创建一个xml文件:
数据持久成的实现,mybatis 的固定 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.mybatisdemo1.mapper.UserMapper">
</mapper>
在xml文件里面添加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.mybatisdemo1.mapper.UserMapper">
<select id="getAll" resultType="com.example.mybatisdemo1.entity.User">
select * from userinfo
</select>
</mapper>
mapper 标签:需要指定 namespace 属性,表示命名空间,值为 mapper 接口的全限定名,包括全包名.类名。
查询标签:是用来执行数据库的查询操作的
id:是和 Interface(接口)中定义的方法名称⼀样的,表示对接口的具体实现方法。
resultType:是返回的数据类型,也就是开头我们定义的实体类。
添加 Service
服务层实现代码如下:
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class UserService {
@Resource
private UserMapper userMapper;
public List<User> getAll() {
return userMapper.getAll();
}
}
添加 Controller
控制器层的实现代码如下:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
@RestController
@RequestMapping("/u")
public class UserController {
@Resource
private UserService userService;
@RequestMapping("/getall")
public List<User> getAll(){
return userService.getAll();
}
}
以上代码写完,整个 MyBatis 的查询功能就实现完了,接下来使用 postman 来测试⼀下
增加,删除和修改操作
下面我们来实现⼀下用户的增加、删除和修改的操作,对应使用 MyBatis 的标签如下:
<insert>标签:插入语句
<update>标签:修改语句
<delete>标签:删除语句
增加用户操作
controller 实现代码:
@RequestMapping(value = "/add",method = RequestMethod.POST)
public Integer add(@RequestBody User user){
return userService.getAdd(user);
}
在mapper接口里面增加一个抽象方法:
Integer add(User user);
在mapper.xml里面增加增加sql语句
<insert id="add">
insert into userinfo(username,password,photo,state)
values(#{username},#{password},#{photo},1)
</insert>
在postman中添加一个json格式的数据:
默认情况下返回的是受影响的行数
特殊的添加:返回自增 id
controller 实现代码:
@RequestMapping(value = "/add2", method = RequestMethod.POST)
public Integer add2(@RequestBody User user) {
userService.getAdd2(user);
return user.getId();
}
在usermapper里面增加add2()方法:
Integer add2(User user);
mapper.xml 实现如下sql语句:
<!-- 返回⾃增id -->
<insert id="add2" useGeneratedKeys="true" keyProperty="id">
insert into userinfo(username,password,photo,state)
values(#{username},#{password},#{photo},1)
</insert>
useGeneratedKeys:这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键,默认值为false
keyColumn:设置生成键值在表中的列名
keyProperty:指定能够唯⼀识别对象的属性,MyBatis 会使用 getGeneratedKeys 的返回值或 insert 语句的 selectKey 子元素设置它的值,默认值:未设置(unset)。如果生成列不止⼀个,可以用逗号分隔多个属性名称
使用 postman 返回结果:
修改用户操作
controller添加修改密码方法:
@RequestMapping("/updatePassword")
public int update(Integer id, String password, String newPassword) {
return userService.updatePassword(id,password,newPassword);
}
在usermapper接口里面定义一个update方法:
Integer updatePassword(Integer id, String password,String newPassword);
服务端service代码:
public Integer updatePassword(Integer id, String password, String newPassword){
return userMapper.updatePassword(id,password,newPassword);
}
mapper.xml 实现代码(只有原来密码正确和id正确才能修改密码):
<update id="updatePassword" >
update userinfo set password=#{newPassword} where id=#{id} and password=#{password}
</update>
用postman进行测试:
注意:返回1代表受影响的行数为1
删除用户操作
controller添加删除方法:
@RequestMapping("/delete")
public Integer delById(Integer id){
return userService.delById(id);
}
在usermapper接口里面定义一个update方法:
Integer delById(Integer id);
服务端service代码:
public Integer delById(Integer id){
return userMapper.delById(id);
}
mapper.xml 实现代码:
<delete id="delById" parameterType="java.lang.Integer">
delete from userinfo where id=#{id}
</delete>
用postman进行测试:
参数占位符 #{} 和 ${}
#{}:预编译处理。
${}:字符直接替换。
预编译处理是指:MyBatis 在处理#{}时,会将 SQL 中的 #{} 替换为?号,使用 PreparedStatement 的 set 方法来赋值。直接替换:是MyBatis 在处理 ${} 时,就是把 ${} 替换成变量的值。
like 查询(模糊匹配)
不能直接使用 ${},可以使用 mysql 的内置函数 concat() 来处理,实现代码如下:
<select id="findUserByName3" resultType="com.example.demo.model.User">
select * from userinfo where username like concat('%',#{username},'%');
</select>
多表查询
如果是增、删、改返回搜影响的行数,那么在 mapper.xml 中是可以不设置返回的类型的
然而即使是最简单查询用户的名称也要设置返回的类型,否则会报错
对于查询标签来说至少需要两个属性:
id 属性:用于标识实现接口中的那个方法;
结果映射属性:结果映射有两种实现标签: <resultMap> 和 <resultType> 。
如下图所示: