SpringBoot系列(五)Mybatis整合完整详细版
本文内容纲要:
-SpringBoot系列(五)Mybatis整合
-1.Mybatis简介
-2.项目创建
-3.entity实体类代码
-4.dao层代码
-5.service层代码
-6.serviceImpl层代码
-7.mapper层代码
-8.controller层代码
SpringBoot系列(五)Mybatis整合
1.Mybatis简介
MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的POJOs(PlainOrdinaryJavaObject,普通的Java对象)映射成数据库中的记录。
换句话说,我觉得利用mybatis整合持久层要方便很多,比起以前编写jdbc代码操作数据库的一些连接,简直不要太爽。
2.项目创建
创建一个简单的具有start-web依赖的SpringBoot项目,然后添加mybatis相关的依赖。
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
依赖下载完之后,在yml文件,也可以是properties文件里面配置连接数据库的相关配置。
spring:
datasource:
url:jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=GMT%2B8
username:root
password:123456
driver-class-name:com.mysql.cj.jdbc.Driver
然后我们在数据库mybatis下面创建一个student表
CREATETABLE`student`(
`id`int(10)NOTNULLAUTO_INCREMENTCOMMENT'唯一标识id',
`name`varchar(30)CHARACTERSETutf8COLLATEutf8_binNOTNULLCOMMENT'姓名',
`age`int(3)NOTNULLCOMMENT'年龄',
PRIMARYKEY(`id`)USINGBTREE
)ENGINE=InnoDBAUTO_INCREMENT=2CHARACTERSET=utf8COLLATE=utf8_binROW_FORMAT=Dynamic;
完成项目初始配置。
3.entity实体类代码
/**
*(Student)实体类
*
*@author全栈学习笔记
*@since2020-04-1411:39:10
*/
publicclassStudent{
privatestaticfinallongserialVersionUID=-91969758749726312L;
/**
*唯一标识id
*/
privateIntegerid;
/**
*姓名
*/
privateStringname;
/**
*年龄
*/
privateIntegerage;
}
以上省略了get,以及set方法。
4.dao层代码
packagecom.example.demomybatis.dao;
importcom.example.demomybatis.entity.Student;
importorg.apache.ibatis.annotations.Mapper;
importorg.apache.ibatis.annotations.Param;
importorg.springframework.stereotype.Repository;
importjava.util.List;
/**
*(Student)表数据库访问层
*
*@author全栈学习笔记
*@since2020-04-1411:39:18
*/
@Mapper
@Repository
publicinterfaceStudentDao{
/**
*通过ID查询单条数据
*
*@paramid主键
*@return实例对象
*/
StudentqueryById(Integerid);
/**
*查询指定行数据
*
*@paramoffset查询起始位置
*@paramlimit查询条数
*@return对象列表
*/
List<Student>queryAllByLimit(@Param("offset")intoffset,@Param("limit")intlimit);
/**
*通过实体作为筛选条件查询
*
*@paramstudent实例对象
*@return对象列表
*/
List<Student>queryAll(Studentstudent);
/**
*新增数据
*
*@paramstudent实例对象
*@return影响行数
*/
intinsert(Studentstudent);
/**
*修改数据
*
*@paramstudent实例对象
*@return影响行数
*/
intupdate(Studentstudent);
/**
*通过主键删除数据
*
*@paramid主键
*@return影响行数
*/
intdeleteById(Integerid);
}
代码说明:dao层属于数据访问层,与mybatis的xml文件相互映射,实现SQL语句的功能。
注解说明:在dao层的类需要加上@Mapper的注解,这个注解是mybatis提供的,标识这个类是一个数据访问层的bean,并交给spring容器管理。并且可以省去之前的xml映射文件。在编译的时候,添加了这个类也会相应的生成这个类的实现类。
如果你是用的idea,在serviceImpl中使用@Autowired注入bean的时候,idea会报错,但是不影响运行,报错是因为@mapper不是spring提供的,当需要自动注入这个bean的时候idea不能预检测到这个bean是否可以注入到容器中,不知道新版的idea会不会有这种问题。如果想消除这个报错,你可以在dao层的类上面加上一个@Repository,这个注解是spring提供的,这样就可以预检测到mapper的bean是可以注册到spring容器里面的。
你会发现在代码中,有的接口的参数是带了@Param这个注解的,有的参数是没有这个注解的。如果你只有一个参数,这个注解可要可不要。当你有两个及其以上的注解时,你就需要用这个注解了,不然在对应的xml文件,它分辨不出来这个参数是哪一个就会报错,用这个注解的意思就是说标识这个参数的名称,以便让接受参数的一方更好的找到并利用这个值。
5.service层代码
packagecom.example.demomybatis.service;
importcom.example.demomybatis.entity.Student;
importjava.util.List;
/**
*(Student)表服务接口
*
*@author全栈学习笔记
*@since2020-04-1411:39:19
*/
publicinterfaceStudentService{
/**
*通过ID查询单条数据
*
*@paramid主键
*@return实例对象
*/
StudentqueryById(Integerid);
/**
*查询多条数据
*
*@paramoffset查询起始位置
*@paramlimit查询条数
*@return对象列表
*/
List<Student>queryAllByLimit(intoffset,intlimit);
/**
*新增数据
*
*@paramstudent实例对象
*@return实例对象
*/
Studentinsert(Studentstudent);
/**
*修改数据
*
*@paramstudent实例对象
*@return实例对象
*/
Studentupdate(Studentstudent);
/**
*通过主键删除数据
*
*@paramid主键
*@return是否成功
*/
booleandeleteById(Integerid);
}
代码说明:这是服务层的接口,serviceImpl对应服务层接口的实现。
6.serviceImpl层代码
packagecom.example.demomybatis.service.impl;
importcom.example.demomybatis.entity.Student;
importcom.example.demomybatis.dao.StudentDao;
importcom.example.demomybatis.service.StudentService;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Service;
importjavax.annotation.Resource;
importjava.util.List;
/**
*(Student)表服务实现类
*
*@author全栈学习笔记
*@since2020-04-1411:39:19
*/
@Service("studentService")
publicclassStudentServiceImplimplementsStudentService{
@Autowired
privateStudentDaostudentDao;
/**
*通过ID查询单条数据
*
*@paramid主键
*@return实例对象
*/
@Override
publicStudentqueryById(Integerid){
returnthis.studentDao.queryById(id);
}
/**
*查询多条数据
*
*@paramoffset查询起始位置
*@paramlimit查询条数
*@return对象列表
*/
@Override
publicList<Student>queryAllByLimit(intoffset,intlimit){
returnthis.studentDao.queryAllByLimit(offset,limit);
}
/**
*新增数据
*
*@paramstudent实例对象
*@return实例对象
*/
@Override
publicStudentinsert(Studentstudent){
this.studentDao.insert(student);
returnstudent;
}
/**
*修改数据
*
*@paramstudent实例对象
*@return实例对象
*/
@Override
publicStudentupdate(Studentstudent){
this.studentDao.update(student);
returnthis.queryById(student.getId());
}
/**
*通过主键删除数据
*
*@paramid主键
*@return是否成功
*/
@Override
publicbooleandeleteById(Integerid){
returnthis.studentDao.deleteById(id)>0;
}
}
代码说明:@Service标识这个bean是service层的,也就是服务层,并交给spring容器管理。参数的value属性是这个bean的名称,也可以不写,默认为类名。
这里我们可以说一下,@Resource与@Autowired,前面我们在serviceImpl里面需要用到dao层的方法的时候,不是直接new一个对象,在哪需要就在哪new,而是利用注解,实现自定注入装配,利用spring容器管理这些bean,这样写出来的代码是松耦合的,类之间的耦合度更低,维护性就相对提高了。
@Resource与@Autowired是可以起到一个相同的作用。根据包名就可以看到,他们不是一个包里面的。区别如下:
- @Autowired默认按类型装配,默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false),这个注解是属于spring的,如果我们想使用名称装配可以结合@Qualifier注解进行使用。
- @Resource默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。这个注解属于J2EE的。
7.mapper层代码
所谓的mapper层,就是xml文件,与dao层对应的。
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mappernamespace="com.example.demomybatis.dao.StudentDao">
<resultMaptype="com.example.demomybatis.entity.Student"id="StudentMap">
<resultproperty="id"column="id"jdbcType="INTEGER"/>
<resultproperty="name"column="name"jdbcType="VARCHAR"/>
<resultproperty="age"column="age"jdbcType="INTEGER"/>
</resultMap>
<!--查询单个-->
<selectid="queryById"resultMap="StudentMap">
select
id,name,age
frommybatis.student
whereid=#{id}
</select>
<!--查询指定行数据-->
<selectid="queryAllByLimit"resultMap="StudentMap">
select
id,name,age
frommybatis.student
limit#{offset},#{limit}
</select>
<!--通过实体作为筛选条件查询-->
<selectid="queryAll"resultMap="StudentMap">
select
id,name,age
frommybatis.student
<where>
<iftest="id!=null">
andid=#{id}
</if>
<iftest="name!=nullandname!=''">
andname=#{name}
</if>
<iftest="age!=null">
andage=#{age}
</if>
</where>
</select>
<!--新增所有列-->
<insertid="insert"keyProperty="id"useGeneratedKeys="true">
insertintomybatis.student(name,age)
values(#{name},#{age})
</insert>
<!--通过主键修改数据-->
<updateid="update">
updatemybatis.student
<set>
<iftest="name!=nullandname!=''">
name=#{name},
</if>
<iftest="age!=null">
age=#{age},
</if>
</set>
whereid=#{id}
</update>
<!--通过主键删除-->
<deleteid="deleteById">
deletefrommybatis.studentwhereid=#{id}
</delete>
</mapper>
这里面对应了SQL的增删改查语句,然后在dao层的方法,对应了每一个SQL语句,这里面SQL语句的id,对应dao层的每一个接口方法。
默认的配置是检测不到这个xml文件的,然后我们需要做以下的配置。
我把xml文件放在resources文件夹下面的dao文件夹下面。
然后我们在yml里面加上以下配置。
mybatis:
type-aliases-package:com.example.demomybatis.entity
mapper-locations:classpath:dao/*Mapper.xml
8.controller层代码
controller层的代码我们是用来测试的,一般也是返回数据给前端的地方。
packagecom.example.demomybatis.controller;
importcom.example.demomybatis.entity.Student;
importcom.example.demomybatis.service.StudentService;
importorg.springframework.web.bind.annotation.*;
importjavax.annotation.Resource;
/**
*(Student)表控制层
*
*@author全栈学习笔记
*@since2020-04-1411:39:20
*/
@RestController
@RequestMapping("student")
publicclassStudentController{
/**
*服务对象
*/
@Resource
privateStudentServicestudentService;
/**
*通过主键查询单条数据
*
*@paramid主键
*@return单条数据
*/
@GetMapping("selectOne")
publicStudentselectOne(Integerid){
returnthis.studentService.queryById(id);
}
}
代码说明:@RestController这个注解等效于@Controller加上@ResponseBody,添加了这个注解就是让这个类返回json串,这是spring内部提供的json解析。@RequesMapping注解是一个地址映射的注解。就是根据这个地址,可以找到这个方法,这个类,注解到类上,就相当于方法的父类地址。
测试一下。我们先在数据库里面添加一条数据。
insertintostudent(id,name,age)VALUES(2,'全栈学习笔记',22)
然后在浏览器输入:localhost:8088/student/selectOne?id=2就可以看到我们拿到的数据了。端口配置根据自己项目而定。
好了,这一期的mybatis整合就到这里,有兴趣的可以wxsearch全栈学习笔记,给个关注,精彩美文每天推送到你的手中!
本文内容总结:SpringBoot系列(五)Mybatis整合,1.Mybatis简介,2.项目创建,3.entity实体类代码,4.dao层代码,5.service层代码,6.serviceImpl层代码,7.mapper层代码,8.controller层代码,
原文链接:https://www.cnblogs.com/swzx-1213/p/12698222.html