Java和Spring
推荐链接
Java
安装JDK
确保从 Oracle官网下载最新的稳定版JDK
安装完JDK后,需要设置一个JAVA_HOME的环境变量,它指向JDK的安装目录。它是安装目录,类似:C:\Program Files\Java\jdk\jdk-21 (注意:jdk和jdk-21两个文件都是手动创建的,为了更好的区分不同版本jdk)
然后,把JAVA_HOME的bin目录附加到系统环境变量PATH上。
Path=%JAVA_HOME%\bin;<现有的其他路径>
完成后,进入cmd窗口输入 java -version 如果一切正常会显示对应版本号,如果你看到的版本号不是21,而是15、1.8之类,说明系统存在多个JDK,且默认JDK不是JDK 21,需要把JDK 21提到PATH前面
第一个Java程序
//文件名必须是HelloWorld.java,而且文件名也要注意大小写,因为要和我们定义的类名HelloWorld 完全保持一致。
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
}
//Java源码本质上是一个文本文件,我们需要先用javac把Hello.java编译成字节码文件Hello.class,然后,用java命令执行这个字节码文件
cd xxxx //进入java文件目录
javac HelloWorld.java //当前目录下会产生一个HelloWorld.class文件
java HelloWorld //不用带class
Spring Boot
规范目录结构
项目根目录/src/main/java:放置项目Java源代码
项目根目录/src/main/resources:放置项目静态资源和配置文件
项目根目录/src/test/java:放置项目测试用例代码
///src/main/java
|_annotation:放置项目自定义注解
|_aspect:放置切面代码
|_config:放置配置类
|_constant:放置常量、枚举等定义
|__consist:存放常量定义
|__enums:存放枚举定义
|_controller:放置控制器代码
|_filter:放置一些过滤、拦截相关的代码
|_mapper:放置数据访问层代码接口
|_model:放置数据模型代码
|__entity:放置数据库实体对象定义
|__dto:存放数据传输对象定义
|__vo:存放显示层对象定义
|_service:放置具体的业务逻辑代码(接口和实现分离)
|__intf:存放业务逻辑接口定义
|__impl:存放业务逻辑实际实现
|_utils:放置工具类和辅助代码
///src/main/resources
|_mapper:存放mybatis的XML映射文件(如果是mybatis项目)
|_static:存放网页静态资源,比如下面的js/css/img
|__js:
|__css:
|__img:
|__font:
|__等等
|_template:存放网页模板,比如thymeleaf/freemarker模板等
|__header
|__sidebar
|__bottom
|__XXX.html等等
|_application.yml 基本配置文件
|_application-dev.yml 开发环境配置文件
|_application-test.yml 测试环境配置文件
|_application-prod.yml 生产环境配置文件
XML
<?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">
<!--mybatis-3-mapper.dtd:约束文件的名称,限制和检查在当前文件中出现的标签和属性符合mybatis的要求-->
<!--namespace:命名空间,要有唯一的值,要求使用dao接口的权限定名称(一个dao接口对应一个mapper,namespace指明对应哪个dao接口)-->
<mapper namespace="com.jxd.emp.dao.IEmpDao">
<!-- 所有的数据库操作都要写在mapper标签中,可以使用特定的标签表示数据库中的特定操作 -->
</mapper>
数据库配置
相关依赖
mysql
//在新建springboot项目时候勾选了mysql驱动就会自动下载下面spring配置的默认驱动,通常情况下mysql依赖版本比较高
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
//这里配置mysql8.x版本
//如果mysql5.7依赖无法下载,可以进行使用则进行平替
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
//<version>8.0.27</version>
</dependency>
//5.1.x版本的msyql依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
JPA
//import javax.persistence.*;
/**
Jakarta EE 8 以上版本使用以下引入
import jakarta.persistence.*;
*/
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
错误级别
日志级别可以按照以下顺序排列(从高到低):ERROR > WARN > INFO > DEBUG > TRACE。因此,将日志级别设置为 WARN 表示只输出警告级别及更高级别的日志消息。
logging.level 是用于指定日志级别的属性,root 表示根日志记录器。
通过将 logging.level.root 的值设置为 WARN,你告诉日志框架只输出警告级别(WARN)及以上的日志消息,而忽略更低级别的消息。这样可以降低日志输出的数量,只显示警告、错误和严重级别的日志。
application.properties
#当版本为spring boot 2.0(内置jdbc5驱动)
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/数据库名称?characterEncoding=utf-8&useSSL=false
#用户名称
spring.datasource.username=root
# 数据库密码
spring.datasource.password=root
------------------------------------------------------------------------------
注意:driver和url的变化
------------------------------------------------------------------------------
#当版本为spring boot 2.1及以上(内置jdbc8驱动)
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/数据库名称?serverTimezone=GMT%2B8
#用户名称
spring.datasource.username=root
# 数据库密码
spring.datasource.password=root
# JPA 配置
//这个属性指定了 Hibernate 使用的数据库方言。在这种情况下,它告诉 Hibernate 使用 MySQL x.x 版本的方言,注意自己springboot引用的mysql依赖,以确保与数据库的兼容性。
#5.7.x
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
#8.x
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
#这个属性用于指定是否在控制台上显示生成的 SQL 语句。当设置为 true 时,Hibernate 会将执行的 SQL 语句输出到控制台,方便调试和查看生成的 SQL。
spring.jpa.show-sql=true
#这个属性用于指定 Hibernate 在启动时对数据库表的自动操作。update 表示 Hibernate 会根据实体类的定义自动更新数据库表结构,但不会删除或重建表。这意味着如果表不存在,Hibernate 会尝试创建它;如果表已经存在,则会根据实体类的定义更新表结构。
spring.jpa.hibernate.ddl-auto=update
# mybatis
#实体类别名
#mybatis.type-aliases-package 是一个配置项,用于指定类型别名的包路径。
#com.springboot.pojo 是具体的包路径,表示要扫描的包路径,其中包含了需要使用的实体类。
#这样配置后,在映射文件中的 resultType 属性中可以直接使用 实体类的类名
mybatis.type-aliases-package=com.springboot.pojo
#映射文件的位置
#mybatis.mapper-locations 是一个配置项,用于指定 MyBatis 映射文件的位置。
#classpath: 是一个前缀,表示从类路径中查找资源。在 Spring Boot 中,类路径指的是项目的 resources 目录。
#mapper/ 是指映射文件所在的相对路径。这里假设映射文件位于 resources 目录下的 mapper 目录中。
#*.xml 是通配符,表示所有以 .xml 结尾的文件。这里表示所有以 .xml 结尾的文件都会被视为 MyBatis 的映射文件。
mybatis.mapper-locations=classpath:mapper/*.xml
# 端口
#修改SpringBoot应用程序在 web 端的端口
server.port=9090
# 端口号设置为 0,表示让操作系统自动分配一个可用的端口号
server.port=0
#将日志级别设置为更高(如WARN或ERROR),以减少输出的日志数量
logging.level.root=WARN
测试数据库是否链接成功
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
//import org.junit.runner.RunWith;
//import org.springframework.test.context.junit4.SpringRunner;
//@RunWith(SpringRunner.class)
@SpringBootTest
public class DatabaseConnectionTest {
@Autowired
private JdbcTemplate jdbcTemplate;
@Test
public void testDatabaseConnection() {
//如果测试通过并输出了预期的结果,那么说明数据库连接配置正确,并且应用程序能够成功连接到数据库。
//执行测试方法看日志最后是否出现:Database connection successful. Result: 1,日志上方爆红的警告不用管
//第二条 SELECT VERSION(); ,查询后可以知道链接数据库的版本,再次执行后观察是否跟第一次查询结果不同
//如果测试数据库链接失败,试一试把上面注解和引用的注释给去除掉,然后再次试一下。
String result = jdbcTemplate.queryForObject("SELECT 1;", String.class);
//查看数据库版本
// String result = jdbcTemplate.queryForObject("SELECT VERSION();", String.class);
System.out.println("Database connection successful. Result: " + result);
}
}
创建实体类
@Data // 自动生成 getter、setter、equals、hashCode 和 toString 方法
@AllArgsConstructor //自动生成一个包含所有类字段的全参构造方法。
@NoArgsConstructor //自动生成一个无参构造方法。
@Enabled // 假设这是一个自定义注解,根据你的需求来定义其作用
@Table(name = "tb_user") // 指定数据库表的名称
public class User {
@Id // 标识为主键
@GeneratedValue(strategy = GenerationType.IDENTITY) // 指定主键生成策略为自增
private Integer id;
private String name;
private String creator;
private LocalDateTime createTime;
}
创建控制层(Controller)
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
@RestController
public class UserController {
@GetMapping("/hello")
public String hello(){
return "GET: Hello, Spring Boot!";
}
@PostMapping("/hello")
public String hello(@RequestBody String name) {
return "POST: Hello, " + name + "!";
}
@GetMapping("/hello/{id}/{name}")
public String helloGet(@PathVariable Integer id,@PathVariable String name){
//路径参数@PathVariable
return "GET: Hello, " + "id :" + id + "name :" + name;
}
@PostMapping("/helloPost")
public String helloPost(@RequestParam(name = "username",required = false) String name){
//设置@RequestParam(name = "username",required = false) 参数传递过来是username键名称,取消必填
return "POST: Hello, Spring Boot!";
}
@GetMapping("/helloTime")
public String helloTime(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime createTime){
//控制时间参数的格式
return "Hello " + createTime;
}
}
创建数据层(DOA)(Mapper)
import com.springboot.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface UserMapper {
List<User> getAll();
}
//dao层对应的xml方法,所在位置 src/main/resources/mapper/UserMapper.xml
<?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">
<!--mybatis-3-mapper.dtd:约束文件的名称,限制和检查在当前文件中出现的标签和属性符合mybatis的要求-->
<!--namespace:命名空间,要有唯一的值,要求使用dao接口的权限定名称(一个dao接口对应一个mapper,namespace指明对应哪个dao接口)-->
<mapper namespace="com.springboot.mapper.UserMapper">
<!-- 所有的数据库操作都要写在mapper标签中,可以使用特定的标签表示数据库中的特定操作 -->
<select id="getAll" resultType="User">
select user_id,user_login,user_name,user_description,create_time from tb_user
</select>
</mapper>
创建业务逻辑层(Service)
import com.springboot.pojo.User;
import java.util.List;
public interface UserService {
List<User> getAll();
}
//实现业务层接口
import com.springboot.mapper.UserMapper;
import com.springboot.pojo.User;
import com.springboot.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public List<User> getAll() {
return userMapper.getAll();
}
}
彩蛋
只需要在 Spring Boot 工程的 /src/main/resources 目录下创建一个 banner.txt 文件,然后将 ASCII 字符画复制进去,就能替换默认的 banner 了
${AnsiColor.BRIGHT_RED}:设置控制台中输出内容的颜色
${application.version}:用来获取MANIFEST.MF文件中的版本号
${application.formatted-version}:格式化后的${application.version}版本信息
${spring-boot.version}:Spring Boot的版本号
${spring-boot.formatted-version}:格式化后的${spring-boot.version}版本信息
${AnsiColor.BRIGHT_YELLOW}
┏━┓ ┏━┓
┏┛ ┻━━━━━┛ ┻┓
┃ ┃
┃ ━ ┃
┃ ┳┛ ┗┳ ┃
┃ ┃
┃ ┻ ┃
┃ ┃
┗━┓ ┏━━━┛
┃ ┃ 神兽保佑
┃ ┃ 代码无BUG!
┃ ┗━━━━━━━━━┓
┃ ┣┓
┃ ┏┛
┗━┓ ┓ ┏━━━┳ ┓ ┏━┛
┃ ┫ ┫ ┃ ┫ ┫
┗━┻━┛ ┗━┻━┛
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
${AnsiColor.BRIGHT_YELLOW}
// _ooOoo_ //
// o8888888o //
// 88" . "88 //
// (| ^_^ |) //
// O\ = /O //
// ____/`---'\____ //
// .' \\| |// `. //
// / \\||| : |||// \ //
// / _||||| -:- |||||- \ //
// | | \\\ - /// | | //
// | \_| ''\---/'' | | //
// \ .-\__ `-` ___/-. / //
// ___`. .' /--.--\ `. . ___ //
// ."" '< `.___\_<|>_/___.' >'"". //
// | | : `- \`.;`\ _ /`;.`/ - ` : | | //
// \ \ `-. \_ __\ /__ _/ .-` / / //
// ========`-.____`-.___\_____/___.-`____.-'======== //
// `=---=' //
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //
// 佛祖保佑 永不宕机 永无BUG //
I DIDN'T LISTEN TO MY
MOTHER ABOUT CROSSING
MY EYES SO THEY STUCK
THIS WAY
HOLY GOD I NEED TOOL
\ .::::::`.::::::::::..
\ .''``````.:::::::::::::::::
\ .:',ere$ze c :::::::::::::::::::
\ ,'` e$$$$$$$-K eeeu...`````:::::::::
.zd>^leeu^R$%:FJ$$$$$$$$$$e.. ``::::::
.ed$$$$4$$$$$P-u@" ""?????R$$$$$$$hc. ``:::
.e$$F"..: P??7loF .:::::::::::.."""?R$$$e. `:.
zF".:::::::`"""'.:::::::::::::::::::::.`"?$$e.`
.::::::::::::':::::::::::::::::::::::::::::.`"=.
.:::::::::::::` `:::::::::::::::::::::::::::::::..
.:::::::::::::` ud$ec. ``:::::::::::::::::::::::::::::.
.:::::::::::`` .zd$$$$$$$ec.. ```::::::::::::::::::::::::::
.:::::::::::` "??$$$$$$$$$$$P ``::::::::::::::::::::::
::::::::::` .. $$*. ^$$$$$$$$$$ .e$**"" =e=.. ``::::::::::::::::.
::::::::: :::. . ^ $$P$$$$$$$$$$F .'$$$N4$$L'::. `:::::::::::::::
`::::::` :::::: $ '$$4$$$$$$$$% - : $$$F$$$$u`::::::. `:::::::::::.
:::::: :::::: .^m.-.e.$'$$$$$$$P. -)z$?Cd$$$$$u `:::::::. `:::::::::
`::::::::::: J$buFh52d4$$$$$$$LcccccCz$$$$$$$$": `::::::::..:::::::::
`::::::::: $$$$$$$$PJ$$$$$$$$$$$$$$$$$$$$$F.d$$. `::::::::::::::::`
`:::::: ?$$$$$$$F$$$$$$$$$$$$$$$$$$$$P x$$$$$$L `::::::::::::::
``:: dN ?$$$$$$N2$$?3$$$$$$$$$$$$$$P dP\$$$$$$$u `::::::::::::
`:'" $.`R$$P???$$P??????"$$$$$$$$ 9".d$$$$$$$$b.`::::::::::
:: R$$. ?$$r `..;; . $$$$$$$F"'$'$J?$$$$$$$f ::::::::
`:.^""""""."?$`niiiodfu$$$$$F"z$$ ^""~""""`..:::: ::::::
`::::::::::`?beCCbe$$$$""cd$$$$i .`::::::::::::. `:::`
``:::::::::`?$$$P"',cd$$$$$$$$r?k :::::::::::`.:::`
```::::::::: 4$$$$$$$$$$$$$"d$ ``::::::::::::`
``::: . $$$$$$$$$$$$fJ$F4$e.``:::::::`
dR `$$$$$$$$$$"x$$ d$$$$eu,.```
.e$ $E b?$$$$$$$".d$$ d$$$$$$$$$$$e..
..ee$$$$$ $$k`$$$$$$".d$$".$$$$$$$$$$$$$$$$$$hec.
.ze$$$$$$$$$$$b"$$heeeeeud$R" e$$$$$$$$$$$$$$$$$$$$$$$$$e.
z$$$$$$$$$$$$$$$$$$h`?c""""J$R z$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
.ee$$$$$$$$$$$$$$$$$$$$$$hc"xJ>=".zd$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
.d$$$$$$$$$$$$$$$$$$$$$$$$$$$$he$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$