本篇文章为你整理了SpringBoot(四)()的详细内容,包含有 SpringBoot(四),希望能帮助你了解 SpringBoot(四)。
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/kh96_ssm_airms?useUnicode=true characterEncoding=utf-8 useSSL=false serverTimezone=GMT
username: root
password: root
# mybatis 核心配置
mybatis:
configuration:
map-underscore-to-camel-case: true # 下划线 映射 驼峰
mapper-locations: classpath:mybatis/mapper/*.xml # 自定义mapper映射路径
# config-location: classpath:mybatis-config.xml # mysql配置文件
1.2 实体类
@Data
public class Quality {
//编号
private Integer id;
//地区id
private Integer did;
//检测时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone =" GMT+8")
private Date monitorTime;
//pm10
private Integer pm10;
//pm25
private Integer pm25;
//监测站
private String monitorStation;
//修改时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone =" GMT+8")
private Date lastModifyTime;
1.3 mapper 和 service
1.3.1 QualityMapper
public interface QualityMapper {
//根据空气质量编号,修改空质量
Integer updateQualityById(Quality qualityForm);
1.3.2 QualityMapper.xml
!--
根据空气质量编号,修改空质量
Integer updateQualityById(Quality qualityForm);
update id="updateQualityById"
update air_quality
set
if test="id != null" `id` = #{id}, /if
if test="did != null" `did` = #{did}, /if
if test="monitorTime != null" `monitor_time` = #{monitorTime}, /if
if test="pm10 != null" `pm10` = #{pm10}, /if
if test="pm25 != null" `pm25` = #{pm25}, /if
if test="monitorStation != null" `monitor_station` = #{monitorStation}, /if
if test="lastModifyTime != null" `last_modify_time` = #{lastModifyTime}, /if
/set
where `id` = #{id}
/update
1.3.3 service
//接口
public interface QualityService {
boolean modifyQualityById(Quality qualityForm);
//实现类
@Service
public class QualityServiceImpl implements QualityService {
@Autowired
private QualityMapper qualityMapper;
@Override
public boolean modifyQualityById(Quality qualityForm) {
return qualityMapper.updateQualityById(qualityForm)
1.4 测试
1.4.1 控制层
@Slf4j
@RestController
public class AirQualityController {
@Autowired
private QualityService qualityService;
//根据空气质量编号,修改空质量,使用xml映射文件
@PostMapping("/modQuality")
public Map String,String testModifyQualityMapperXml(@RequestBody Quality qualityForm){
//返回集合
Map String,String returnMap = new HashMap ();
//调用业务接口,修改空气详情
if(qualityService.modifyQualityById(qualityForm)){
returnMap.put("code","200");
returnMap.put("msg","Success");
return returnMap;
returnMap.put("code","9999");
returnMap.put("msg","Fail");
return returnMap;
1.4.2 Postman 测试
测试:
测试结果:
2、逆向工程 better-mybatis-generator 插件
2.1 下载插件 better-mybatis-generator
2.2 自动生成代码
2.2.1 idea连接数据库
2.2.2 生成代码
2.2.2.1 选中表,右键点击 mybatis-gengrate
2.2.2.2 生成代码 设置
生成的代码:
2.3 测试
2.3.1 service
2.3.1.1 接口
public interface AirQualityService {
//根据条件查询空气质量列表
List AirQuality getQualityListByExample(AirQualityExample airQualityExample);
2.3.1.2 实现类
@Service
public class AirQualityServiceImpl implements AirQualityService {
@Autowired(required = false)
private AirQualityMapper airQualityMapper;
@Override
public List AirQuality getQualityListByExample(AirQualityExample airQualityExample) {
return airQualityMapper.selectByExample(airQualityExample);
2.3.1 测试代码
@GetMapping("/airQualities")
public List AirQuality testAirQualityListUseBackward(){
log.info("------ 根据 查询条件,查询空气质量的列表 --------");
//创建查询条件对象
AirQualityExample airQualityExample = new AirQualityExample();
//如果需要去重,增加条件
airQualityExample.setDistinct(true);
//如果需要排序,增加排序条件
airQualityExample.setOrderByClause(" id desc ");
//添加自定义查询 条件,监测站名称中包含检测的
AirQualityExample.Criteria criteria = airQualityExample.createCriteria();
//criteria.andMonitorStationLike("%"+monitorStation+"%");
criteria.andMonitorStationLike("%监测%");
//区域编号 大于1
//criteria.andDidGreaterThan(1);
//区域编号在指定列表中
//criteria.andDidIn(Arrays.asList(1,2,3,4,5));
//增加or的查询条件
AirQualityExample.Criteria criteriaOr = airQualityExample.createCriteria();
criteriaOr.andPm10GreaterThan(100);
//拼接or的查询条件
airQualityExample.or(criteriaOr);
//如果需要分页,增加分页参数 limit ${offset}, ${limit}
//起始行 (偏移量参数)
airQualityExample.setOffset(2l);
//返回数据量
airQualityExample.setLimit(5);
//调用业务接口,查询空气质量列表
List AirQuality qualityListByExample = airQualityService.getQualityListByExample(airQualityExample);
return qualityListByExample;
2.3.2 测试结果:
2.4 分析查询条件对象
2.4.1 基本查询条件
2.4.2 字段上的查询条件
2.5 分析 创建 xxxExample.Criteria 自定义查询条件
protected List Criteria oredCriteria; //oredCriteria 是一个 Criteria 的 集合
//创建条件类 方法
public Criteria createCriteria() {
Criteria criteria = createCriteriaInternal();
if (oredCriteria.size() == 0) {
oredCriteria.add(criteria); // 创建第一个Criteria的时候会自动加入集合中
return criteria;
//or 拼接 条件 方法
public void or(Criteria criteria) {
oredCriteria.add(criteria); //其他Criteria 条件,调用方法拼接时 也会 动加入集合中
3、JPA
3.1 JPA 配置
# jpa 核心配置
spring:
jpa:
show-sql: true # 显示sql查询
hibernate:
ddl-auto: update #如果不存在,就新建,如果存在只更新
3.2 测试
3.2.1 实体 bean
3.2.1.1 实体类
注意:
1、如果数据库没有该表会自动生成该表;
2、如果该表已经存在,也需要填写这些注解信息,要不然会出现实体跟数据库不对应的错误;
@SuppressWarnings("all") //会爆红不过没有事,抑制警告就好
@Data
@Entity
@Table(name = "air_user",catalog = "kh96_ssm_airms")
//指定jpa建表的表名,如果指定,默认使用类名作为表名,catalog是指定数据库实例名
public class AirUser {
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
//用户名
@Column(name = "name",length = 32)
private String name;
//密码
@Column(name = "pwd",length = 32)
private String pwd;
//手机号
@Column(name = "tel",length = 11)
private String tel;
3.2.1.2 生成的表
启动项目;
3.2.2 AirUserRepository
public interface AirUserRepository extends JpaRepository AirUser,Integer {
3.2.3 service
3.2.3.1 接口
public interface AirUserService {
//@description : 根据用户编号,查询用户详情
AirUser getAirUserById(Integer id);
3.2.3.2 实现类
@Service
public class AirUserServiceImpl implements AirUserService {
@Autowired
private AirUserRepository airUserRepository;
@Override
public AirUser getAirUserById(Integer id) {
return airUserRepository.findOne(id);
3.2.4 测试代码
@RestController
public class AirQualityController {
@Autowired
private AirUserService airUserService;
@GetMapping("/airUser")
public AirUser AirUserTestAirUserUserJPA(@RequestParam("Id") Integer Id){
return airUserService.getAirUserById(Id);
3.2.5 测试结果
3.3 分页条件查询
3.3.1 service
3.3.1.1 接口
public interface AirUserService {
//根据 name 模糊查询,根据 tel 精确查询 ,分页查询 用户列表
List AirUser getAirUsersByPage(String name,String tel,Integer pageNo,Integer pageSize);
3.3.1.2 实现类
matching = matching.withMatcher("name", matcher - matcher.contains());
matching = matching.withMatcher("tel",matcher - matcher.exact());
Page AirUser airUserPage = airUserRepository.findAll(airUserExample, pageRequest);
airUserPage 可以获取,符合条件的总条数,总页数,分页后的数据
@Override
public List AirUser getAirUsersByPage(String name, String tel, Integer pageNo, Integer pageSize) {
//创建查询实体对象
AirUser airUserForm = new AirUser();
airUserForm.setName(name);
airUserForm.setTel(tel);
//创建匹配器,组装查询条件
ExampleMatcher matching = ExampleMatcher.matching();
//注意:propertyPath 实体属性
//注意这里添加一个条件后一点过要重新接收返回的 ExampleMatcher 否者条件没有添加进去
matching = matching.withMatcher("name", matcher - matcher.contains());// 模糊查询name
matching = matching.withMatcher("tel",matcher - matcher.exact()); //精确查询电话
//创建条件查询对象,放入 查询实体 和 匹配器
Example AirUser airUserExample = Example.of(airUserForm,matching);
//一步到位,简洁方便 推荐
// Example AirUser airUserExample = Example.of(airUserForm, ExampleMatcher.matching()
// .withMatcher("name", matcher - matcher.contains())
// .withMatcher("tel", matcher - matcher.exact()));
//定义排序规则
Sort.Order order = new Sort.Order(Sort.Direction.DESC, "id");
//sort 对象封装排序规则
Sort sort = new Sort(order);
//分页对象 @param page zero-based page index. 所以我们的页码需要减1 处理
//放入 分页参数 和排序规则
PageRequest pageRequest = new PageRequest(pageNo - 1, pageSize,sort);
//通过条件对象 和 分页对象 分页条件 查询
Page AirUser airUserPage = airUserRepository.findAll(airUserExample, pageRequest);
// 查询返回的分页对象中,可以获取符合条件的所有条数
// long totalCount = airUserPage.getTotalElements();
//可以获取总页数
// int totalPages = airUserPage.getTotalPages();
//获取分页条件查询的 数据
List AirUser airUserList = airUserPage.getContent();
return airUserList;
3.3.2 测试
3.2.2.1 请求
//根据 name 模糊查询,根据 tel 精确查询 ,分页查询 用户列表
@GetMapping("/getAirUsersByPage")
public List AirUser getAirUsersByPage(@RequestParam(value = "name",required = false,defaultValue = "") String name,
@RequestParam(value = "tel",required = false,defaultValue = "13501020304") String tel,
@RequestParam(value = "pageNo",required = false,defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize",required = false,defaultValue = "3") Integer pageSize){
log.info("------ 根据 name 模糊查询,根据 tel 精确查询 ,分页查询 用户列表 ------");
return airUserService.getAirUsersByPage(name, tel, pageNo, pageSize);
3.2.2.2 测试结果
3.4 ExampleMatcher.GenericPropertyMatchers(通用属性匹配器)的查询方式
jpa 模糊查询部分参考:-- https://blog.csdn.net/weixin_43481812/article/details/115615691
3.5 指定 jpa 自动创建表的字符集
3.5.1 自定义 配置类
// 如果数据库默认建表不是utf-8字符集,增加一个类,解决jpa自动创建表,字符集不支持中文(主要是8一下的数据库有足够问题)
public class MyMySQL57InnoDBDialect extends MySQL57InnoDBDialect {
@Override
public String getTableTypeString() {
return " ENGINE=InnoDB DEFAULT CHARSET=utf8 ";
3.5.2 配置
spring:
jpa:
properties:
hibernate:
dialect: com.kgc.sbt.config.MyMySQL57InnoDBDialect
# 自定义 配置类的路径
4、Mybatis-plus
4.1 依赖
dependency
groupId com.baomidou /groupId
artifactId mybatis-plus-boot-starter /artifactId
version 3.4.3.4 /version
/dependency
4.2 配置
4.2.1 mybatis-plus配置
#mybatis-plus 配置
mybatis-plus:
configuration:
map-underscore-to-camel-case: true #下划线映射驼峰
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启 mybatis 标准日志
4.2.2 mybatis-plus的分页拦截器
mybatis-plus的分页拦截器,有这个分页才有效果;
@Configuration
public class MybatisPlusConfig {
// mybatis-plus的分页拦截器
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return mybatisPlusInterceptor;
4.3 条件分页查询
4.3.1 mapper
注意:要@MapperScan("com.kgc.sbt.mapper");
public interface ContactMapper extends BaseMapper Contact {
//特殊sql,可以自己添加 接口并实现
4.3.2 service
4.3.2.1 接口
// 根据 联系人 姓名 获取联系人详情
List ContactVO getContactByName(String contactName,Integer pageNo,Integer pageSize);
2.3.2.2 实现类
创建查询对象
QueryWrapper Contact contactQueryWrapper = new QueryWrapper ();
contactQueryWrapper.likeRight("cname",contactName);
contactQueryWrapper.orderByDesc("id");、
Page Contact contactResultPage = contactMapper.selectPage(contactPage, contactQueryWrapper);
@Override
public List ContactVO getContactByName(String contactName, Integer pageNo, Integer pageSize) {
//mybatis-plus,创建一个查询对象,直接用
QueryWrapper Contact contactQueryWrapper = new QueryWrapper ();
contactQueryWrapper.likeRight("cname",contactName);
contactQueryWrapper.orderByDesc("id");
//or 条件拼接
contactQueryWrapper.or().eq("cname","李四");
//创建分页对象
Page Contact contactPage = new Page (pageNo,pageSize);
//查询联系人对象
Page Contact contactResultPage = contactMapper.selectPage(contactPage, contactQueryWrapper);
//处理返回的结果结果列表,将状态进行转化为描述
List ContactVO contactVOList = contactResultPage.getRecords().stream().map(contact - {
//创建新的VO 实体对象
ContactVO contactVO = new ContactVO();
//拷贝实体属性
BeanUtils.copyProperties(contact,contactVO);
//处理状态说明(可以定义枚举,也可以定义工具类)
contactVO.setStatusDesc(contact.getStatus() == 1 ? "正常" : "异常");
return contactVO;
}).collect(Collectors.toList());
log.info("------ 总页数:{},总条数:{},当前页:{},条数:{} -----",contactPage.getPages(),contactPage.getCurrent(),pageNo,pageSize);
return contactVOList;
4.4.4 请求测试
@@GetMapping("/contactByPage")
public RequestResult List ContactVO getContactListByPage(@RequestParam(value = ("contactName"),required = false) String contactName,
@RequestParam(value = ("pageNo"),required = false,defaultValue = "1") Integer pageNo,
@RequestParam(value = ("pageSize"),required = false,defaultValue = "3") Integer pageSize){
return ResultBuildUtil.success(contactService.getContactByName(contactName,pageNo,pageSize));
测试结果:
以上就是SpringBoot(四)()的详细内容,想要了解更多 SpringBoot(四)的内容,请持续关注盛行IT软件开发工作室。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。