springboot
时间:2023-02-01 17:00:00
[外链图片转存失败,源站可能有防盗链机制,建议保存图片并直接上传(img-MkstKd0f-1654725363432)(C:\Users\82053\AppData\Roaming\Typora\typora-user-images\image-20220606221038275.png)]MyBatis
1.mybatis搭建
思维流程:环境建设(增加依赖) -> 导入Mybtais -> 编写代码 -> 测试
搭建环境:
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency>
编制核心配置文件
<?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> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" vlue="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
//对应的寻找mapper.xml找到你们sql映射文件
<mappers>
<mapper resource="com/kuang/dao/userMapper.xml"/>
</mappers>
</configuration>
Mybatis工具类
private static SqlSessionFactory sqlSessionFactory;
static {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//获取SqlSession连接
public static SqlSession getSession(){
return sqlSessionFactory.openSession();
}
资源过滤问题:
src/main/java
**/*.properties
**/*.xml
false
src/main/resources
**/*.properties
**/*.xml
false
2.CRUD
在.xml中有个属性名为namespace
用来指定mapper接口
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EEvB9FFz-1654725363436)(C:\Users\82053\AppData\Roaming\Typora\typora-user-images\image-20220520183530707.png)]
配置文件中namespace中的名称为对应Mapper接口或者Dao接口的完整包名,必须一致!
select
接口中搜索需写在select
里面
mapper接口:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b8za5kR9-1654725363437)(C:\Users\82053\AppData\Roaming\Typora\typora-user-images\image-20220520183955010.png)]
mapper.xml:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xMLr6Zor-1654725363438)(C:\Users\82053\AppData\Roaming\Typora\typora-user-images\image-20220520184031281.png)]
思路一:直接在方法中传递参数
在接口的方法中可以通过@Param("参数名")
来给该参数命名,然后再.xml文件中使用,这样就不要设置参数类型。
没有使用@Param
:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T7EjZqWs-1654725363438)(C:\Users\82053\AppData\Roaming\Typora\typora-user-images\image-20220520184530424.png)]
使用了@Param
:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q7WtQkmB-1654725363439)(C:\Users\82053\AppData\Roaming\Typora\typora-user-images\image-20220520184554934.png)]
mapper.xml中:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aAAZXS5M-1654725363440)(C:\Users\82053\AppData\Roaming\Typora\typora-user-images\image-20220520184616775.png)]
没有使用的需要给参数定义一个参数类型,使用了就不要在定义参数类型可以直接使用!
思路二:使用Map接收
如果传递的参数过多,可以使用Map来接收
mapper接口中:
Emp selectByIdEbYmap(Map<String,Object>);
mapper.xml中:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g7FQGLQD-1654725363441)(C:\Users\82053\AppData\Roaming\Typora\typora-user-images\image-20220520190605073.png)]
接着在调用的时候直接传递一个HashMap
Map map = new HashMap();
map.put("sndasdasame","小明");
map.put("asadsage","123456");
User user = mapper.selectUserByNP2(map);
比较推荐第二种,第一种能处理少量的参数,如果多的话可以使用map
insert
故名思议用来完成增加操作的
mapper接口中:
int addemp(Emp emp);
mapper.xml中:
<insert id="addemp" parameterType="emp">
insert into `emp`(`sname`,`ssex`,`age`,`salary`) values (#{
sname},#{
ssex},#{
age},#{
salary})
</insert>
这样调用即可
update
故名思议用来完成更新操作的
mapper接口
int updateById(Emp emp);
mapper.xml中:
<update id="updateById" parameterType="emp">
update `emp` set `sname`=#{
sname},`ssex`=#{
ssex},`age`=#{
age},`salary`=#{
salary} where id=#{
id}
</update>
这样调用即可
delete
故名思议用来完成删除的
mapper接口:
int deletById(@Param("userid") int id);
mapper.xml中:
<delete id="deletById" parameterType="int">
delete from `emp` where id=#{
userid}
</delete>
总结:
1.在传递参数的时候,需要添加参数的类型
2.使用@Param("参数名")
可以直接在xml中使用该参数名对应的该表示后面的参数,使用的时候不用添加参数类型
特别是在有多个参数的时候尽量使用@Param()
来给参数命名,在参数多的时候必须写上
3.在参数很多的情况下也可以使用map来接收
4.为了规范,在编写.xml中尽量把Parameter(参数类型)和resultType(返回值类型)都写上。
模糊语句Like
string wildcardname = “%smi%”;
list<name> names = mapper.selectlike(wildcardname);
<select id=”selectlike”>
select * from foo where bar like #{
value}
</select>
分析:
在实际中可以先获取参数然后拼接两个百分号上去凑成一个字符串。
核心配置文件
mybatis-config.xml:系统核心配置文件
configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
environments元素
多表查询(一对多)
在mybaits
中多表查询:
数据库:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZhhNxhyv-1654725363441)(C:\Users\82053\AppData\Roaming\Typora\typora-user-images\image-20220521225832832.png)]
创建两个实体类
注意:实体类的类名要与数据库的类型一致才能匹配到,如果名称不一样在后面springboot中可以使用@TableName(数据库表名)
来进行匹配,否则无法匹配,属性名也要与数据库中的列名相等才能匹配
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P3pVCpEK-1654725363442)(C:\Users\82053\AppData\Roaming\Typora\typora-user-images\image-20220521225949208.png)]
创建接口:
public interface StuMapper {
List<Stu> selectStuAndLession();
}
mapper.xml中:
在resultMap
中创建一个标签association标签
property
:为stu
表中的引用类型lesson
column:为多的一方的列名
javaType:为property的数据类型
select:通过说明为搜索语句
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w7i53iV8-1654725363442)(C:\Users\82053\AppData\Roaming\Typora\typora-user-images\image-20220521230834111.png)]
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Q0sAzcp-1654725363443)(C:\Users\82053\AppData\Roaming\Typora\typora-user-images\image-20220521232105960.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4THpfnHZ-1654725363443)(C:\Users\82053\AppData\Roaming\Typora\typora-user-images\image-20220521232044087.png)]
多对一思路:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UrT3siC9-1654725363444)(C:\Users\82053\AppData\Roaming\Typora\typora-user-images\image-20220521235922304.png)]
这样相当于下面的语句:
select * from `student` inner join `lesson` on(student.lesson_id=lesson.lesson_id)
resultMap
就相当于主sql后面的inner join
lesson on(student.lesson_id=lesson.lesson_id)
准备的数据库表:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ffJQQ1Yp-1654725363444)(C:\Users\82053\AppData\Roaming\Typora\typora-user-images\image-20220521225832832.png)]
按搜索嵌套处理:
实体类:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kv4oBPJ4-1654725363445)(C:\Users\82053\AppData\Roaming\Typora\typora-user-images\image-20220523022158940.png)]
目的:通过stu
的lesson_id
来完成与lesson
表的链接
接口:
public interface StuMapper {
List<Stu> selectBylESSON();
}
xml中:
//这里我们的stu中有引用类型所以使用resultMap
<select id="selectBylESSON" resultMap="getLesson">
select * from `student`
</select>
//根据上面的id来匹配 这里的type为多的一方的类型
<resultMap id="getLesson" type="Stu">
//association:用来给引用类型做一个连接
//property:指属性的名称
//column:为数据库中student的lesson_id拿来和lesson中的lesson_id匹配
//javaType:指属性名的类型
//select:链表的查询语句的id,下面的getLessona要与这个匹配才能获得lesson表中`lesson_id`=stu表中的`lesson_id`
//相互匹配的值
<association property="lesson" column="lesson_id" javaType="lesson" select="getLessona"/>
</resultMap>
<select id="getLessona" resultType="lesson">
select * from `lesson` where `lesson_id`=#{
gsga}
</select>
结果:
@Test
public void tsata(){
SqlSession sqlSession = Mybatisuntils.getSqlSession();
StuMapper mapper = sqlSession.getMapper(StuMapper.class);
List<Stu> stus = mapper.selectBylESSON();
for (Stu stu : stus) {
System.out.println("学生名:"+stu.getStudent_name()+"课名"+stu.getLesson().getLesson_name());
}
}
调用结果:
学生名:Andy课名Java
学生名:Jack课名Java
学生名:Jim课名Python
学生名:Tom课名C++
学生名:Pete课名C++
学生名:Citr课名PHP
思路:
这个搜索嵌套处理有两个sql
第一个sql为搜索stu中的所有信息
第二个sql为搜索lesson
中的根据相同点给出对应的数据
中间的resultmap用来衔接两个sql的,是为了衔接lesson表在stu实体类中的属性名、类型、和衔接链表的共同点数据库中的列名,然后通过该列名给第二段sql来进行匹配查询
按结果嵌套处理:
接口:
public interface StuMapper {
List<Stu> selectLesonTWO();
}
xml中:
//在这段sql语句中将所有想要查询的信息进行链表查询
<select id="selectLesonTWO" resultMap="fontLesson">
select s.student_id ssid,s.lesson_id sid,s.student_name sname,l.lesson_name lname from student s,lesson l where s.lesson_id = l.lesson_id
</select>
<resultMap id="fontLesson" type="Stu">
//然后通过键值对将上面别名是数据库表名对应给类中的属性名
//这里的property是stu的成员属性名, column是上面sql中的别名
<id property="id" column="ssid"/>
<result property="lesson_id" column="sid"/>
<result property="student_name" column="sname"/>
//因为lesson属性为引用类型,所以这里使用了association ,因此有引用类型就使用association
<association property="lesson" javaType="lesson">
//给引用类型中的属性名赋值
<result property="lesson_name" column="lname"/>
</association>
</resultMap>
结果:
@Test
public void saerawr(){
SqlSession sqlSession = Mybatisuntils.getSqlSession();
StuMapper mapper = sqlSession.getMapper(StuMapper.class);
List<Stu> stus = mapper.selectLesonTWO();
for (Stu stu : stus) {
System.out.println("学生名:"+stu.getStudent_name()+"课名:"+stu.getLesson().getLesson_name());
}
}
调用结果:
学生名:Andy课名:Java
学生名:Jack课名:Java
学生名:Jim课名:Python
学生名:Tom课名:C++
学生名:Pete课名:C++
学生名:Citr课名:PHP
两种方法区别:
搜索嵌套的是:
在搜索语句中途去配置相对应的属性以及匹配的表名(有两段sql语句)
结果嵌套的是:
现在整体输入完所有的语句然后通过resultmap来给属性统一赋值(只需要一段sql语句)
springboot
创建原生组件注解模式创建
1.原生组件之servlet
思路流程:创建类a继承httpServlet
实现里面的doget
与dopost
,然后创建一个类为servler
的配置类,并在该类设置为配置类,在该类内将类a注册进容器中,然后通过servletRestionBean
将servlet
进容器容器中相当于注册一个servlet
a类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XgTTj6ov-1654725363445)(C:\Users\82053\AppData\Roaming\Typora\typora-user-images\image-20220518160419828.png)]
然后定义一个配置类b,将a放进容器,并通过ServletRestionBean
进行注册。
注意在注册servlet
中需要给servlet
定义一个路径为该a类的访问路径
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3V2LvHAl-1654725363446)(C:\Users\82053\AppData\Roaming\Typora\typora-user-images\image-20220518160534792.png)]
@Configuration
public class MyServletTestConfig {
@Bean
public MyServlet myServlet(){
return new MyServlet();
}
@Bean
public ServletRegistrationBean servletRegistrationBean(){
ServletRegistrationBean<MyServlet> myServletServletRegistrationBean = new ServletRegistrationBean<>(new MyServlet(),"/testa");
return myServletServletRegistrationBean;
}
}
这样就可以将servlet
注册进了springboot中了
2.原生组件之filter(过滤器)
手动配置:
流程: 创建类a实现Filter
这个类,并加上注解@WebFilter(拦截的路径)
,然后编写内部的逻辑,然后到主配置文件中添加注解扫描a类所在的包
在a类中
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NeGfWImH-1654725363446)(C:\Users\82053\AppData\Roaming\Typora\typora-user-images\image-20220518162630346.png)]
在主配置文件中,加入fliter
所在的包路径即可。 注意:这里使用@ServletComponentScan
来扫描因为这个注解在servlet
包下所以可以用该注解扫码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KcXXfT0v-1654725363447)(C:\Users\82053\AppData\Roaming\Typora\typora-user-images\image-20220518162827383.png)]
自动配置:
流程:创建a类实现filter
,然后创建一个类为配置类,然后将a类放进容器中,在将a类进行注册
就创建过滤器,然后注册该过滤器,再放入到容器中
a类中:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WWv8Tj5W-1654725363447)(C:\Users\82053\AppData\Roaming\Typora\typora-user-images\image-20220518163602024.png)]
filter
配置类中
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xet0IimG-1654725363448)(C:\Users\82053\AppData\Roaming\Typora\typora-user-images\image-20220518163639379.png)]
这样就可以在springboot中将原生的spring组件注册到springboot中了
配置处理和字符编码
方法一手动配置:
在servlet配置类中进行注册字符编码过滤器,前提是需要到yaml
中 将springboot
默认的字符编码关闭
思路流程:
字符集编码是需要和过滤器来进行统一的一个搭配的原因是,过滤器拦截到的请求可以在到后台之前全部设置为例如utf-8
等字符集,这样就可以不需要我们去每个控制器中手动设置字符集!
需要创建一个字符集过滤器,设置字符编码,接着放进filterFilterRegistration
过滤器中,通过过滤器来给字符集过滤器加上路径,最后加上需要修改字符的路径(意为只要是这些路径都会将字符集编程设置的)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aakcK62X-1654725363448)(C:\Users\82053\AppData\Roaming\Typora\typora-user-images\image-20220518180846029.png)]
@Bean
public FilterRegistrationBean characet(){
//创建过滤器
FilterRegistrationBean<Filter> = new FilterRegistrationBean<>();
// 创建字符集过滤器
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
//然后开启设置强制编码
characterEncodingFilter.setForceEncoding(true);
//设置字符集为utf-8
characterEncodingFilter.setEncoding("utf-8");
//将字符集放入到过滤器中
filterFilterRegistrationBean.setFilter(characterEncodingFilter);
//过滤路径为/*也就是所有路径都将字符集调整的utf-8
filterFilterRegistrationBean.addUrlPatterns("/*");
return filterFilterRegistrationBean;
}
方法二使用springboot自动配置(推荐):
在springboot中自动配置的话,直接去主配置文件上面进行设置就可以了
//将字符编码调整为utf-8
server.servlet.encoding.charset=UTF-8
//启用springboot提供的配置字符集
server.compression.enabled=true
//开启强制字符集为utf-8
server.servlet.encoding.force=true
打包WAR
1.如果是创建项目之初是WAR包的,在配置类中设置端口号以及上下文,然后右边选这项目,然后点Package
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lo9xvUdt-1654725363449)(C:\Users\82053\AppData\Roaming\Typora\typora-user-images\image-20220520003832777.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NexfzKS4-1654725363449)(C:\Users\82053\AppData\Roaming\Typora\typora-user-images\image-20220520003911440.png)]
然后就可以在test中可以找到该WAR包在部署到linux;
JAR打包
与WAR包打包方式同理;
Thymleaf
在使用Thymeleaf
时,要到主配置文件将Thymeleaf
默认的缓存关闭,不然没办法看到实时页面
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g6m2RDqk-1654725363450)(C:\Users\82053\AppData\Roaming\Typora\typora-user-images\image-20220520004605854.png)]
Java基础
循环:
break :
用于退出当前循环的循环体,若有多个循环则默认退出最近的循环体
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cPU23jXl-1654725363450)(C:\Users\82053\AppData\Roaming\Typora\typora-user-images\image-20220519043015006.png)]
在结果处可以得知一当j
为2只退出第二层,第一层不影响
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AlaW7JWp-1654725363450)(C:\Users\82053\AppData\Roaming\Typora\typora-user-images\image-20220519043127069.png)]
continue:
用于返回,当循环中出现该代码,直接进入下一个循环,continue
后面的代码不执行直接进入下一个循环,若有多个循环也是默认退出最近的循环体
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hMgKv4fX-1654725363451)(C:\Users\82053\AppData\Roaming\Typora\typora-user-images\image-20220519034543580.png)]
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DiZB28Z5-1654725363451)(C:\Users\82053\AppData\Roaming\Typora\typora-user-images\image-20220519034606784.png)]
Return:
表示跳出当前方法7
Random
生成随机数,创建实例接着调用内部的方法random.nextInt(传入数值)
获取到的随机数为0到该数值之间的范围,不包括该该数值
Random r = new Random();
int i = r.nextInt(10);//获取到的数值为[0,10)之间的随机数
sout(i);
//创建一个1到10直接的数
int u = r.nextint(10)+1;
注意:该随机数是由0开始到目标数的,如果需要创建的数值为1开始的在末尾加1即可
Scanner
用于获取键盘输入的内容,创建实例接着调用内部的方法就可以获取键盘输入的内容
Scanner sc = new Scanner(System.in);//这里的Systen.in是获取键盘输入的内容的
//scanner内部有很多方法,可以同来判断接字符类型返回的boolean,也可以接收字符串数字类型等等
int ie = sc.nextInt();//这就为接收的类型为数据类型
//如果输入的数据不为int类型就会报错,否则会是输出我们输入的Int
sout(ie)
sc.next();//是接收字符串
数组:
数组的声明
//第一种 数据类型[] 变量名;
int[] arr;
//第二种 数据类型 变量名[];
int arr[];
数组的动态初始化:
就是在声明数组的同时给了数组一个指定的长度,有系统为数组分配初始值
//格式: 数据类型[] 变量名 = new 数据类型[数组长度]
int[] arr = new int[5];//这里给数组指定了长度,没赋值之前默认为0
//这里输出的是地址值
sout(arr)
//打印的结果
[I@12a3a380
//小分析 [:说明的数组 I:说明的int类型的
//动态初始化赋值通过下标赋值(没赋值都为0)
arr[0] = 11;
arr[1] = 22;
arr[2] = 33;
arr[3] = 44;
arr[4] =