1.SpringBoot程序加强
1.1 LomBok
1.1.1 LomBok下载
1.1.2 添加jar包文件
<!--引入插件lombok 自动的set
/get
/构造方法插件
-->
<dependency>
<groupId>org
.projectlombok
</groupId
>
<artifactId>lombok
</artifactId
>
</dependency
>
1.1.3 添加常用注解
package com
.jt
.pojo
;
import lombok
.AllArgsConstructor
;
import lombok
.Data
;
import lombok
.NoArgsConstructor
;
import lombok
.experimental
.Accessors
;
@Data
@Accessors(chain
= true)
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Integer id
;
private String name
;
private Integer age
;
private String sex
;
}
1.1.4关于LOMBOK面试题
问:项目发布是在Linux中发布的,LomBok的使用一般都需要安装插件.问题:如果在Linux中发布项目,是否需要重写安装LomBok插件.
答案: 不需要 原因: LOM插件在编译期生效. IDE工具将.java文件 编译为.class文件时,lombok插件开始工作. 为.class文件动态拼接get/set/toString等方法.所以 当程序在Linux中运行时. xxxx.jar 项目 (.class)文件. 可以直接运行.和lombok是否安装无关.
1.2 热部署
1.2.1 添加jar包
<!--支持热部署
-->
<dependency>
<groupId>org
.springframework
.boot
</groupId
>
<artifactId>spring
-boot
-devtools
</artifactId
>
</dependency
>
1.2.2 编辑IDEA
组合键: ctrl + alt + shirt + /
1.3 环境切换
1.3.1 业务场景
一般开发时使用的都是测试环境.当项目上线时需要在生产环境下部署项目. 问题: 在测试环境中的配置与生产环境下的配置可能不一致,经常需要修改IP地址及端口. 想法:能否简化该操作? 策略:指定多个运行环境. 当现在处于测试环境时,让配置文件指向测试. 反之做相同的操作.
1.3.2 编辑YML配置文件
# 测试环境
/jt 端口号
8095 生产环境
: / 端口号
8090 配置必须完整
.
#设定默认的环境
spring
:
profiles
:
active
: test
---
# yml
1.key
-value结构
#
2.key
-value之间使用
": "方法链接
#
3.YML配置文件有缩进的效果
.
#
4.YML配置文件默认采用utf
-8编码
.
#定义环境名称
spring
:
profiles
: prod
server
:
servlet
:
context
-path
: / #设定项目发布路径
port
: 8090
#配置图片上传路径
#image
:
#localDir
: D
:/java
/IDEA
/JT
/images
#设定分割线
---
# 设定环境名称
spring
:
profiles
: test
server
:
servlet
:
context
-path
: /jt #设定项目发布路径
port
: 8095
2.项目发布问题
2.1 编写测试类
package com
.jt
.controller
;
import com
.jt
.pojo
.User
;
import org
.springframework
.web
.bind
.annotation
.RequestMapping
;
import org
.springframework
.web
.bind
.annotation
.RestController
;
@RestController
public class HelloController {
@RequestMapping("/getMsg")
public String
getMsg(){
User user
= new User();
user
.setId(100)
.setName("xxx")
.setSex("xxx");
return "项目打包发布成功!";
}
}
2.2 项目打包
说明:如果需要项目的发布则需要将项目打包处理.打完包之后,会在target目录中动态生成jar/war包. 以及本地仓库中也会有包? 扩展: 本地仓库的包有啥作用? 作用:就是被其他项目依赖.因为项目将来会有多个并且极其复杂. clean: 的作用是删除target目录.
2.3 项目发布
说明:将项目打包之后,发布到指定的文件中,之后利用命令启动 控制台输入:java -jar demo1.jar 项目访问:
退出:ctrl + c
3.SpringBoot整合Mybatis
3.1 创建项目
3.2 导入项目包
<?xml version
="1.0" encoding
="UTF-8"?>
<project xmlns
="http://maven.apache.org/POM/4.0.0"
xmlns
:xsi
="http://www.w3.org/2001/XMLSchema-instance"
xsi
:schemaLocation
="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion
>
<groupId>org
.example
</groupId
>
<artifactId>springboot_mybatis
</artifactId
>
<version>1.0-SNAPSHOT
</version
>
<!--parent标签作用
: 定义了SpringBoot中所有关联项目的版本号信息
.-
->
<parent>
<groupId>org
.springframework
.boot
</groupId
>
<artifactId>spring
-boot
-starter
-parent
</artifactId
>
<version>2.3.3.RELEASE
</version
>
<relativePath
/> <!-- lookup parent from repository
-->
</parent
>
<properties>
<java.version>1.8</java
.version
>
<!--项目打包时
,跳过测试类打包
-->
<skipTests>true</skipTests
>
</properties
>
<!--开箱即用
:SpringBoot项目只需要引入少量的jar包及配置
,即可拥有其功能
.
spring
-boot
-starter 拥有开箱即用的能力
.
maven项目中依赖具有传递性
.
A 依赖 B 依赖 C项目 导入A bc会自动依赖
-->
<dependencies>
<!--直接依赖web springMVC配置
-->
<dependency>
<groupId>org
.springframework
.boot
</groupId
>
<!--springBoot
-start SpringBoot启动项
-->
<artifactId>spring
-boot
-starter
-web
</artifactId
>
</dependency
>
<!--SpringBoot重构了测试方式 可以在测试类中 直接引入依赖对象
-->
<dependency>
<groupId>org
.springframework
.boot
</groupId
>
<artifactId>spring
-boot
-starter
-test
</artifactId
>
<scope>test
</scope
>
<exclusions>
<exclusion>
<groupId>org
.junit
.vintage
</groupId
>
<artifactId>junit
-vintage
-engine
</artifactId
>
</exclusion
>
</exclusions
>
</dependency
>
<!--支持热部署
-->
<dependency>
<groupId>org
.springframework
.boot
</groupId
>
<artifactId>spring
-boot
-devtools
</artifactId
>
</dependency
>
<!--引入插件lombok 自动的set
/get
/构造方法插件
-->
<dependency>
<groupId>org
.projectlombok
</groupId
>
<artifactId>lombok
</artifactId
>
</dependency
>
<!--引入数据库驱动
-->
<dependency>
<groupId>mysql
</groupId
>
<artifactId>mysql
-connector
-java
</artifactId
>
<scope>runtime
</scope
>
</dependency
>
<!--springBoot数据库连接
-->
<dependency>
<groupId>org
.springframework
.boot
</groupId
>
<artifactId>spring
-boot
-starter
-jdbc
</artifactId
>
</dependency
>
<!--spring整合mybatis 暂时
-->
<dependency>
<groupId>org
.mybatis
.spring
.boot
</groupId
>
<artifactId>mybatis
-spring
-boot
-starter
</artifactId
>
<version>1.3.2</version
>
</dependency
>
</dependencies
>
<!--在项目打包部署时生效
,如果不添加build
,则程序发布时不然会报
项目中没有main方法
.
-->
<build>
<plugins>
<plugin>
<groupId>org
.springframework
.boot
</groupId
>
<artifactId>spring
-boot
-maven
-plugin
</artifactId
>
</plugin
>
</plugins
>
</build
>
</project
>
3.3 编辑项目结构代码
3.4 编辑YML配置文件
server
:
port
: 8090
servlet
:
context
-path
: /
spring
:
datasource
:
#driver
-class-name
: com
.mysql
.jdbc
.Driver 驱动注释
,采用默认的方式
url
: jdbc
:mysql
://127.0.0.1:3306/jtdb
?serverTimezone
=GMT
%2B8
&useUnicode
=true&characterEncoding
=utf8
&autoReconnect
=true&allowMultiQueries
=true
username
: root
password
: root
#Mybatis整合
mybatis
:
#定义别名包
type
-aliases
-package: com
.jt
.pojo
#添加xml文件的依赖
mapper
-locations
: classpath
:/mybatis
/mappers
3.5 编辑测试类
import com
.jt
.mapper
.UserMapper
;
import com
.jt
.pojo
.User
;
import org
.junit
.jupiter
.api
.Test
;
import org
.springframework
.beans
.factory
.annotation
.Autowired
;
import org
.springframework
.boot
.test
.context
.SpringBootTest
;
import java
.util
.List
;
@SpringBootTest
public class TestMybatis {
@Autowired
private UserMapper userMapper
;
@Test
public void test01(){
List
<User> userList
= userMapper
.findAll();
System
.out
.println(userList
);
}
}
3.6 ORM介绍
对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。 这也同时暗示着额外的执行开销;然而,如果ORM作为一种中间件实现,则会有很多机会做优化,而这些在手写的持久层并不存在。 更重要的是用于控制转换的元数据需要提供和管理;但是同样,这些花费要比维护手写的方案要少;而且就算是遵守ODMG规范的对象数据库依然需要类级别的元数据。 概括: 利用对象的方式操作数据库.
3.7 关于Mybatis配置文件说明
3.7.1 别名包定义
<!--当查询结果返回值会自己拼接包路径 com
.jt
.pojo
.User
虽然使用了别名包
,但是也可以自己指定包路径
结论
:自己不写执行别名包
自己写了就执行自己的
.
-->
<!--<select id
="findAll" resultType
="com.jd.pojo.User">
select
* from user
</select
>-->
3.7.2 驼峰规则映射
1).配置
mybatis
:
#开启驼峰映射
configuration
:
map
-underscore
-to
-camel
-case: true
2).具体说明
<?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.jt.mapper.UserMapper">
<!--当查询结果返回值会自己拼接包路径 com
.jt
.pojo
.User
虽然使用了别名包
,但是也可以自己指定包路径
结论
:自己不写 执行别名包
自己写了就执行自己的
.
-->
<!--<select id
="findAll" resultType
="com.jd.pojo.User">
select
* from user
</select
>-->
<!--需求
字段信息
: user_id
,user_name
,user_age
对象属性
: userId
,userName
,userAge
需求
:查询数据库
,实现数据的映射
.
补充知识
: ORM
:以对象的形式操作数据库
.
resultType
:将数据库中的结果动态的封装为对象
.
原则
: 字段的名称必须与对象属性的名称一致
.
驼峰规则映射
:
目的
: 主要简化mybatis 映射的过程
规则
: user_id(字段
) ~~~ 去除下划线
~~~之后首字母大写
userid userId
~~~之后与属性的名称一致
,则可以正确的映射
.
注意事项
:一旦使用驼峰规则
,必须满足条件
面试点
: 如果开启了驼峰规则映射
,
问
: 字段user_id 与对象属性user_id
能否映射
???
-->
<!--<select id
="xxx" resultType
="User">
<
;!&ndash
;执行的是sql
,返回的是List
<User>&ndash
;>
;
select
* from user
</select
>-->
</mapper
>
4.MybatisPlus(MP)
4.1 MP介绍
url地址: https://baomidou.com MyBatis-Plus(简称 MP)是一个 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 MP工作原理说明
4.3.1 原理实现说明
核心:以对象的方式操作数据库. 需求分析: 1.对象与数据库表如何映射? 利用注解实现对象与表绑定 属性与字段绑定. 2.如何解决众多接口编辑雷同的CRUD操作? 定义一个公共的Mapper接口,定义公共的CRUD操作 利用泛型区分对象. 3.数据库只对Sql感兴趣,对对象没兴趣?(如何将对象转化为sql) 思想:按照特定的语法,将对象的操作动态的转化为sql语句.之后交给Mybatis执行
例子
: 将user对象插入数据库中
.
userMapper
.insert(user对象
);
sql
: insert into 表名
(字段
.....) values
(属性值
......); 由mp动态拼接之后交由mybatis执行
.
4.4 SpringBoot整合MP
4.4.1 导入MPjar包
<!--spring整合mybatis
-plus 只导入MP包
,删除mybatis包
-->
<dependency>
<groupId>com
.baomidou
</groupId
>
<artifactId>mybatis
-plus
-boot
-starter
</artifactId
>
<version>3.3.2</version
>
</dependency
>
4.4.2 编辑POJO对象
package com
.jt
.pojo
;
import com
.baomidou
.mybatisplus
.annotation
.IdType
;
import com
.baomidou
.mybatisplus
.annotation
.TableField
;
import com
.baomidou
.mybatisplus
.annotation
.TableId
;
import com
.baomidou
.mybatisplus
.annotation
.TableName
;
import lombok
.Data
;
import lombok
.experimental
.Accessors
;
import java
.io
.Serializable
;
@Data
@Accessors(chain
= true)
@TableName("user")
public class User implements Serializable {
@TableId(type
= IdType
.AUTO
)
private Integer id
;
private String name
;
private Integer age
;
private String sex
;
}
4.4.3 编辑Mapper接口
package com
.jt
.mapper
;
import com
.baomidou
.mybatisplus
.core
.mapper
.BaseMapper
;
import com
.jt
.pojo
.User
;
import org
.apache
.ibatis
.annotations
.Select
;
import java
.util
.List
;
public interface UserMapper extends BaseMapper<User> {
@Select("select *from user")
List
<User> findAll();
}
4.4.4 修改YML文件配置
server
:
port
: 8090
servlet
:
context
-path
: /
spring
:
datasource
:
#driver
-class-name
: com
.mysql
.cj
.jdbc
.Driver #驱动注释
,采用默认的方式
url
: jdbc
:mysql
://127.0.0.1:3306/jtdb
?serverTimezone
=GMT
%2B8
&useUnicode
=true&characterEncoding
=utf8
&autoReconnect
=true&allowMultiQueries
=true
username
: root
password
: root
#Mybatisplus整合
mybatis
-plus
:
#定义别名包 将实体对象的包路径进行封装
.
type
-aliases
-package: com
.jt
.pojo
#添加xml文件的依赖
mapper
-locations
: classpath
:/mybatis
/mappers
4.4.5 MP入门案例
package com
.jt
.test
;
import com
.jt
.mapper
.UserMapper
;
import com
.jt
.pojo
.User
;
import org
.junit
.jupiter
.api
.Test
;
import org
.springframework
.beans
.factory
.annotation
.Autowired
;
import org
.springframework
.boot
.test
.context
.SpringBootTest
;
import java
.util
.List
;
@SpringBootTest
public class TestMybatis {
@Autowired
private UserMapper userMapper
;
@Test
public void test01(){
List
<User> userList
= userMapper
.findAll();
System
.out
.println(userList
);
}
@Test
public void test02(){
List
<User> userList
= userMapper
.selectList(null
);
System
.out
.println(userList
);
}
}
4.4.6 补充知识-关于数据库链接地址说明
spring
:
datasource
:
#driver
-class-name
: com
.mysql
.cj
.jdbc
.Driver #驱动注释
,采用默认的方式
url
: jdbc
:mysql
://127.0.0.1:3306/jtdb
?serverTimezone
=GMT
%2B8
&useUnicode
=true&characterEncoding
=utf8
&autoReconnect
=true&allowMultiQueries
=true
username
: root
password
: root
1).时区 数据库驱动的高版本需要使用时区操作. serverTimezone=GMT%2B8 %2B + 2).使用useUnicode=true编码 characterEncoding=utf8 字符采用utf-8编码 3).autoReconnect=true 如果mysql链接断掉之后是否重连. 4).allowMultiQueries=true 是否允许批量操作.
4.5 MP API介绍
4.5.1 开放Sql日志
server
:
port
: 8090
servlet
:
context
-path
: /
spring
:
datasource
:
#driver
-class-name
: com
.mysql
.cj
.jdbc
.Driver #驱动注释
,采用默认的方式
url
: jdbc
:mysql
://127.0.0.1:3306/jtdb
?serverTimezone
=GMT
%2B8
&useUnicode
=true&characterEncoding
=utf8
&autoReconnect
=true&allowMultiQueries
=true
username
: root
password
: root
#Mybatisplus整合
mybatis
-plus
:
#定义别名包 将实体对象的包路径进行封装
.
type
-aliases
-package: com
.jt
.pojo
#添加xml文件的依赖
mapper
-locations
: classpath
:/mybatis
/mappers
4.5.2 MP的CURD操作
package com
.jt
.test
;
import com
.baomidou
.mybatisplus
.core
.conditions
.query
.QueryWrapper
;
import com
.baomidou
.mybatisplus
.core
.conditions
.update
.UpdateWrapper
;
import com
.jt
.mapper
.UserMapper
;
import com
.jt
.pojo
.User
;
import org
.junit
.jupiter
.api
.Test
;
import org
.springframework
.beans
.factory
.annotation
.Autowired
;
import org
.springframework
.boot
.test
.context
.SpringBootTest
;
import java
.util
.ArrayList
;
import java
.util
.Arrays
;
import java
.util
.List
;
@SpringBootTest
public class TestMybatis {
@Autowired
private UserMapper userMapper
;
@Test
public void test01(){
List
<User> userList
= userMapper
.findAll();
System
.out
.println(userList
);
}
@Test
public void test02(){
List
<User> userList
= userMapper
.selectList(null
);
System
.out
.println(userList
);
}
@Test
public void insert(){
User user
= new User();
user
.setName("王大锤").setAge(20).setSex("男");
userMapper
.insert(user
);
}
@Test
public void select01(){
User user
= userMapper
.selectById(21);
System
.out
.println(user
);
int count
= userMapper
.selectCount(null
);
System
.out
.println(count
);
}
@Test
public void select03(){
QueryWrapper
<User> queryWrapper
= new QueryWrapper<>();
queryWrapper
.eq("sex", "女")
.gt("age",100);
List
<User> userList
= userMapper
.selectList(queryWrapper
);
System
.out
.println(userList
);
}
@Test
public void select04(){
QueryWrapper
<User> queryWrapper
= new QueryWrapper<>();
queryWrapper
.likeLeft("name", "精")
.eq("sex", "男");
List
<User> userList
= userMapper
.selectList(queryWrapper
);
System
.out
.println(userList
);
}
@Test
public void select05(){
QueryWrapper
<User> queryWrapper
= new QueryWrapper<>();
queryWrapper
.eq("sex", "女")
.orderByDesc("age","id");
List
<User> userList
= userMapper
.selectList(queryWrapper
);
System
.out
.println(userList
);
}
@Test
public void select06(){
Integer
[] ids
= {1,3,5,7};
List
<Integer> idList
= Arrays
.asList(ids
);
List
<User> userList
= userMapper
.selectBatchIds(idList
);
System
.out
.println(userList
);
}
@Test
public void testSelect(){
User user
= new User();
user
.setName("王昭君").setAge(19);
QueryWrapper
<User> queryWrapper
= new QueryWrapper(user
);
List
<User> userList
= userMapper
.selectList(queryWrapper
);
System
.out
.println(userList
);
}
@Test
public void testDelete(){
QueryWrapper
<User> queryWrapper
= new QueryWrapper<>();
queryWrapper
.isNull("name");
userMapper
.delete(queryWrapper
);
}
@Test
public void testUpdate(){
User user
= new User();
user
.setName("安琪拉").setSex("女");
UpdateWrapper
<User> updateWrapper
= new UpdateWrapper<>();
updateWrapper
.isNull("name");
userMapper
.update(user
,updateWrapper
);
}
}