Spring Boot整合持久层技术

笔记 专栏收录该内容
1 篇文章 0 订阅

Spring Boot整合持久层技术

前言

使用 SpringBoot+SpringMVC+MyBatis+Thymeleaf 整合实现对数据库中的商品表的CRUD的操作。

实现步骤

准备商品表

DROP DATABASE goodsDB;
CREATE DATABASE goodsDB;
USE goodsdb;
CREATE TABLE goods(
   id VARCHAR(10) PRIMARY KEY,
   NAME VARCHAR(40) NOT NULL,
   price DOUBLE,
   image VARCHAR(40)
);
INSERT INTO goods VALUES('001','水果酸奶',38.8,'images/1.jpg');
INSERT INTO goods VALUES('002','水果奶酪',88.8,'images/3.jpg');
INSERT INTO goods VALUES('003','甜点',16.8,'images/4.jpg');
INSERT INTO goods VALUES('004','奶茶',28.8,'images/6.jpg');
SELECT * FROM goods;

创建SpringBoot 项目,项目名:spring-boot-mybatis-thyleaf

在这里插入图片描述

打开pom.xml文件,加入连接池以及修改jdbc版本

<properties>
    <java.version>1.8</java.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <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>
    <!--jdbc的坐标-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.38</version>
        <scope>runtime</scope>
    </dependency>
    <!--阿里连接池-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.10</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

打开application.properties全局配置文件,设置相关属性配置

