SpringBoot2零基础到精通之数据库专项精讲


Posted in Java/Android onMarch 22, 2022

1 数据库连接

1.1 配置数据库连接信息

  如果想要使用数据库连接池连接数据库进行SQL操作的话,在SpringBoot中需要经过如下三个步骤: 第一步: 导入jdbc开发的启动场景

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

第二步: 导入数据库驱动 之所以框架底层没有自动导入数据库的驱动,是因为不同的数据库使用的驱动不同,这需要用户根据自己的需要来进行选择。虽然框架没有对指定数据库驱动进行自动导入,但是对不同数据库驱动的版本都进行了版本仲裁,也就是说我们可以直接导入无需定义版本号。当然也可以自定义版本号,maven会根据自身的就近依赖原则导入自定义的版本

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.32</version>
</dependency>

第三步: 配置数据库连接的配置文件

# 设置数据库
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test
    username: root
    password: "123456"

1.2 整合Druid数据源

  SpringBoot框架中默认使用的是Hikari数据源,这也就意味着如果要是想要修改数据源的话,无非就是两种方法:自定义配置类、引入相应的启动器依赖再配置配置文件

第一步: 引入Druid的启动器依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.17</version>
</dependency>

第二步: 配置配置文件(选学,框架一般都有默认的配置)

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/db_account
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver

    druid:
      aop-patterns: com.atguigu.admin.*  #监控SpringBean
      filters: stat,wall     # 底层开启功能,stat(sql监控),wall(防火墙)

      stat-view-servlet:   # 配置监控页功能
        enabled: true
        login-username: admin
        login-password: admin
        resetEnable: false

      web-stat-filter:  # 监控web
        enabled: true
        urlPattern: /*
        exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'


      filter:
        stat:    # 对上面filters里面的stat的详细配置
          slow-sql-millis: 1000
          logSlowSql: true
          enabled: true
        wall:
          enabled: true
          config:
            drop-table-allow: false

2 SpringBoot整合MyBatis

  mybatis开发的时候有两种开发模式:使用配置文件进行开发、纯注解开发,二者各有优点。使用配置文件进行开发在处理更加复杂的SQL语句的时候逻辑更加清晰,纯注解开发比较适合简单的SQL语句,于是我们可以在开发的时候混合使用两种方法,这样可以大大提升开发效率。

2.1 配置文件开发

第一步: 引入启动器依赖 小知识:SpringBoot官方的所有技术启动器的命名都是spring-boot-starter-xxx而第三方技术的启动器命名则是xxx-spring-boot-starter。值得注意的是:MyBatis的启动器内部引用了dbc开发的启动场景,所以无需重复引用

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.4</version>
</dependency>

第二步: 编写mapper接口并标注@Mapper注解

@Mapper
public interface StuMapper {

    Stu queryBySid(int sid);
}

第三步: 编写映射文件并绑定mapper接口

<?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.xiaochen.mapper.StuMapper">
    <select id="queryBySid" resultType="com.xiaochen.domain.Stu">
        select * from stu where sid=#{sid}
    </select>

</mapper>

第四步: 在配置文件中指定之前MyBatis配置文件的各种信息

# mybatis的所有配置
mybatis:
mapper-locations: classpath:com.xiaochen.mapper/*.xml
# 所有的全局配置文件的配置项在这下面配置
configuration:
# 开启驼峰命名数据库中字段值的下划线‘_'加字母会被认为是大写
map-underscore-to-camel-case: true

2.2 纯注解开发

第一步: 引入启动器依赖

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.4</version>
</dependency>

第二步: 编写mapper接口并标注@Mapper注解,使用对应的注解进行SQL语句操作

@Mapper
public interface StuMapper {

    @Select("select * from stu where sid=#{sid}")
    Stu queryBySid(int sid);
}

3 SpringBoot整合MyBatis-Plus

3.1 普通的CRUD方法

  MyBatis-plus的启动器内部不止引用了dbc开发的启动场景,还导入了MyBatis的启动器,所以这两个都无需再重复引用 第一步: 引入启动器依赖

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.1</version>
</dependency>

mapper层:

  编写mapper接口标注@Mapper注解,并继承BaseMapper类。这是MyBatis-plus的独有方式,这样做的好处是继承之后直接使用父类中已经写好的简单CRUD方法,但是一些复杂的SQL业务还是需要使用映射文件来实现的,进一步提高了代码开发的效率

@Mapper
public interface StuMapper extends BaseMapper<Stu> {

}

  MyBatis-plus进行数据库表的增删改查的时候,默认把继承BaseMapper类时传进去的泛型名称当做表名去查找,如果泛型与数据库中的表名不对应的话,可以在实体类使用注解标识,除此之外注解还可以用来标识主键和非表中字段属性

@NoArgsConstructor
@AllArgsConstructor
@Data
@TableName("stu")
public class Stu {
    // 表名该字段是定义的临时变量,并不存在于数据库的表中
    @TableField(exist = false)
    private String gender;

    // 标明表的主键
    @TableId
    private int sid;
    private String sname;
    private String age;
    private String course;
    private int cardid;
}

  编写映射文件并绑定mapper接口(如果有的话)。MyBatis-plus自动配置好了默认的mapper-locations,也就是映射文件的存放位置为classpath:/mapper/**/*.xml,于是我们就按照它的默认规则在静态资源路径下mapper文件夹下。本案例中没有映射文件,于是就不创建

  如果有需要的话,还可以在配置文件中指定MyBatis-plus配置文件的各种信息

