资讯详情

springboot

[外链图片转存失败,源站可能有防盗链机制,建议保存图片并直接上传(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&amp;useUnicode=true&amp;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();
  }

资源过滤问题:

<resources>
   <resource>
       <directory>src/main/java</directory>
       <includes>
           <include>**/*.properties</include>
           <include>**/*.xml</include>
       </includes>
       <filtering>false</filtering>
   </resource>
   <resource>
       <directory>src/main/resources</directory>
       <includes>
           <include>**/*.properties</include>
           <include>**/*.xml</include>
       </includes>
       <filtering>false</filtering>
   </resource>
</resources>

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<String, Object> map = new HashMap<String, Object>();
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元素

<environments default="development">
 <environment id="development">
   <transactionManager type="JDBC">
     <property name="..." value="..."/>
   </transactionManager>
   <dataSource type="POOLED">
     <property name="driver" value="${driver}"/>
     <property name="url" value="${url}"/>
     <property name="username" value="${username}"/>
     <property name="password" value="${password}"/>
   </dataSource>
 </environment>
</environments>

多表查询(一对多)

mybaits中多表查询:

数据库:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZhhNxhyv-1654725363441)(C:\Users\82053\AppData\Roaming\Typora\typora-user-images\image-20220521225832832.png)]

创建两个实体类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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 joinlesson 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)]

目的:通过stulesson_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实现里面的dogetdopost,然后创建一个类为servler的配置类,并在该类设置为配置类,在该类内将类a注册进容器中,然后通过servletRestionBeanservlet进容器容器中相当于注册一个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] = 

标签: 47frc连接器j6w连接器q24j6a连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台