#服务器端口
server.port=8080
#------------jdbc的datasource配置---------------
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#这里使用自己的数据库的用户和密码
spring.datasource.url=jdbc:mysql:///goodsDB?characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=
#---------------mybatis配置------------
mybatis.type-aliases-package=com.xz.pojo
#指定mapper.xml文件的路径
mybatis.mapper-locations=classpath:/mapper/*.xml
#--------------thymeleaf配置--------
spring.thymeleaf.mode=HTML5
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.servlet.content-type=text/html

编写实体类

这里用到了lombok插件

@AllArgsConstructor
@NoArgsConstructor
@Data
@ToString
public class Goods {
    private String id;
    private String name;
    private double price;
    private String image;
}

编写持久层mapper

在src/main/com/xz/mapper下创建GoodsMapper的接口

public interface GoodsMapper {
    List<Goods> selectAll();
}

在resources下创建mapper文件夹,然后在mapper下创建GoodsMapper.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.xz.mapper.GoodsMapper">
   <select id="selectAll" resultType="Goods">
       select * from goods
   </select>
</mapper>

编写业务层service

编写service接口 GoodsService

public interface GoodsService {
    List<Goods>  getGoodsAll();
}

编写service实现类 GoodsServiceImpl

@Service
public class GoodsServiceImpl implements GoodsService {
    @Autowired
    GoodsMapper goodsMapper;
    @Override
    public List<Goods> getGoodsAll() {
        return goodsMapper.selectAll();
    }
}

编写控制器Controller

@Controller
public class GoodsController {
    @Autowired
    GoodsService goodsService;

    @RequestMapping("/getGoods")
    public String getGoods(Model model){
        List<Goods> list=goodsService.getGoodsAll();
        model.addAttribute("list",list);
        return "goodsList";
    }
}

编写Thymeleaf页面视图层

在src/mian/resources/templates下创建goodsList.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <table border="1" width="400px" align="center" cellpadding="0" cellspacing="0">
        <tr>
            <td>商品编号</td>
            <td>商品名称</td>
            <td>商品价格</td>
            <td>商品图片</td>
        </tr>
        <tr th:each="goods:${list}">
            <td th:text="${goods.id}"></td>
            <td th:text="${goods.name}"></td>
            <td th:text="${goods.price}"></td>
            <td><img th:src="@{${goods.image}}" width="48px" height="48px"></td>
        </tr>
    </table>
</body>
</html>

启动类

@SpringBootApplication
@MapperScan("com.xz.mapper")
public class SpringBootMybatisThymeleafApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootMybatisThymeleafApplication.class, args);
    }
}

声明式事务

  • SpringBoot提供了非常方便的事务操作,通过@Transactional注解就可以实现事务,非常方便快捷。
    @Transactional可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有
    public方法将都具有该类型的事务属性。

常用配置

参 数 名 称功 能 描 述
readOnly该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。
propagation该属性用于设置事务的传播行为。
isolation该属性用于设置底层数据库的事务隔离级别。

业务层service (带上声明式事务控制)

@Service
public class GoodsServiceImpl implements GoodsService {
    @Autowired
    GoodsMapper goodsMapper;
//查询方式,设置为只读事务
    @Transactional(readOnly = true)
    @Override
    public List<Goods> getGoodsAll() {
        return goodsMapper.selectAll();
    }
//增删改,开启事务设置
    @Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT)
    @Override
    public int delGoods(String id) {
        return goodsMapper.deleteById(id);
    }
}

SpringBoot 日志记录

SpringBoot 日志分类

  • Spring Boot 即支持log4j 也支持logback 日志记录。

  • logback 是log4j的扩展,性能要比log4j高很多。

  • Spring Boot默认的日志框架Logback。

logback 日志记录实现

在spring Boot 中如果引入了spring-boot-starter或spring-boot-starter-web启动器,
其中包含了spring-boot-starter-logging启动器,里面有Logback的jar包 。
在这里插入图片描述
只需要在src/main/resources目录下有一个logback.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <property name="LOG_HOME" value="${catalina.base}/logs/" />
    <!-- 控制台输出 -->
    <appender name="Stdout" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 日志输出编码 -->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
            </pattern>
        </layout>
    </appender>
    <!-- 按照每天生成日志文件 -->
    <appender name="RollingFile"  class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}/server.%d{yyyy-MM-dd}.log</FileNamePattern>
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
            </pattern>
        </layout>
        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>

    <!-- 日志输出级别 -->
    <root level="debug">
        <appender-ref ref="Stdout" />
        <appender-ref ref="RollingFile" />
    </root>
    <!--日志异步到数据库 -->
    <!--     <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
            日志异步到数据库
            <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
               连接池
               <dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource">
                  <driverClass>com.mysql.jdbc.Driver</driverClSass>
                  <url>jdbc:mysql://127.0.0.1:3306/databaseName</url>
                  <user>root</user>
                  <password>root</password>
                </dataSource>
            </connectionSource>
      </appender> -->
</configuration>

日志记录效果

在这里插入图片描述

log4J 日志记录实现

打开pom.xml文件,去掉logback的坐标,引入log4j的坐标。

<!--排除 commons‐logging-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!--引入log4j2 相对于log4j有很大的变动-->
<!--<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>-->
<!--引入log4j -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
</dependency>

在src/main/resources目录下放有一个log4j.properties文件

log4j.rootCategory=ERROR, CONSOLE ,LOGFILE
log4j.logger.com.xz.mapper=DEBUG
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%C %p  %m %n
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=D:/my.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%C %m %L %n

日志记录效果
在这里插入图片描述

  • 2
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
<p> <span style="font-size:14px;color:#337FE5;">【为什么学爬虫?】</span> </p> <p> <span style="font-size:14px;">       1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到!</span> </p> <p> <span style="font-size:14px;">       2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站</span> </p> <p> <br /> </p> <span style="font-size:14px;color:#337FE5;">【课程设计】</span> <p class="ql-long-10663260"> <span> </span> </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 网络请求:模拟浏览器的行为从网上抓取数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序的灵活性,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。 </li> <li class="" style="font-size:11pt;color:#494949;"> Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。 </p> <p style="font-size:11pt;color:#494949;">   </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求! </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> <br /> </p> <p> <br /> </p> <p> <span style="font-size:14px;background-color:#FFFFFF;color:#337FE5;">【课程服务】</span> </p> <p> <span style="font-size:14px;">专属付费社群+定期答疑</span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"><br /> </span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"></span> </p>
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页

打赏

weixin_45581828

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值