1. 整合mybatis
引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mysql的驱动依赖 3.-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--mybatis和springboot整合的jar.-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
配置文件
spring.application.name=qy174-springboot-mybatis
#数据源的信息
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/qy174-springboot?serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root
#配置mybatis映射文件的路径
mybatis.mapper-locations=classpath:mapper/*.xml
实体类
@Data
public class User {
private Integer userid;
private String username;
private String sex;
private Integer age;
}
dao
public interface UserDao {
int insert(User user);
int delete(Integer id);
int update(User user);
User select(Integer id);
List<User> selectAll();
}
映射文件
<?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.ykq.dao.UserDao">
<insert id="insert">
insert into user(username,age,sex) values(#{username},#{age},#{sex})
</insert>
<update id="update">
update user set username=#{username},age=#{age},sex=#{sex} where userid=#{userid}
</update>
<delete id="delete">
delete from user where userid=#{id}
</delete>
<select id="selectById" resultType="com.ykq.entity.User">
select * from user where userid=#{id}
</select>
<select id="selectAll" resultType="com.ykq.entity.User">
select * from user
</select>
</mapper>
service
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public R selectAll() {
List<User> users = userDao.selectAll();
return new R(200,"查询成功",users);
}
@Override
public R selectById(Integer id) {
User user = userDao.selectById(id);
if(user==null){
return new R(500,"查询失败",null);
}else{
return new R(200,"查询成功",user);
}
}
@Override
public R insert(User user) {
int i = userDao.insert(user);
if(i>0){
return new R(200,"添加成功",null);
}
return new R(500,"添加失败",null);
}
@Override
public R update(User user) {
int update = userDao.update(user);
if (update>0){
return new R(200,"修改成功",null);
}
return new R(500,"修改失败",null);
}
@Override
public R delete(Integer id) {
int i = userDao.delete(id);
if (i>0){
return new R(200,"删除成功",null);
}
return new R(500,"删除失败",null);
}
}
controller代码
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/list")
public R list() {
return userService.selectAll();
}
@GetMapping("/getById")
public R getById(Integer id) {
return userService.selectById(id);
}
@DeleteMapping("/deleteById")
public R deleteById(Integer id) {
return userService.delete(id);
}
@PostMapping("/insert")
public R insert(@RequestBody User user) {
return userService.insert(user);
}
@PutMapping("/update")
public R update(@RequestBody User user) {
return userService.update(user);
}
}
常见错误
没有为dao生成代理实现类
解决: 生成代理实现类
mybatis和springboot整合的版本太高
2. springboot整合swagger2
2.1 什么是swagger2
Swagger2 是一个规范和完整的框架,用于生成、描述、调用和可视化Restful风格的web服务,现在我们使用spring boot 整合它。
作用:
- 接口的文档在线自动生成;
- 功能测试;
swagger2它就是在线生成接口文档的,而且还可以对接口进行测试。
2.2 为什么需要使用swagger2
Swagger2是一个流行的工具,它通过自动从代码中提取注解来生成易于理解的API文档。这些文档不仅清晰展示了API的功能、如何使用它们以及可能的响应,还允许用户直接在网页上测试这些API。
Swagger2提供了一个统一和标准化的方式来描述API,所以它帮助开发者无论在团队协作还是个人学习时都能快速掌握API的使用,同时提高了开发效率和API的可用性。简而言之,Swagger2就像一个智能的API说明书,让复杂的技术细节变得简单易懂。
2.3 如何使用swagger2
<!--引入swagger2依赖-->
<dependency>
<groupId>com.spring4all</groupId>
<artifactId>swagger-spring-boot-starter</artifactId>
<version>1.9.1.RELEASE</version>
</dependency>
<!--图形化依赖-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>1.9.6</version>
</dependency>
创建swagger2配置类
@Configuration
public class SwaggerConfig {
//创建swagger实例
@Bean
public Docket docket() {
Docket docket=
new Docket(DocumentationType.SWAGGER_2)
.apiInfo(getInfo())//设置接口文档的信息
.select()
.apis(RequestHandlerSelectors.basePackage("com.ykq.controller")) //指定为那些路径下得到类生成接口文档
.build()
;
return docket;
}
private ApiInfo getInfo(){
Contact DEFAULT_CONTACT = new Contact("lcy", "http://www.lcy.com", "[email protected]");
ApiInfo DEFAULT = new ApiInfo("用户管理系统API", "该系统中的接口专门操作用户的", "v1.0", "http://www.baidu.com",
DEFAULT_CONTACT, "漫动者", "http://www.aaa.com", new ArrayList<VendorExtension>());
return DEFAULT;
}
}
开启swagger的注解驱动
访问swagger接口文档
第一种: http://localhost:8080/swagger-ui.html
第二种: http://localhost:8080/doc.html
2.4 swagger2常用注解
1. @Api(tags=“”): 使用在接口类上,对接口类的说明
2. @ApiOperation(value=""):接口方法上,对接口方法的说明
3. @ApiImplicitParams(
@ApiImplicitParam(name=“参数名”,value="参数说明",require="是否必写",dataType="数据类型")
) : 接口方法所有参数的概述
4. @ApiModel(value=""): 使用在实体类上,对实体类的说明
5. @ApiModelProperty(value=""):使用在实体类属性上,对属性的说明
3. springboot整合定时器
在指定的时间执行相应的业务代码。场景: oss修改图片时,存在一个冗余图片。定时删除冗余图片。
比如: 下单。30分钟未支付取消订单。 比如: 新用户注册成功后,7天发送问候语。
引入定时器依赖
<!--引入 定时器 依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
创建一个定时业务类
@Configuration
public class MyQuartzConfig {
//定时业务代码
//定义定时规则 cron="定时器规则"
@Scheduled(cron = "0/5 * * * * ?")
public void show(){
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
//发生短信 或者删除oss冗余文件 或者取消订单
}
}
开启定时器注解驱动
cron:表达式
生成cron表达式的网站:https://cron.ciding.cc/
4. springboot整合mybatis-plus
4.1 概述
MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
4.2 特点
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作。
- 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
- 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
- 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
- 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
- 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
- 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
- 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询。
- 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
- 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
- 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
4.3 准备条件
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`
(
id BIGINT NOT NULL COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (id)
);
DELETE FROM `user`;
INSERT INTO `user` (id, name, age, email) VALUES
(1, 'Jone', 18, '[email protected]'),
(2, 'Jack', 20, '[email protected]'),
(3, 'Tom', 28, '[email protected]'),
(4, 'Sandy', 21, '[email protected]'),
(5, 'Billie', 24, '[email protected]');
4.4 使用Mp
<!--加入mybatis-plus的依赖 不用在加入mybatis的依赖,mybatis-plus包含-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.7</version>
</dependency>
配置文件
spring.application.name=qy174-springboot-mp
#数据库
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mp?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root
#映射文件路径
mybatis-plus.mapper-locations=classpath*:mapper/*.xml
#配置日志--sql日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
实体类
@Data
public class User {
@TableId(value="id")
private Integer id;
private String name;
private Integer age;
private String email;
}
mapper
public interface UserMapper extends BaseMapper<User> {
}
为mapper生成代理实现类
4.5 测试
4.5.1 根据id查询
@SpringBootTest
class Qy174SpringbootMpApplicationTests {
@Autowired
private UserMapper userMapper;
/**
* 如果出现实体类和表名不一致。@TableName
* 如果出现实体类属性名和字段名不一致。@TableField
*/
@Test
void testSelectById() {
User user = userMapper.selectById(1);
System.out.println(user);
}
}
4.5.2 添加
@Test
void testInsert(){
//添加一条记录
// User user=new User(null,"刘帅鹏",19,"[email protected]");
// //添加--把生成的主键也会赋值给对象中主键属性
// System.out.println("填进去:"+user);
// int row = userMapper.insert(user);
// System.out.println(row);
// System.out.println("填进去后:"+user);
//批量添加
// List<User> list=new ArrayList<>();
// list.add(new User(null,"李硕",18,"[email protected]"));
// list.add(new User(null,"李梦朝",19,"[email protected]"));
// list.add(new User(null,"秦桂祥",19,"[email protected]"));
// list.add(new User(null,"刘瑞",17,"[email protected]"));
// List<BatchResult> insert = userMapper.insert(list);
//如果有id则修改 没有则添加
User user=new User(2,"刘帅鹏",19,"[email protected]");
userMapper.insertOrUpdate(user);
}
4.5.3 删除
@Test
public void testDelete(){
//根据主键删除
// int i = userMapper.deleteById(1);
// System.out.println(i);
//批量删除
// int i = userMapper.deleteByIds(Arrays.asList(1, 2, 3));
// System.out.println(i);
//根据条件删除
// Wrapper:条件类对象. 每个条件被封装成对应的方法
UpdateWrapper<User> wrapper=new UpdateWrapper<>();
// wrapper.like("uname","刘"); //小于
// wrapper.le("age",19);
// wrapper.in("uname","jone","Tom");
// wrapper.ne("age",19);
// wrapper.between("age",19,35);
wrapper.like("uname","六").or().gt("age",19);
userMapper.delete(wrapper);
}
4.5.4 更新
@Test
public void testUpdate(){
//根据主键更新一条数据
// User user=new User(1,"刘帅鹏",19,"[email protected]");
// int i = userMapper.updateById(user);
// System.out.println(i);
//批量更新
// List<User> users=new ArrayList<>();
// Collections.addAll(users,
// new User(1,"张学友",19,"118"),
// new User(2,"闫克起",17,"120"),
// new User(3,"刘德华",110,"130"));
// userMapper.updateById(users);
//根据其他条件更新
User user=new User();
user.setAge(110);
userMapper.update(user,new UpdateWrapper<User>().eq("uname","刘德华"));
}
4.5.5 查询
@Test
public void testSelect(){
UserVo userVo =new UserVo();
userVo.setName("李");
userVo.setMin(9);
QueryWrapper<User> wrapper=new QueryWrapper<>();
//指定查询的列
if(StringUtils.isNotBlank(userVo.getName())){
wrapper.like("uname",userVo.getName());
}
if(userVo.getMin()!=null){
wrapper.ge("age",userVo.getMin());
}
if(Objects.nonNull(userVo.getMax())){
wrapper.le("age",userVo.getMax());
}
List<User> users = userMapper.selectList(wrapper);
users.stream().forEach(System.out::println);
}
4.5.6 分页查询
//你没有使用mp的分页拦截器
@Test
public void testSelectPage(){
//分页对象
Page<User> page=new Page<>(2,2);
//查询条件对象
Page<User> userPage = userMapper.selectPage(page, null);
System.out.println("总页数:"+userPage.getPages());
System.out.println("当前页的记录:"+userPage.getRecords());
System.out.println("总条数:"+userPage.getTotal());
}
@Configuration
public class MybatisPlusConfig {
/**
* 添加分页插件
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
分页都使用mp的分页插件 不要在使用pageHelper 存在bug.
4.5.7 连表分页条件查询
mp 它只能用于单表的CRUD操作,不能用于链表操作。 但是我想连表时使用mp的分页插件,以及条件对象
查询用户信息包含班级信息
dao
@Repository
public interface UserDao extends BaseMapper<User> {
IPage<User> selectByPage(IPage<User> page, @Param("ew") Wrapper<User> queryWrapper);
}
映射文件
<?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.qy174springbootmp.mapper.UserMapper">
<resultMap id="BaseMapping" type="com.example.qy174springbootmp.entity.User">
<id property="id" column="id" javaType="java.lang.Integer"/>
<result property="name" column="uname" javaType="java.lang.String"/>
<result property="age" column="age" javaType="java.lang.Integer"/>
<result property="email" column="email" javaType="java.lang.String"/>
<!--多对一的标签-->
<association property="clazz" javaType="com.example.qy174springbootmp.entity.Clazz">
<id property="cid" column="cid" javaType="java.lang.Integer"/>
<result property="cname" column="cname" javaType="java.lang.String"/>
</association>
</resultMap>
<select id="selectByPage" resultMap="BaseMapping">
select * from tbl_user u join tbl_clazz c on u.class_id=c.cid
${ew.customSqlSegment}
</select>
</mapper>
测试
@Test
public void testSelectByPage(){
Page<User> page=new Page<>(1,2);
QueryWrapper<User> wrapper=new QueryWrapper<>();
// wrapper.like("uname","张");
IPage<User> userPage = userMapper.selectByPage(page, wrapper);
System.out.println("总页数:"+userPage.getPages());
System.out.println("当前页的记录:"+userPage.getRecords());
System.out.println("总条数:"+userPage.getTotal());
}
标签:springboot,框架,第三方,user,id,new,com,public,User
From: https://blog.csdn.net/m0_59933868/article/details/140491006