目录
1 、SpringBoot高级应用
1.1 、常规方式创建springboot项目
右键>new>module>spring初始化>改头换面finish
右键>new>module>maven>next>改头换面finish
(两种最大区别在pom文件中有着不同的标签,maven的pom文件就很简洁需要添加依赖并更新)
新的项目只需要从spring那边复制除了坐标之外的配置文件即可。
1.2 、环境分割
情景说明:如果小汤经常返回于工地与公司,其中的服务器端口号经常的变化。
案例:
1.开发 Dev:8080端口
2.生产prod:9000端口
问题:由于配置文件数量众多,如果每次都修改则会带来很多不便,
解决方案:更改application.yml文件
#指定环境的默认配置
spring:
profiles:
active: dev
---
#为环境定义名称
server:
port: 8080
spring:
config:
activate:
on-profile: dev
# 可以使用---来实现环境分割 隔开相同的key
---
server:
port: 9000
spring:
config:
activate:
on-profile: prod
1.3 、热部署(在开发阶段有用)
在开发阶段需要频繁的修改配置文件/代码,需求要求将代码保存之后,程序会自动的编译,并且完成Tomcat服务的重启,个别idea版本可能不生效。
<!--支持热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
配置自动化编译
让热部署有效:快捷键:Ctrl + alt + shift + / 勾选重启项目
2 、导入数据库
现象:昨天数据库还可以正常使用,今天早上开机发现数据库连接不上?什么原因?
原因:有可能是你的windows的服务中的mysql服务没启动,如果未启动则手动启动即可
3 、lombok插件使用
1.引入jar包
<!--引入插件lombok 自动的set/get/构造方法插件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
2 、常用注解:
@Data//自动添加get set toString equals方法等
@Accessors(chain = true)//开启链式加载 重写set方法
@NoArgsConstructor//无参构造
@AllArgsConstructor//有参构造
3 、Lombok作用:
package com.jt.pojo;
//实体对象要求 :
//1.类名一般与表名关联
//2.属性名称一般与字段关联(方法公有属性私有)
//3.pojo的属性类型必须使用引用类型(包装类型)
//4.实体对象必须有get/set方法
//5.实体对象不要交给spring容器管理,实现序列化即可implements Serializable
// 原因:数据可能跨平台、跨服务器传输(数据在网络中传输必须序列化)
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data//自动添加get set toString equals方法等
@Accessors(chain = true)//开启链式加载 重写set方法
@NoArgsConstructor//无参构造
@AllArgsConstructor//有参构造
public class DemoUser implements Serializable {
private Integer id;
private String name;
private Integer age;
private String sex;
//this 运行期有效 代表当前对象
// public DemoUser SetId(Integer id){
// this.id=id;
// reture this;
// }
public void add(){
DemoUser user = new DemoUser();
user.setId(100)
.setName("aaa")
.setAge(20)
.setSex("女");
}
}
4 、mybatis框架
4.1 、ORM思想
对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。
概括:用对象的方式操作数据库
衍生:
1.对象应该与数据库中的表一一映射;
2.对象的属性应该与表中的字段一一映射;
3.其中的映射应该由程序自动完成,无需人为干预。
4.2 、常见的JDBC弊端
弊端:
1.无论如何执行都必须获取数据库链接,链接池 c3p0 druid HK;
2.操作sql语句时,步骤繁琐,不便于记忆;
3.资源必须手动关闭。
优点:操作数据库最快的方式就是JDBC,协议是TCP。
4.3 、Mybatis介绍
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集(mybatis在内部将jdbc封装)MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
持久化:计算机在计算时,数据都在内存中,如果出现断电的情况下数据会清空,所以要求将内存的数据保存到磁盘中。
持久层:程序通过Dao/Mapper与数据库进行交互的层级代码(Controller层 Service层 Dao/Mapper层)具体操作。
小结:Mybatis是一个优秀的持久层框架,基于ORM设计思想实现了以对象的方式操作数据库。
了解:Mybatis的ORM并不完全,只完成了结果集映射,但是SQL需要自己手写,所以也称之为半自动化的ORM映射框架。
5 、mybatis案例分析
5.1 、导入依赖包
<!--mybatis依赖包-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<!--jdbc依赖包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
5.2 、测试DemoUser.java类:
package com.jt.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@Accessors(chain=true)
@NoArgsConstructor
@AllArgsConstructor
public class DemoUser implements Serializable {
private Integer id;
private String name;
private Integer age;
private String sex;
}
5.3 、编辑config.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--核心配置文件-->
<configuration>
<!--环境配置标签 default 默认加载的环境 只能写一个-->
<environments default="development">
<!--编辑开发环境-->
<environment id="development">
<!-- 事务管理器 利用jdbc控制事务-->
<transactionManager type="JDBC"/>
<!-- mybatis采用数据库链接池的方式整合数据源-->
<dataSource type="POOLED">
<!-- 高版本的数据库驱动需要添加cj-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/jt?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--Mybatis加载Mapper映射文件-->
<mappers>
<mapper resource="mybatis/mappers/UserMapper.xml"/>
</mappers>
</configuration>
5.4 、创建Mapper接口
public interface DemoUserMapper {
//查询所有的表数据
public List<DemoUser> findAll();
}
5.5 、编辑Mapper映射文件
<?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">
<!--namespace是mybaits映射文件的唯一标识,与接口对应-->
<!--xml映射文件 必须与 接口一对一绑定
namespace : 指定需要绑定的接口名称 不能重复
-->
<mapper namespace="com.jt.mapper.UserMapper">
<!--id 表示接口方法 需要与接口方法绑定
resultType 返回对象的包路径
方法:select update delete
-->
<select id="findAll" resultType="com.jt.pojo.DemoUser">
select id,name,age,sex from demo_user
</select>
</mapper>
5.6 、Mybatis关联映射文件
<!--Mybatis加载Mapper映射文件
mapper映射文件是有顺序的 位置不能随便切换
通过resource 加载指定的xml映射文件 mybatis\mappers\demoUserMapper.xml
-->
<mappers>
<mapper resource="mybatis\mappers\demoUserMapper.xml"/>
</mappers>
5.7 、Mybatis测试
package com.jt;
import com.jt.mapper.DemoUserMapper;
import com.jt.pojo.DemoUser;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class TestMybatis {
// 实现mybatis的入门案例
@Test
public void demo1() throws IOException {
//指定配置文件地址
String resource ="mybatis\\mybatis-config.xml";
//通过io流 加载指定的配置文件
InputStream inputStream= Resources.getResourceAsStream(resource);
//动态生成SqlSessionFactory
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//获取SqlSession
SqlSession sqlSession=sqlSessionFactory.openSession();
//获取mapper接口
DemoUserMapper demoUserMapper=sqlSession.getMapper(DemoUserMapper.class);
//获取数据
List<DemoUser> userList=demoUserMapper.findAll();
System.out.println(userList);
}
}
5.8 、理论逻辑
1. 加载指定的mybatis-config.xml核心配置文件 数据源配置 加载映射文件
2. 读取后交给SqlSessionAactoryBuilder
3. 建造SqlSessionAactory工厂
4. 生产SqlSession 是执行sql语句的最小单位
5. 获取UserMapper接口
6. 调用接口执行sql标签UserMapper.xml 注意:namespace接口 id方法 restfulType返回包路径
7. JDBC执行sql
8. 结果集映射>封装后的对象
9. 完成特定的业务处理
10. 关闭资源
5.9 、异常报错
报错说明1:org.apache.ibatis.binding.BindingException: Type interface com.jt.mapper.UserMapper is not known to the MapperRegistry.
解决方案1:检查namespace命名是否与接口一致
报错说明2:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.jt.mapper.UserMapper.findAll
解决方案2:检查xml映射文件中的ID是否与接口方法一致.
报错说明3:The error may exist in mybatis/mappers/UserMapper2.xml
解决方案3:检查mybatis核心文件加载mapper映射文件的路径是否正确.
报错说明4:Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. The XML location is ‘mybatis/mappers/demoUserMapper.xml’. Cause: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias ‘DemoUser’. Cause: java.lang.ClassNotFoundException: Cannot find class: DemoUser
解决方案4:问题可能是xml映射文件中的resultType的类型异常.
5.10 、其他问题
注意驱动问题
注意数据源的连接地址问题
注意数据库用户名密码问题