service层:

service接口继承IService类

public interface StuService extends IService<Stu> {

}

  service的实现类先是继承ServiceImpl并传两个泛型(mapper接口,实体类),然后实现service接口

@Service
public class StuServiceImpl extends ServiceImpl<StuMapper, Stu> implements StuService {
    
}

controller层: 直接使用service继承类的简单方法

@Controller
public class TableController {

    @Autowired
    StuServiceImpl stuService;

    /**
     * 点击Advanced table按钮,进行页面转发,并携带一个表格数据
     * @param model 用于存储数据
     * @return 页面转发forward 到 /table/dynamic_table.html
     */
    @GetMapping("/dynamic_table")
    public String dynamic_table(Model model) {
        // 从数据库中查出user表进行展示
        List<Stu> list = stuService.list();
        model.addAttribute("stus", list);
        return "/table/dynamic_table";
    }
}

3.2 MyBatis-plus的分页实现

  MyBatis-plus的分页功能实现需要先自定义一个配置类,向容器中注册一个Interceptor

@Configuration
public class MyBatisConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
        paginationInnerInterceptor.setOverflow(true);
        paginationInnerInterceptor.setMaxLimit(500L);
        interceptor.addInnerInterceptor(paginationInnerInterceptor);
        return interceptor;
    }
}

然后就可以像普通的CRUD操作一样,直接使用service继承类的分页的相关方法即可

@GetMapping("/dynamic_table")
public String dynamic_table(@RequestParam(value = "pn", defaultValue = "1")Integer pn,  Model model) {
    // 分页从数据库中查出stu表的所有数据,当前页、总页数、总条数……
    Page<Stu> stuPage = new Page<>(pn, 1);
    Page<Stu> page = stuService.page(stuPage);

    model.addAttribute("page", page);
    return "/table/dynamic_table";
}

