码迷,mamicode.com
首页 > 编程语言 > 详细

SpringBoot快速入门(实战篇二)

时间:2020-12-18 12:21:34      阅读:2      评论:0      收藏:0      [点我收藏+]

标签:创建工程   mongod   图片   wired   不同的   initial   ppi   更新   control   

SpringBoot快速入门(二 )

一 SpringBoot与其他框架集成

1 集成mybatis

需求

? 使用MyBatis实现查询所有用户信息

1.0步骤
  • 0.数据库表准备
  • 1.搭建springboot工程勾选依赖坐标
  • 2.编写pojo
  • 3.创建Dao接口以及Dao映射文件
  • 4.编写Service调用Dao
  • 7.编写Controller调用Service
  • 8.编写配置文件
  • 8.编写SpringBoot引导类
  • 9.发布测试
1.12 实现

? 1 数据库表

-- ----------------------------
-- Table structure for `t_user`
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) DEFAULT NULL,
`password` varchar(50) DEFAULT NULL,
`address` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `t_user` VALUES (‘1‘, ‘leimenghongchen‘, ‘123‘, ‘深圳‘);
INSERT INTO `t_user` VALUES (‘2‘, ‘lmhcblog‘, ‘123‘, ‘上海‘);

? 2 创建工程,勾选依赖坐标

技术图片

pom.xml

<?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.4.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>blog.lmch</groupId>
    <artifactId>springboot-mybatis</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-mybatis</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.1.4</version>
        </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>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

3 编写pojo

public class User implements Serializable{

    private Integer id;
    private String username;
    private String password;
    private String address;
    // TODO getters、setters
}

? 4 编写mapper接口以及映射文件

  • 在接口中添加@Mapper注解(标记该类是一个Mapper接口,可以被SpringBoot自动扫描)
@Mapper
public interface UserMapper {

    /**
     * 查询所有用户
     * @return
     */
    List<User> findAll();
}
  • 编写映射文件:在工程的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" >
<mapper namespace="blog.lmhc.mapper.UserMapper">
    <!--查询所有用户-->
    <select id="findAll" resultType="blog.lmhc.pojo.User">
        select * from t_user;
    </select>
</mapper>
  • 编写service接口以及实现类
public interface UserService {
    /***
     * 查询所有
     * @return
     */
    List<User> findAll();
}
@Service
public class UserServiceImpl implements UserService {
   
    @Autowired
    private UserMapper userMapper;

    /***
     * 查询所有
     * @return
     */
    @Override
    public List<User> findAll() {
        return userMapper.findAll();
    }
}

5 编写controller

@RestController
@RequestMapping("/user")
public class UserController {
    
    @Autowired
    private UserService userService;

    /***
     * 查询所有用户
     * @return
     */
    @RequestMapping("/findAll")
    public List<User> findAll(){
        return userService.findAll();
    }
}

6 配置application.yml

server:
  port: 8808
spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://localhost:3306/t_user?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
  mapper-locations: classpath:mapper/*.xml
logging:
  level:
    blog.lmhc: debug

7 发布程序并访问

访问地址:<http://localhost:8808/user/findAll>

技术图片

1.2 集成Spring Data Redis

1.2.1 需求

查询用户,先去Redis中查询,如果有数据直接返回数据,没数据,则查询数据库,并存入到Redis缓存,再返回数据

springdata redis,一套模板,redisTemplate模板,提供对redis进行增删查操作的所有模板操作内容;

1.2.2 步骤
  • 搭建环境
  • 添加坐标
  • 配置application.properties
  • 修改service接口实现类
  • 测试
1.2.3 实现
  • 安装redis

  • 添加坐标

<!--redis-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  • 配置application
#redis,端口可以不填,默认就是6379
spring.redis.host=192.168.211.132
spring.redis.port=6379
  • 修改service接口实现类
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 查询所有用户信息
     *
     * @return
     */
    @Override
    public List<User> findAll() {
        //首先从redis中获取数据
        List<User> userList = (List<User>)redisTemplate.boundValueOps("userList").get();
        //没有获取到,从数据库获取,并数据存入redis
        if(userList == null || userList.size() == 0){
            //从数据库中获取数据
            userList = userMapper.findAll();
            //存储到redis中
            redisTemplate.boundValueOps("userList").set(userList);

            System.out.println("从数据库中获取到数据");
        }else{
            System.out.println("从redis中获取到的数据");
        }
        return userList;
    }
}
  • 测试

