- Spring Boot学习日志(一)Hello World
- Spring Boot学习日志(二)JPA操作Mysql
- Spring Boot学习日志(三)再谈Jpa
- Spring Boot学习日志(四)使用Mybatis
- Spring Boot学习日志(五)结合Swagger管理接口
前言
之前简单介绍了一下Soring Boot Jpa操作Mysql数据库的相关方法,但是在使用Jpa的时候总有写不习惯,比如:复杂的逻辑使用Jpa的规则生成Sql总觉得很麻烦,如果直接在 @Query里面写Sql总是不那么的“舒服”,下面开始关于MyBatis相关的使用。
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
配置文件application.properties
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&allowMultiQueries=true&&useSSL=false
spring.datasource.username = root
spring.datasource.password = root
#mapper扫描范围
mybatis.mapperLocations=classpath:mapper/**/*.xml
#entity位置
mybatis.typeAliasesPackage=com.example.mybatis_demo.entity
使用mybatis有两种方法,一种是使用注解的方式,一种是使用xml配置文件的方式,这里选择xml配置文件的形式介绍。
mybatis.mapperLocations:设置xml文件的位置,这里xml里写sql语句
mybatis.typeAliasesPackage:设置实体类所在位置
测试表结构
CREATE TABLE `tb_user` (
`id` int(11) NOT NULL,
`username` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL,
`group` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
CREATE TABLE `tb_group` (
`id` varchar(20) DEFAULT NULL,
`group` int(11) NOT NULL DEFAULT '0',
`groupname` varchar(20) CHARACTER SET utf8mb4 DEFAULT NULL,
PRIMARY KEY (`group`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
创建实体类
public class User {
private Integer id;
private String userName;
private Integer group;
省略get和set方法
}
创建Mybatis配置文件
由于spring在启动时不知道mapper接口位置在什么地方,所以要做一个设置告诉spring程序mapper所在的位置,数据源就会自动注入到sqlSessionFactory中
@Configuration
public class MyBatisMapperConfig {
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
mapperScannerConfigurer.setBasePackage("com.example.mybatis_demo.mapper");
return mapperScannerConfigurer;
}
}
创建Mapper接口
public interface UserMapper {
/**
* 查找用户
* @param user
* @return
*/
List<User> queryUser(User user);
/**
* 添加用户
* @param user
* @return
*/
Integer insertUser(User user);
/**
* 更新用户信息
* @param user
* @return
*/
Boolean updateUser(User user);
/**
* 删除用户
* @param user
* @return
*/
Integer deleteUser(User user);
}
创建Mapper对应的sql
上边的操作已经创建了用户相关的增改查,但是仅仅创建了接口,还没有具体的实现,具体的实现怎么做呢?
#mapper扫描范围
mybatis.mapperLocations=classpath:mapper/**/*.xml
配置文件里已经设定了mapper的扫描范围,在这里创建相应的.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.mybatis_demo.mapper.UserMapper">
<select id="queryUser" resultType="com.example.mybatis_demo.entity.User">
select * from tb_user
<where>
<if test="id!= null ">
id =#{id}
</if>
</where>
</select>
<insert id="insertUser" parameterType="com.example.mybatis_demo.entity.User">
insert into tb_user(
id,
username,
groupid
)
values(
#{id},
#{userName},
#{groupid}
)
</insert>
<update id="updateUser" parameterType="com.example.mybatis_demo.entity.User">
UPDATE tb_user
<set>
<if test="userName!=null and userName!='' ">
username= #{userName},
</if>
<if test="groupid!=null">
groupid= #{groupid},
</if>
</set>
WHERE id= #{id};
</update>
<delete id="delete" parameterType="int">
delete from tb_user where id=#{id}
</delete>
</mapper>
需要注意的地方有:
.xml配置文件
<mapper namespace="com.example.mybatis_demo.mapper.UserMapper">
这里写的是之前创建的接口的地址,地址要写全(包名+接口名)
resultType="com.example.mybatis_demo.entity.User"
sql查询之后数据返回类型
parameterType="com.example.mybatis_demo.entity.User"
sql添加或者修改返回操作后的实体
parameterType="int"
sql删除数据之后返回操作成功的个数
<set>
<if test="username!=null and username!='' ">
username= #{username},
</if>
<if test="group!=null">
group= #{group},
</if>
</set>
#{userName}表示mapper接口传递过来的User类的userName属性的值
这里因为username是String类型,所以要判断username不为null并且不为空
而group是Integer,只要判断是否为空就可以了
编写控制器
@RestController
@RequestMapping(value = "/user")
public class UserController {
@Autowired
private UserMapper mapper;
@RequestMapping(value = "/list",method = RequestMethod.GET)
public Object queryUser(User user) {
return mapper.queryUser(user);
}
@RequestMapping(value = "/insert",method = RequestMethod.GET)
public Object insertUser(User user) {
return mapper.insertUser(user);
}
@RequestMapping(value = "/update",method = RequestMethod.GET)
public Object updateUser(User user) {
return mapper.updateUser(user);
}
@RequestMapping(value = "/delete",method = RequestMethod.GET)
public Object deleteUser(User user) {
return mapper.deleteUser(user);
}
}
这里的UserMapper和Jpa一样,无需实例化,只需添加 @Autowired注解就可以使用,mybatis会自动运行.xml文件里的sql语句。
测试
和上一章一样,数据库理有三条数据如下所示
先测试一下检索,如果不加参数,会检索出所有数据
http://127.0.0.1:8080/user/list
可以看到和预期一样,三条数据都被检索出来了。
再测试一下条件检索
http://127.0.0.1:8080/user/list?id=1
只检索出来了一条数据,也是符合预期的
再测试一下添加数据
http://127.0.0.1:8080/user/insert?id=4&userName=测试&groupid=2
可以看到数据已经添加进去了
更新数据
http://127.0.0.1:8080/user/update?id=4&groupid=3
删除数据
http://127.0.0.1:8080/user/delete?id=4
结果和过程大致相同,就不再一一描述