目录
1.新建SpringBoot项目
新建项目 file——>new——>project
2.项目结构
3.修改项目repo
点击左上角File->Setting,然后输入maven
4.修改pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.6</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.pwd</groupId>
<artifactId>spring-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--阿里云druid数据源依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.1</version>
</dependency>
<!-- 阿里数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.67</version>
</dependency>
</dependencies>
<build>
<finalName>springboot-demo</finalName>
<!--打包后的项目名称 -->
<resources>
<resource>
<directory>src/main/resources</directory>
<targetPath>${project.build.directory}\classes</targetPath>
<excludes>
<!-- 这里不能排除config/**,这里是myeclipse的编译环境,不是打包的,排出之后, myeclipse中classpath下将找不到config,会报错 -->
<!-- <exclude>config/**</exclude> -->
</excludes>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<!-- 这里必须包含.xml否则Mybatis的xml无法打包 -->
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib</classpathPrefix>
<!-- 程序启动入口 -->
<mainClass>com.pwd.springdemo.StartApp</mainClass>
</manifest>
<manifestEntries>
<Class-Path>./</Class-Path>
</manifestEntries>
</archive>
<excludes>
<exclude>config/**</exclude>
<exclude>package.xml</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<!-- not append assembly id in release file name -->
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<!-- 注意这里的路径 -->
<descriptor>src/main/resources/package.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
5.调整项目结构及修改文件
标记java目录为Srouces Root
调整之后的文件最终如下图
1.修改application.yml
新建config目录,原application.properties改成application.yml并放到config目录下,内容如下
server:
port: 8080
servlet:
context-path: /spring-demo
# 数据源配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
#driverClassName: com.mysql.cj.jdbc.Driver 可配可不配 不配置默认自己识别
druid:
# 主库数据源
db1:
url: jdbc:mysql://ip:port/database?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Hongkong
username: username
password: password
# 初始连接数
initialSize: 5
# 最小连接池数量
minIdle: 10
# 最大连接池数量
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
webStatFilter:
enabled: true
statViewServlet:
enabled: true
# 设置白名单,不填则允许所有访问
allow:
url-pattern: /druid/*
# 控制台管理用户名和密码
login-username: admin
login-password: admin
filter:
stat:
enabled: true
# 慢SQL记录
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true
logging:
level:
com.pwd.springdemo.dao: debug
2.新建package.xml
<?xml version="1.0" encoding="UTF-8"?>
<assembly
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3">
<id>package</id>
<formats>
<format>zip</format>
</formats>
<!-- 改为false不会出现两层相同的目录 -->
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>bin</directory>
<outputDirectory>${file.separator}</outputDirectory>
</fileSet>
<fileSet>
<directory>src/main/resources</directory>
<outputDirectory>${file.separator}</outputDirectory>
<excludes>
<exclude>${zip.exclude}</exclude>
<exclude>*.xml</exclude>
<exclude>*.yml</exclude>
</excludes>
</fileSet>
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory>${file.separator}</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
<dependencySets>
<dependencySet>
<outputDirectory>lib</outputDirectory>
<scope>runtime</scope>
<!--<unpack>false</unpack> -->
<excludes>
<!--<exclude>${project.name}-${project.version}</exclude> -->
<exclude>${groupId}:${artifactId}</exclude>
</excludes>
</dependencySet>
</dependencySets>
</assembly>
3.添加UserController类
package com.pwd.springdemo.controller;
import com.alibaba.fastjson.JSONObject;
import com.pwd.springdemo.model.*;
import com.pwd.springdemo.service.IUserService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
/**
* @author pwd
* @title: UserController
* @PROJECT_NAME: springDemo
* @description: TODO
* @date 2022/1/1011:24
*/
@Controller
@RequestMapping("/user/")
public class UserController {
private static final Logger LOGGER = LogManager.getLogger();
@Autowired
private IUserService userService;
/*
* @author pwd
* @description 根据id查询用户信息
* @date 2022/1/10 17:56
* @param [id, xx]
* @return com.pwd.springdemo.model.ResultInfo
**/
@ResponseBody
@RequestMapping(value = "getUserInfoById/{id}", method = RequestMethod.GET)
public ResultInfo getUserInfoById(@PathVariable int id) {
LOGGER.info("id:" + id);
Map<String, Object> map = userService.getUserInfoById(id);
return ResultInfo.success(map);
}
@ResponseBody
@RequestMapping(value = "getUserInfoById", method = RequestMethod.POST)
public ResultInfo getUserInfoById(@RequestBody User user) {
String id = user.getUserId();
LOGGER.info("id:" + id);
UserInfoModel userInfo = userService.getUserInfoById2(Integer.valueOf(id));
return ResultInfo.success(userInfo);
}
@ResponseBody
@RequestMapping(value = "deleteUserInfoById", method = RequestMethod.POST)
public ResultInfo deleteUserInfoById(@RequestBody JSONObject jsonObject) {
Integer id = jsonObject.getInteger("id");
LOGGER.info("id:" + id);
userService.deleteUserInfoById(id);
return ResultInfo.success(null);
}
@ResponseBody
@RequestMapping(value = "addUser", method = RequestMethod.GET)
public ResultInfo addUser() {
UserInfoModel userInfoModel = new UserInfoModel();
userInfoModel.setDevicever("sada");
userInfoModel.setOsver("sda");
boolean flag = userService.addUser(userInfoModel);
return ResultInfo.success(flag);
}
@ResponseBody
@RequestMapping(value = "addUsers", method = RequestMethod.GET)
public ResultInfo addUsers() {
UserInfoModel userInfoModel = new UserInfoModel();
userInfoModel.setDevicever("sada");
userInfoModel.setOsver("sda");
UserInfoModel userInfoModel2 = new UserInfoModel();
userInfoModel2.setDevicever("sad2a");
userInfoModel2.setOsver("sda2");
List<UserInfoModel> list = new ArrayList<UserInfoModel>();
list.add(userInfoModel);
list.add(userInfoModel2);
boolean flag = userService.addUsers(list);
return ResultInfo.success(flag);
}
@ResponseBody
@RequestMapping(value = "updateUser", method = RequestMethod.GET)
public ResultInfo updateUser() {
UserInfoModel userInfoModel = new UserInfoModel();
userInfoModel.setDevicever("sadaxx");
userInfoModel.setOsver("sdaxx");
boolean flag = userService.updateUser(userInfoModel);
return ResultInfo.success(flag);
}
}
4.添加IUserInfoService接口
package com.pwd.springdemo.service;
import com.pwd.springdemo.model.UserInfoModel;
import java.util.Map;
/**
* @author pwd
* @title: IUserService
* @PROJECT_NAME: springDemo
* @description: TODO
* @date 2022/1/1011:28
*/
public interface IUserService {
Map<String,Object> getUserInfoById(int id);
UserInfoModel getUserInfoById2(int id);
boolean deleteUserInfoById(int id);
boolean addUser(UserInfoModel userInfoModel);
boolean addUsers(List<UserInfoModel> userInfoModels);
boolean updateUser(UserInfoModel userInfoModel);
}
5.添加UserInfoServiceImpl实现类
package com.pwd.springdemo.service.impl;
import com.pwd.springdemo.dao.UserMapper;
import com.pwd.springdemo.model.UserInfoModel;
import com.pwd.springdemo.service.IUserService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
/**
* @author pwd
* @title: UserServiceImpl
* @PROJECT_NAME: springDemo
* @description: TODO
* @date 2022/1/1011:29
*/
@Service
public class UserServiceImpl implements IUserService {
private static final Logger LOGGER = LogManager.getLogger();
@Autowired
private UserMapper userMapper;
@Override
public Map<String, Object> getUserInfoById(int id) {
Map<String, Object> map = new HashMap<>();
try {
map = userMapper.getUserInfoById(id);
}catch (Exception e){
LOGGER.error("",e);
}
return map;
}
@Override
public UserInfoModel getUserInfoById2(int id) {
UserInfoModel userInfo = new UserInfoModel();
try {
userInfo = userMapper.getUserInfoById2(id);
}catch (Exception e){
LOGGER.error("",e);
}
return userInfo;
}
@Override
public boolean deleteUserInfoById(int id) {
userMapper.deleteUserInfoById(id);
return true;
}
@Override
public boolean addUser(UserInfoModel userInfoModel) {
boolean flag = false;
int effectRows = 0;
try {
effectRows = userMapper.addUser(userInfoModel);
}catch (Exception e){
LOGGER.error("",e);
}
if(effectRows>0){
flag=true;
}
return flag;
}
@Override
public boolean addUsers(List<UserInfoModel> userInfoModels) {
boolean flag = false;
int effectRows = 0;
try {
effectRows = userMapper.addUsers(userInfoModels);
}catch (Exception e){
LOGGER.error("",e);
}
if(effectRows>0){
flag=true;
}
return flag;
}
@Override
public boolean updateUser(UserInfoModel userInfoModel) {
boolean flag = false;
int effectRows = 0;
try {
effectRows = userMapper.updateUser(userInfoModel);
}catch (Exception e){
LOGGER.error("",e);
}
if(effectRows>0){
flag=true;
}
return flag;
}
}
6.添加UserMapper
package com.pwd.springdemo.dao;
import com.pwd.springdemo.model.UserInfoModel;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.Map;
/**
* @author pwd
* @title: UserMapper
* @PROJECT_NAME: springDemo
* @description: TODO
* @date 2022/1/1011:30
*/
@Mapper
public interface UserMapper {
Map<String,Object> getUserInfoById(@Param("id") int id);
UserInfoModel getUserInfoById2(@Param("id") int id);
int deleteUserInfoById(@Param("id") int id);
int addUser(UserInfoModel userInfoModel);
int addUsers(List<UserInfoModel> list);
int updateUser(UserInfoModel userInfoModel);
}
7.添加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">
<mapper namespace="com.eebbk.da.locationsimulationapi.dao.UserMapper">
<select id="getUserInfoById" resultType="map">
select devicever,osver from t_test where id=#{id} limit 1
</select>
<select id="getUserInfoById2" resultType="com.eebbk.da.locationsimulationapi.model.UserInfoModel">
select devicever,osver from t_test where id=#{id} limit 1
</select>
<delete id="deleteUserInfoById" parameterType="int">
delete from t_test where id=#{id}
</delete>
<insert id="addUser" parameterType="com.eebbk.da.locationsimulationapi.model.UserInfoModel"
flushCache="true" keyProperty="id" useGeneratedKeys="true" >
insert into
t_test(devicever,osver)
values(#{devicever},#{osver})
</insert>
<insert id="addUsers" parameterType="com.eebbk.da.locationsimulationapi.model.UserInfoModel"
flushCache="true" useGeneratedKeys="true">
insert into
t_test(devicever,osver)
values
<foreach collection="list" item="item" separator=",">
(#{item.devicever},#{item.osver})
</foreach>
</insert>
<update id="updateUser" flushCache="true">
update t_test set devicever=#{devicever} , osver=#{osver} where id=1
</update>
</mapper>
8.添加DB1DataSourceConfig
package com.pwd.springdemo.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import com.pwd.springdemo.model.DruidProperties;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
/**
* @ClassName Db1DataSource
* @Description TODO
* @AUTHOR pwd
* @DATE 2022/4/13 16:23
**/
@Configuration
@MapperScan(basePackages = "com.pwd.springdemo.dao", sqlSessionTemplateRef = "db1SqlSessionTemplate")
public class DB1DataSourceConfig {
@Bean("db1DataSource")
@ConfigurationProperties(prefix = "spring.datasource.druid.db1") //读取application.yml中的配置参数映射成为一个对象
@Primary
public DataSource getDataSource(DruidProperties druidProperties){
DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
return druidProperties.dataSource(dataSource);
}
@Bean("db1SqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);;
return bean.getObject();
}
@Bean("db1SqlSessionTemplate")
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
return new SqlSessionTemplate(sqlSessionFactory);
}
}
9.添加DruidProperties
package com.pwd.springdemo.model;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
/**
* @ClassName DruidProperties
* @Description TODO
* @AUTHOR pwd
* @DATE 2022/4/14 14:23
**/
@Configuration
public class DruidProperties {
@Value("${spring.datasource.druid.initialSize}")
private int initialSize;
@Value("${spring.datasource.druid.minIdle}")
private int minIdle;
@Value("${spring.datasource.druid.maxActive}")
private int maxActive;
@Value("${spring.datasource.druid.maxWait}")
private int maxWait;
@Value("${spring.datasource.druid.timeBetweenEvictionRunsMillis}")
private int timeBetweenEvictionRunsMillis;
@Value("${spring.datasource.druid.minEvictableIdleTimeMillis}")
private int minEvictableIdleTimeMillis;
@Value("${spring.datasource.druid.maxEvictableIdleTimeMillis}")
private int maxEvictableIdleTimeMillis;
@Value("${spring.datasource.druid.validationQuery}")
private String validationQuery;
@Value("${spring.datasource.druid.testWhileIdle}")
private boolean testWhileIdle;
@Value("${spring.datasource.druid.testOnBorrow}")
private boolean testOnBorrow;
@Value("${spring.datasource.druid.testOnReturn}")
private boolean testOnReturn;
public DruidDataSource dataSource(DruidDataSource datasource)
{
/** 配置初始化大小、最小、最大 */
datasource.setInitialSize(initialSize);
datasource.setMaxActive(maxActive);
datasource.setMinIdle(minIdle);
/** 配置获取连接等待超时的时间 */
datasource.setMaxWait(maxWait);
/** 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 */
datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
/** 配置一个连接在池中最小、最大生存的时间,单位是毫秒 */
datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
datasource.setMaxEvictableIdleTimeMillis(maxEvictableIdleTimeMillis);
/**
* 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。
*/
datasource.setValidationQuery(validationQuery);
/** 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 */
datasource.setTestWhileIdle(testWhileIdle);
/** 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */
datasource.setTestOnBorrow(testOnBorrow);
/** 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */
datasource.setTestOnReturn(testOnReturn);
return datasource;
}
}
10.添加ResultInfo
package com.pwd.springdemo.model;
import java.io.Serializable;
public class ResultInfo implements Serializable{
/**
*
*/
private static final long serialVersionUID = -4131132604020467622L;
private int code;
private String message;
private Object data;
public ResultInfo(ResultCode resultCode, Object data){
this.code= resultCode.getCode();
this.message = resultCode.getMessage();
this.data = data;
}
public static ResultInfo success(Object data){
ResultInfo result = new ResultInfo(ResultCode.SUCCESS, data);
return result;
}
public static ResultInfo error(String message){
ResultInfo result = new ResultInfo(ResultCode.FAIL,null);
return result;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
11.添加ResultCode
package com.pwd.springdemo.model;
public enum ResultCode {
SUCCESS(200,"成功"),
FAIL(400,"失败");
private int code;
private String message;
ResultCode(int code,String message) {
this.code=code;
this.message=message;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
12.添加UserInfoModel
package com.pwd.springdemo.model;
/**
* @author pwd
* @title: UserInfoModel
* @PROJECT_NAME: springDemo
* @description: TODO
* @date 2022/1/1015:20
*/
public class UserInfoModel {
private String devicever;
private String osver;
public String getDevicever() {
return devicever;
}
public void setDevicever(String devicever) {
this.devicever = devicever;
}
public String getOsver() {
return osver;
}
public void setOsver(String osver) {
this.osver = osver;
}
}
13.添加User
package com.pwd.springdemo.model;
/**
* @ClassName User
* @Description TODO
* @AUTHOR pwd
* @DATE 2022/2/22 14:31
**/
public class User {
private String userId;
private String userName;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
14.添加StartApp
SpringDemoApplication改成StartApp
package com.pwd.springdemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.stereotype.Component;
@SpringBootApplication
@Component("com.pwd")
@ServletComponentScan("com.pwd")
public class StartApp {
public static void main(String[] args) {
SpringApplication.run(StartApp.class, args);
}
}