1.3 集成Spring Data JPA

1.3.1 Spring Data JPA简介

? Spring Data是一个用于简化数据访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务。 Spring Data可以极大的简化JPA的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作。除了CRUD外,还包括如分页、排序等一些常用的功能。
Spring Data的官网:http://projects.spring.io/spring-data/

1.简化了基本sql语句(基本的sql不用写)

2.可以连接各种类型的数据源,本地数据库,云数据库,关系型数据(mysql oralce),非关系型数据(mongoDB)

1.3.2 需求

使用完成Spring Data JPA对user表的CRUD操作。

3.3.3 步骤

1.创建工程勾选依赖
2.编写Pojo,添加注解
3.编写Dao(需要继承JpaRepository<T,ID>)
4.编写Service
5.编写Controller
6.测试

1.3.4 实现
  • 创建工程勾选依赖

技术图片

pom.xml

<?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 http://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.1.6.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.itheima</groupId>
	<artifactId>springboot-jpa</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>springboot-jpa</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-data-jpa</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</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>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>
  • 编写pojo
/**
* @Entity:表明为一个实体对象
* @Table:指定映射的表
* @Id:指定为主键
* @GeneratedValue:指定注解的生成策略
*    TABLE:使用一个特定的数据库表格来保存主键。 
*    SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。 
*   IDENTITY:主键由数据库自动生成(主要是自动增长型) 
*    AUTO:主键由程序控制
* @Column:指定表的列明
*/    
@Entity
@Table(name = "user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Column(name = "username")
    private String username;
    private String password;
    private String address;
    
     private String phone;
    // TODO getters/setters
}
  • 编写dao接口
public interface UserDao extends JpaRepository<User,Integer> {
}
  • 编写service接口以及实现类
public interface UserService {

    List<User> findUsers();

    User findUserById(Integer id);

    void saveUser(User user);

    void updateUser(User user);

    void deleteUserById(Integer id);
}
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Override
    public List<User> findUsers() {
        return userDao.findAll();
    }

    @Override
    public User findUserById(Integer id) {
        Optional<User> optional = userDao.findById(id);
        return optional.get();
    }

    @Override
    public void saveUser(User user) {
        userDao.save(user);
    }

    @Override
    public void updateUser(User user) {
        // 并没有update方法,如果id存在则执行更新操作
        userDao.save(user);
    }

    @Override
    public void deleteUserById(Integer id) {
        userDao.deleteById(id);
    }
}
  • 编写controller
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping("/findUsers")
    public List<User> findUsers(){
        return userService.findUsers();
    }

    @RequestMapping("/findUserById/{id}")
    public User findUserById(@PathVariable Integer id){
        return userService.findUserById(id);
    }

    @RequestMapping("/saveUser")
    public void saveUser(User user){
        userService.saveUser(user);
    }

    @RequestMapping("/updateUser")
    public void updateUser(User user){
        userService.updateUser(user);
    }

    @RequestMapping("/deleteUserById/{id}")
    public void deleteUserById(@PathVariable Integer id){
        userService.deleteUserById(id);
    }
}
  • 配置application
server:
  port: 8808
spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://localhost:3306/t_user?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    driver-class-name: com.mysql.cj.jdbc.Driver
  redis:
    host: 192.168.211.132
    port: 6379
mybatis:
  mapper-locations: classpath:mapper/*.xml
logging:
  level:
    com.itheima: debug
  • 测试

1.3.4 集成定时器

步骤
  • 开启注解支持
  • 编写定时任务
1.4.3 实现
  • 开启定时任务注解:@EnableScheduling

技术图片

  • 编写定时任务程序
@Component
public class TimeProgarm {

    /**
     * 掌握:cron表达式是一个字符串,字符串以5或6个空格隔开,分开共6或7个域,每一个域代表一个含义
     *  [秒] [分] [小时] [日] [月] [周] [年]
     *  [年]不是必须的域,可以省略[年],则一共6个域
     *
     * 了解:
     *  fixedDelay:上一次执行完毕时间点之后多长时间再执行(单位:毫秒)
     *  fixedDelayString:同等,唯一不同的是支持占位符,在配置文件中必须有time.fixedDelay=5000
     *  fixedRate:上一次开始执行时间点之后多长时间再执行
     *  fixedRateString:同等,唯一不同的是支持占位符
     *  initialDelay:第一次延迟多长时间后再执行
     *  initialDelayString:同等,唯一不同的是支持占位符
     */