到此这篇关于SpringBoot2零基础到精通之数据库专项精讲的文章就介绍到这了,更多相关SpringBoot2 数据库内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Java/Android 相关文章推荐
为什么在foreach循环中JAVA集合不能添加或删除元素
Jun 11 Java/Android
Win10系统下配置Java环境变量
Jun 13 Java/Android
分析并发编程之LongAdder原理
Jun 29 Java/Android
小程序与后端Java接口交互实现HelloWorld入门
Jul 09 Java/Android
Java Socket实现多人聊天系统
Jul 15 Java/Android
springboot集成springCloud中gateway时启动报错的解决
Jul 16 Java/Android
MyBatis-Plus 批量插入数据的操作方法
Sep 25 Java/Android
Java8中Stream的一些神操作
Nov 02 Java/Android
Java实现扫雷游戏详细代码讲解
May 25 Java/Android
ConditionalOnProperty配置swagger不生效问题及解决
Jun 14 Java/Android
Java实现超大Excel文件解析(XSSF,SXSSF,easyExcel)
Jul 15 Java/Android
Java Redisson多策略注解限流
Sep 23 Java/Android
Spring Bean是如何初始化的详解
Mar 22 #Java/Android
关于EntityWrapper的in用法
Mar 22 #Java/Android
SpringBoot2零基础到精通之异常处理与web原生组件注入
Mar 22 #Java/Android
Java字符串逆序方法详情
Mar 21 #Java/Android
剑指Offer之Java算法习题精讲二叉树的构造和遍历
剑指Offer之Java算法习题精讲二叉树专项训练
InterProcessMutex实现zookeeper分布式锁原理
You might like
MySQL的FIND_IN_SET函数使用方法分享
2012/03/27 PHP
ThinkPHP CURD方法之where方法详解
2014/06/18 PHP
Laravel框架数据库CURD操作、连贯操作总结
2014/09/03 PHP
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
2015/10/23 PHP
Smarty缓存机制实例详解【三种缓存方式】
2019/07/20 PHP
使用laravel根据用户类型来显示或隐藏字段
2019/10/17 PHP
TP框架实现上传一张图片和批量上传图片的方法分析
2020/04/23 PHP
fromCharCode和charCodeAt 方法
2006/12/27 Javascript
jquery选择器之基本过滤选择器详解
2014/01/27 Javascript
详解JavaScript对Date对象的操作问题(生成一个倒数7天的数组)
2015/10/01 Javascript
学习JavaScript设计模式之单例模式
2016/01/19 Javascript
再谈JavaScript异步编程
2016/01/27 Javascript
jquery设置css样式的多种方法(总结)
2017/02/21 Javascript
基于vue.js轮播组件vue-awesome-swiper实现轮播图
2017/03/17 Javascript
canvas简单快速的实现知乎登录页背景效果
2017/05/08 Javascript
原生JS封装animate运动框架的实例
2017/10/12 Javascript
微信小程序如何实现全局重新加载
2019/06/05 Javascript
微信小程序学习总结(四)事件与冒泡实例分析
2020/06/04 Javascript
[39:18]完美世界DOTA2联赛PWL S3 Forest vs LBZS 第二场 12.17
2020/12/19 DOTA
Django框架中的对象列表视图使用示例
2015/07/21 Python
利用PyInstaller将python程序.py转为.exe的方法详解
2017/05/03 Python
Python多进程并发与多线程并发编程实例总结
2018/02/08 Python
对python 数据处理中的LabelEncoder 和 OneHotEncoder详解
2018/07/11 Python
python+selenium实现自动化百度搜索关键词
2019/06/03 Python
python绘制随机网络图形示例
2019/11/21 Python
pytorch 自定义卷积核进行卷积操作方式
2019/12/30 Python
Python datetime 如何处理时区信息
2020/09/02 Python
我爱祖国演讲稿
2014/09/02 职场文书
党建工作目标管理责任书
2015/01/29 职场文书
护士医德考评自我评价
2015/03/03 职场文书
2015年度保密工作总结
2015/04/24 职场文书
观后感格式
2015/06/19 职场文书
2015暑期爱心支教策划书
2015/07/14 职场文书
毕业设计工作总结
2015/08/14 职场文书
ES6 解构赋值的原理及运用
2021/05/25 Javascript
Linux在两个服务器直接传文件的操作方法
2022/08/05 Servers