技术标签: spring boot springboot
优点:
spring:集成其他框架,实现IOC(通过spring创建对象管理对象)、DI依赖注入、解耦合(主键)、AOP(切面编程)
springMVC:基于MVC模式开发web应用
MyBatis:对JDBC的封装(提高开发效率简化代码,但原生的JDBC访问效率更高)
缺点:配置文件多,配置繁琐,配置依赖包多
springboot是对spring的封装,简化SSM配置,不关注框架配置,在SSM框架的基础上提供了更简洁的开发模式,将更多的时间用于业务开发。
访问官网 https://spring.io/ ,点击Projects下的Spring Boot
点击Learn下的Spring Initializr
填写项目信息完成项目创建。
springboot内置tomcat,可以打jar包运行在tomcat里。
打开IDEA,new project,选择Spring Initializr
填写项目信息
加入Spring Web、MyBatis Framework、MySQL Driver
点击finish完成springboot项目创建
打开文件目录,右键运行SmashingApplication
出现错误
将pom.xml下的mybatis先注释掉再运行就好了
运行成功
SmashingApplication:主启动类
pom.xml文件下
先运行.yml文件,最后运行.properties文件,所以两者同时存在时,.properties文件会对.yml文件覆盖。
命名应遵从如下规则:
(更多的配置可以百度)如:
#改变默认端口
server.port=8080
#访问路径前加/admin
server.servlet.context-path=/admin
#配置数据库
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/smashing?characterEncoding=utf8
spring.datasource.name=root
spring.datasource.password=123456
先在pom.xml文件里导入连接池,这里导入的是alibaba
新建 .yml 文件
server:
port: 8066
servlet:
context-path: / #server.servlet.context-path=/login
#jdbc:mysql://localhost:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
spring:
datasource:
#引入druid数据源
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/smashing?characterEncoding=utf8
username: root
password: 123456
#配置视图 前缀 后缀 static 相当于根目录
mvc:
view:
prefix: /
suffix: .html
mybatis:
type-aliases-package: com.fk.smashing.pojo #实体类的别名
mapper-locations: classpath:/mappers/*.xml #映射文件路径
#开启驼峰映射
configuration:
map-underscore-to-camel-case: true
#表字段 user_id user_name
#实体类 userId userName
#即 驼峰映射规则把数据库里 ”表名“ “_” “小写字母开头的属性”
#变成实体类 ”表名“ “大写字母开头的属性”
用logback取代了log4j
在resources下新建logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<property name="LOG_FILE_NAME_PATTERN" value="logs/auth.%d{yyyy-MM-dd}.%i.log"/>
<!-- 日志格式 -->
<property name="CONSOLE_LOG_PATTERN"
value="%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%c){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
<property name="FILE_LOG_PATTERN"
value="%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %c : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
<!--输出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<!--输出到文件-->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE_NAME_PATTERN}</fileNamePattern>
<!-- 日志保留天数 -->
<maxHistory>366</maxHistory>
<!-- 日志文件上限大小,达到指定大小后删除旧的日志文件 -->
<totalSizeCap>2GB</totalSizeCap>
<!-- 每个日志文件的最大值 -->
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- (多环境配置日志级别)根据不同的环境设置不同的日志输出级别 -->
<springProfile name="default,local">
<root level="info">
<appender-ref ref="console"/>
</root>
<logger name="com.fk" level="debug"/>
</springProfile>
<springProfile name="dev,test">
<root level="info">
<appender-ref ref="console"/>
<appender-ref ref="file"/>
</root>
<logger name="com.fk" level="debug"/>
</springProfile>
<springProfile name="product,pre">
<root level="info">
<appender-ref ref="console"/>
<appender-ref ref="file"/>
</root>
<logger name="com.fk" level="debug"/>
</springProfile>
</configuration>
注意,pojo、controller等包必须在主启动类SmashingApplication的平级或者子集里,才能被spring容器扫描到
若出现错误:
因为mysql版本问题,在依赖里加入自己设置的版本,覆盖原来版本即可。
在controller包里新建TestController.java
package com.fk.smashing.controller.before;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class TestController {
@GetMapping("/test")
public String testPage(){
return "test";//test.html
}
}
在static目录下新建test.html,在body标签里输入“SpringMVC配置成功”来进行测试
输入 http://localhost:8066/test 返回test.html视图,测试成功
pojo包里新建User类
package com.fk.smashing.pojo;
import org.springframework.stereotype.Component;
@Component
public class User {
}
在SmashingApplicationTests里或者新建测试类进行测试
package com.fk.smashing;
import com.fk.smashing.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SmashingApplicationTests {
@Autowired//将User注入到测试类里
private User user;
@Test
public void test1(){
System.out.println(user);
}
@Test
void contextLoads() {
}
}
如果测试失败,可能因为版本低,在@SpringBootTest下加注解@RunWith
运行。测试成功,打印了User地址
导入lombok包,在实体类里加入注解@Data,则无需添加get()、set()、toString()方法。
<!--lombok jar 包-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
package com.fk.smashing.pojo;
import lombok.Data;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
//导入lombok包,加入注解@Data,无需添加get()、set()、toString()方法
@Data
public class User {
private Integer uid;
private String username;
private String password;
private String salt;
private String tel;
private String email;
private String sex;
private String avatar;
private Integer isDelete;
private Date createTime;
private Date modifyTime;
private String CreateUser;
private String modifiedUser;
}
package com.fk.smashing.mapper.before;
import com.fk.smashing.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface Usermapper {
//查询所有用户数据
List<User> findAllUsers();
}
<?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.fk.smashing.mapper.before.Usermapper">
<select id="findAllUsers" resultType="User">
/*如 is_delete别名isDelete,如果用 * 无法将is_delete和isDelete封装回来*/
select uid,username,salt,tel,email,sex,avatar,is_delete isDelete,
createTime,modifyTime,Create_user CreateUser,modified_user modifiedUser from tb_user
</select>
</mapper>
package com.fk.smashing;
import com.fk.smashing.mapper.before.Usermapper;
import com.fk.smashing.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
class SmashingApplicationTests {
//测试持久层
@Autowired(required = false)//required = false不一定需要
private Usermapper usermapper;
@Test
public void test1(){
List<User> list = usermapper.findAllUsers();
for(User user:list){
System.out.println(user);
}
}
@Test
void contextLoads() {
}
}
测试成功,查询数据库里的所有user信息并打印
文章浏览阅读620次。dicom图像处理DICOM(Digital Imaging and Communications in Medicine)即医学数字成像和通信。DICOM被广泛应用于放射医疗,心血管成像以及放射诊疗诊断设备(X射线,CT,核磁共振,超声等)。本文主要对dicom图像进行处理。使用工具pycharm,python3pycharm下载地址:python3下载地址:pycharm环境搭建:第三方工具库..._最大值
文章浏览阅读959次,点赞22次,收藏25次。Gemini Ultra具有最先进的性能,在几个指标上超过了GPT-4的性能。它是第一个在大规模多任务语言理解基准测试中超越人类专家的模型,该基准测试57个不同学科的世界知识和解决问题的能力。Gemini是谷歌迄今为止开发的最先进、最庞大的AI模型。它为多模态而建,理解并处理不同类型的数据,比如文本、代码、音频、图像和视频。下面我们将加载Masood Aslami的图像,并用它来测试Gemini Pro Vision的多模态性。有了Gemini可以为查询提供图像、音频和文本,获得几乎完美的答案。
文章浏览阅读1.7k次。时常有人在知乎、百度等平台抛出问题:程序员过了 35 岁(或 40 岁)是不是就失去了竞争力,要转管理岗了吗?当然不是。2018年程序员们将有更多的机会和前景。2018年..._35岁了能从事云计算吗
文章浏览阅读1.5k次。我们的输入输出最终都是访问硬件,OS是操作系统的管理者我们使用的都是语言层面上的接口,所以的“语言”上的操作,都必须贯穿OS。然而操作系统不相信任何人,所以访问操作系统都是需要通过系统调用的接口的。因此几乎所有的语言fopen,fclose,fread,fwrite,fgets,fputs,fgetc,fputc等底层一定需要使用OS提供的系统调用上面的 fopen fclose fread fwrite 都是C标准库当中的函数,我们称之为库函数(libc)。而,_操作系统fd和fds的区别
文章浏览阅读3.4k次。编者按:以下这篇文章,其实是笔者2018年初发表在《业界良新》上的三篇转型文章的合集。这次重新汇总呈现给大家,一方面是给传统汽车产业需要转型的朋友做个转型参考,另一方面,也是给接下来的两篇..._汽车工程师怎么跨界
文章浏览阅读204次。#include <iostream>#include <vector>#include <queue>using namespace::std;typedef pair<int, int> pii;// BFS,并用dp[]辅助保存已经得到最短步数的节点int N, K;int bfs(void) { if (N >=..._poj3278 c语言
文章浏览阅读1.1k次,点赞30次,收藏18次。椭圆曲线密码学 (ECC) 是一种基于椭圆曲线数学的公开密钥加密算法。它提供了一种执行。继续阅读,进一步了解椭圆曲线密码学,以及为何它被认为是最安全的加密形式。_ecc和rsa
文章浏览阅读534次,点赞11次,收藏11次。基于Springboot的摄影分享网站系统(有报告)。Javaee项目,springboot项目。数据库作为系统数据储存平台,实现了基于B/S结构的Web系统。界面简洁,操作简单。采用M(model)V(view)C(controller)三层体系结构,通过。
文章浏览阅读462次。小书匠 深度学习文章目录:在经常性读取大量的数值文件时(比如深度学习训练数据),可以考虑现将数据存储为Numpy格式,然后直接使用Numpy去读取,速度相比为转化前快很多.下面就常用的保存数据到二进制文件和保存数据到文本文件进行介绍:1.保存为二进制文件(.npy/.npz)保存一个数组到一个二进制的文件中,保存格式是.npy参数介绍numpy.save(file, arr, allow_pick..._python sav
文章浏览阅读321次。原博文:minfanphd任务计划第61天:决策树 (1. 准备工作)第61天:决策树 (1. 准备工作)决策树是最经典的机器学习算法. 其实我不想在后面加上"之一". 它有非常好的可解释性.数据仅有一份. 分裂后的数据子集仅需要保存 availableInstances 和 availableAttributes 两个数组.两个构造方法, 一个读入文件获得根节点, 另一个建立根据数据分裂的获得.判断数据集是否纯, 即所有的类标签是否相同, 如果是就不用分裂了.每个节点 (包括非叶节点) 都_java300行 密度
文章浏览阅读2.1w次,点赞3次,收藏9次。中控考勤机软件可以将考勤机记录实时下载到本地数据库里, 很让人恼怒的是考勤机软件经常与设备断开连接,断开还不会自动重连, 可考前太差了,之前的几种方案也都无从谈起了。 苦思之后,想起直接用考勤机ip访问有web页面。所以有了上面的代码。跨过考勤机软件。只要你的考勤机是中控系列并且能够使用考勤机IP打开web界面就可以使用下面方法,稳定、高效,强烈推荐!使用方法:1, 将代码总 19_通达oa连接中控考勤
文章浏览阅读7.6k次,点赞2次,收藏10次。想了很久还是发上来吧,烂在硬盘里面没用,共享既是进步~前排感谢在我学习Intel-VT技术困难的时候各位朋友的帮助Tesla.Angela有人吗?cvcvxkviphacksxppKalong 以及国外友人asamy以上排名不分先后这份代码在WIN7 64 打了补丁的情况下能正常工作 不打补丁需要对THREAD的结构体做个修改 才可以正常运行代码部分:这_vt调试是用什么语言写的