//    @Scheduled(fixedDelay = 5000)
//    @Scheduled(fixedDelayString = "5000")
//    @Scheduled(fixedDelayString = "${time.fixedDelay}")
//    @Scheduled(fixedRate = 5000)
//    // 第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次
//    @Scheduled(initialDelay=1000, fixedRate=5000)
    @Scheduled(cron = "30 45 15 08 07 *")
    public void myTask(){
        System.out.println("程序执行了");
    }
}

备注:可以通过资料中提供的cron表达式工具去生成。

CronTrigger配置完整格式为: [秒][分] [小时][日] [月][周] [年]

序号 说明 是否必填 允许填写的值 允许的通配符
1 0-59 , - * /
2 0-59 , - * /
3 小时 0-23 , - * /
4 1-31 , - * ? / L W
5 1-12或JAN-DEC , - * /
6 1-7或SUN-SAT , - * ? / L W
7 empty 或1970-2099 , - * /

使用说明:

通配符说明:
* 表示所有值. 例如:在分的字段上设置 "*",表示每一分钟都会触发。

? 表示不指定值。使用的场景为不需要关心当前设置这个字段的值。

例如:要在每月的10号触发一个操作,但不关心是周几,所以需要周位置的那个字段设置为"?" 具体设置为 0 0 0 10 * ?

- 表示区间。例如 在小时上设置 "10-12",表示 10,11,12点都会触发。

, 表示指定多个值,例如在周字段上设置 "MON,WED,FRI" 表示周一,周三和周五触发

/ 用于递增触发。如在秒上面设置"5/15" 表示从5秒开始,每增15秒触发(5,20,35,50)。 在月字段上设置‘1/3‘所示每月1号开始,每隔三天触发一次。

L 表示最后的意思。在日字段设置上,表示当月的最后一天(依据当前月份,如果是二月还会依据是否是润年[leap]), 在周字段上表示星期六,相当于"7"或"SAT"。如果在"L"前加上数字,则表示该数据的最后一个。例如在周字段上设置"6L"这样的格式,则表示“本月最后一个星期五"

W 表示离指定日期的最近那个工作日(周一至周五). 例如在日字段上设置"15W",表示离每月15号最近的那个工作日触发。如果15号正好是周六,则找最近的周五(14号)触发, 如果15号是周未,则找最近的下周一(16号)触发.如果15号正好在工作日(周一至周五),则就在该天触发。如果指定格式为 "1W",它则表示每月1号往后最近的工作日触发。如果1号正是周六,则将在3号下周一触发。(注,"W"前只能设置具体的数字,不允许区间"-").

# 序号(表示每月的第几个周几),例如在周字段上设置"6#3"表示在每月的第三个周六.注意如果指定"#5",正好第五周没有周六,则不会触发该配置(用在母亲节和父亲节再合适不过了) ;

二 SpringBoot程序打包

1 目标

掌握SpringBoot打包方法

2 步骤

  • 修改pom.xml(设置包类型<jar、war>)
  • 修改pom.xml(设置跳过测试代码)
  • 打包
  • 测试

3 实现

  • 在pom文件中指定包类型(可以不指定,默认就是jar)

技术图片

  • 跳过测试代码(不设置时会执行所有的测试代码)

    • 方式一
     <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <skipTests>true</skipTests>
                </plugin>
            </plugins>
        </build>
    
    • 方式二

      <properties>
              <java.version>1.8</java.version>
              <skipTests>true</skipTests>
          </properties>
      
  • 打包

    • 方式一:直接在idea中执行如下操作

技术图片

  • 方式二:通过命令执行

    1、通过cmd进入到工程的目录中,与pom.xml同级
    2、然后执行命令:mvn clean package [-Dmaven.test.skip=true] --->[]内为可选操作,排除测试代码,也就是说打包时跳过测试代码
    如下命令打包:mvn clean package -Dmaven.test.skip=true
    

技术图片

  • 测试:

    java -jar springboot_demo4_jpa-0.0.1-SNAPSHOT.jar
    -Xmx:最大堆内存
    -Xms:初始堆内存
    java -Xmx80m -Xms20m -jar springboot_demo4_jpa-0.0.1-SNAPSHOT.jar
    

技术图片

  • 访问测试:

技术图片

SpringBoot快速入门(实战篇二)

标签:创建工程   mongod   图片   wired   不同的   initial   ppi   更新   control   

原文地址:https://www.cnblogs.com/lmhcblog/p/springboot2.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!