sping jdbc 链接mysql_Spring Boot JDBC 连接数据库示例

文本将对在spring Boot构建的Web应用中,基于MySQL数据库的几种数据库连接方式进行介绍。

包括JDBC、JPA、MyBatis、多数据源和事务。

JDBC 连接数据库

1、属性配置文件(application.properties)

spring.datasource.url=jdbc:mysql://localhost:3306/test

spring.datasource.username=root

spring.datasource.password=123456

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

如果使用JNDI,则可以替代 spring.datasource 的 url、username、password,如:

spring.datasource.jndi-name=java:tomcat/datasources/example

值得一提的是,无论是Spring Boot默认的DataSource配置还是你自己的DataSource bean,都会引用到外部属性文件中的属性配置。所以假设你自定义的DataSource bean,你可以在定义bean时设置属性,也可以在属性文件中,以“spring.datasource.*”的方式使属性配置外部化。

2、pom.xml 配置maven依赖

mysql

mysql-connector-java

org.springframework.boot

spring-boot-starter-jdbc

3、Java代码范例

StudentService.java

package org.springboot.sample.service;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.List;

import org.springboot.sample.entity.Student;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.jdbc.core.JdbcTemplate;

import org.springframework.jdbc.core.RowMapper;

import org.springframework.stereotype.Service;

/**

* Studeng Service

*

* @author 单红宇(365384722)

* @create 2016年1月12日

*/

@Service

public class StudentService {

@Autowired

private JdbcTemplate jdbcTemplate;

public List getList(){

String sql = "SELECT ID,NAME,SCORE_SUM,SCORE_AVG, AGE FROM STUDENT";

return (List) jdbcTemplate.query(sql, new RowMapper(){

@Override

public Student mapRow(ResultSet rs, int rowNum) throws SQLException {

Student stu = new Student();

stu.setId(rs.getInt("ID"));

stu.setAge(rs.getInt("AGE"));

stu.setName(rs.getString("NAME"));

stu.setSumScore(rs.getString("SCORE_SUM"));

stu.setAvgScore(rs.getString("SCORE_AVG"));

return stu;

}

});

}

}

Student.java 实体类

package org.springboot.sample.entity;

import java.io.Serializable;

/**

* 学生实体

*

* @author 单红宇(365384722)

* @create 2016年1月12日

*/

public class Student implements Serializable{

private static final long serialVersionUID = 2120869894112984147L;

private int id;

private String name;

private String sumScore;

private String avgScore;

private int age;

// 节省文章长度,get set 方法省略

}

StudentController.java

package org.springboot.sample.controller;

import java.util.List;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springboot.sample.entity.Student;

import org.springboot.sample.service.StudentService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

@RestController

@RequestMapping("/stu")

public class StudentController {

private static final Logger logger = LoggerFactory.getLogger(StudentController.class);

@Autowired

private StudentService studentService;

@RequestMapping("/list")

public List getStus(){

logger.info("从数据库读取Student集合");

return studentService.getList();

}

}

本文对工程添加文件后工程结构图:

67ad422d3c91421b9451cb0a599d1ecc.png

然后启动项目,访问地址: http://localhost:8080/myspringboot/stu/list 响应结果如下:

[

{

id: 1,

name: "小明",

sumScore: "252",

avgScore: "84",

age: 1

},

{

id: 2,

name: "小王",

sumScore: "187",

avgScore: "62.3",

age: 1

},

{

id: 3,

name: "莉莉",

sumScore: "",

avgScore: "",

age: 0

},

{

id: 4,

name: "柱子",

sumScore: "230",

avgScore: "76.7",

age: 1

},

{

id: 5,

name: "大毛",

sumScore: "",

avgScore: "",

age: 0

},

{

id: 6,

name: "亮子",

sumScore: "0",

avgScore: "0",

age: 1

}

]

连接池说明

Tomcat7之前,Tomcat本质应用了DBCP连接池技术来实现的JDBC数据源,但在Tomcat7之后,Tomcat提供了新的JDBC连接池方案,作为DBCP的替换或备选方案,解决了许多之前使用DBCP的不利之处,并提高了性能。

Spring Boot为我们准备了最佳的数据库连接池方案,只需要在属性文件(例如application.properties)中配置需要的连接池参数即可。

我们使用Tomcat数据源连接池,需要依赖tomcat-jdbc,只要应用中添加了spring-boot-starter-jdbc 或 spring-boot-starter-data-jpa依赖,则无需担心这点,因为将会自动添加 tomcat-jdbc 依赖。

假如我们想用其他方式的连接池技术,只要配置自己的DataSource bean,即可覆盖Spring Boot的自动配置。

请看我的数据源配置:

spring.datasource.url=jdbc:mysql://localhost:3306/test

spring.datasource.username=root

spring.datasource.password=123456

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.max-idle=10

spring.datasource.max-wait=10000

spring.datasource.min-idle=5

spring.datasource.initial-size=5

spring.datasource.validation-query=SELECT 1

spring.datasource.test-on-borrow=false

spring.datasource.test-while-idle=true

spring.datasource.time-between-eviction-runs-millis=18800

spring.datasource.jdbc-interceptors=ConnectionState;SlowQueryReport(threshold=0)

配置过连接池的开发人员对这些属性的意义都有所认识。

我们打开DEBUG日志输出,logback.xml 中添加:

然后启动项目,注意观察日志输出,如下图中会显示自动启用了连接池:

b04724119863042ea24f101ac3201f73.png

我在上面的数据源配置中添加了过滤器,并设置了延迟时间为0(故意设置很低,实际项目中请修改):

spring.datasource.jdbc-interceptors=ConnectionState;SlowQueryReport(threshold=0)

这个时候,我们访问 http://localhost:8080/myspringboot/stu/list 观察日志,会发现框架自动将大于该时间的数据查询进行警告输出,如下:

2016-01-12 23:27:06.710  WARN 17644 --- [nio-8080-exec-1] o.a.t.j.p.interceptor.SlowQueryReport    : Slow Query Report SQL=SELECT ID,NAME,SCORE_SUM,SCORE_AVG, AGE   FROM STUDENT; time=3 ms;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340539.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二分查找递归与非递归的时间比较_我们说一说Python的查找算法!

相信大家在面试开发岗和算法岗时,评委最喜欢问的就是:您能给我说一下查找和排序算法有哪些?今天咱们就说一说Python中最常用的查找算法,下期我们再推出排序算法。首先要明白查找是查什么?我们希望能给定一个值&#xf…

jsf 自定义属性_如何在JSF中实现自定义密码强度指示器

jsf 自定义属性使用JavaScript验证密码强度是一项常见任务。 在本文中,我将展示如何向基于JSF的Web应用程序添加密码强度指示器。 的 PrimeFaces中的密码组件已经具有密码强度的反馈指示符,但是它有两个主要缺点: 反馈指示器没有响应&#…

OAuth 2.0 Java指南:5分钟保护您的应用程序安全

使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护。 今天尝试Okta。 现代应用程序依赖于用户身份验证,但是它可能给Java开发人员带来困难的挑战,以及一系列特定于框…

flutter从0到1构建大前端应用 pdf_前端骨架屏都是如何生成的

作者:SHERlocked93转发链接:https://mp.weixin.qq.com/s/j2XzwLPnalDCNaKkfjH-0Q前言相比于早些年前后端代码紧密耦合、后端工程师还得写前端代码的时代,如今已发展到前后端分离,这种开发方式大大提升了前后端项目的可维护性与开发…

成为Java流大师–第1部分:创建流

在许多情况下,声明性代码(例如,具有Streams的功能组合)可提供出色的代码指标。 通过本动手实验文章系列进行编码,并成为Java Streams的主教练,从而成为一名更好的Java程序员。 Streams的整个想法是代表一个…

java 6 基础教程_Java小白入门教程(6)——循环语句

提纲:1、循环结构2、while循环3、do-while循环4、for循环5、break语句6、continue语句7、循环嵌套8、作业一、循环结构1.1 概念条件满足,某些代码会被反复多次的执行。条件不成立了,循环结束。0-n次。1.2 为什么使用循环开发中可能会把某些代…

事件触发控制_SystemVerilog线程控制与通信

01线程控制1.概述线程,即独立运行的程序;线程需要被触发执行,可以结束或者不结束;在module中的initial和always,都可以看作独立的线程,他们在仿真0时刻开始,而选择结束或者不结束;在…

java必读书籍_最佳5本Java性能调优书籍–精选,必读

java必读书籍为什么Java开发人员应该阅读有关性能调优的书? 当我很久以前第一次面对这个问题时,我以为以后会做,但是我很长一段时间都没有回过头来。 仅当我在用Java编写的任务关键型服务器端财务应用程序中遇到严重的性能和可伸缩性问题时&a…

成为Java流大师–第4部分:数据库流

SQL一直是一种声明性语言,而Java长期以来势在必行。 Java流改变了游戏规则。 通过本动手文章编写您的方式,并学习如何使用Java流对RDBMS数据库执行声明性查询,而无需编写任何SQL代码。 您会发现,Java流和SQL命令的动词之间有着惊人…

unsafehelper java_Java 9中将移除 Sun.misc.Unsafe

灾难将至,Java 9中将移除 Sun.misc.UnsafeOracle 正在计划在Java 9中去掉 sun.misc.Unsafe API。 这绝对将是一场灾难,有可能会彻底破坏整个 java 生态圈。 几乎每个使用 java开发的工具、软件基础设施、高性能开发库都在底层使用了 sun.misc.Unsafe。 下…

java 根据类名示例化类_如何使用示例从Java中的类路径加载资源

java 根据类名示例化类Java中的类路径不仅用于加载.class文件,而且还可以用于加载资源,例如属性文件,图像,图标,缩略图或任何二进制内容。 Java提供了API来将这些资源读取为InputStream或URL。 假设您在项目的config文…

java课程设计进程管理_Java课设总结(个人版)

使用物理引擎JBox2D完成游戏关卡的各个物理状态模拟根据物理引擎设计Bird,Pig,Brick等游戏中出现的可运动刚体类建立JBox2d的工具类以实现###本人对这次课设的看法与吐槽 1.课设内容的脑洞是我在看完17级学长的游戏课设之后想出的 当时还没学java网络编程的内容,误以…

二叉树层次遍历c语言_[LeetCode] 107. 二叉树的层次遍历 II

题目链接 : https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/题目描述:给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)例如: 给…

使用测微计收集应用程序指标

什么是千分尺? 千分尺是一个简单的外观,用于以供应商中立的方式收集Java应用程序中的指标。 您可以考虑使用SLF4J作为指标。 Micrometer内置了对许多不同指标后端的支持,包括Atlas,Datadog,Elastic,JMX等。…

只读副本和Spring Data第1部分:配置数据库

这是有关我们为利用只读副本来提高应用程序性能而寻求的一系列博客文章。 对于这个项目,我们的目标是建立我们的spring数据应用程序,并使用read仓库进行写操作,并基于read副本进行读操作。 为了模拟这种环境,我们将通过Docker使…

java结构体系_java io结构体系

Java IO体系结构看似庞大复杂,其实有规律可循,要弄清楚其结构,需要明白两点:1. 其对称性质:InputStream 与 OutputStream, Reader 与 Writer,他们分别是一套字节输入-输出,字符输入-输出体系2. 原始处理器(适配器)与链接流处理器(装饰器)其结构图如下:Reader-Writer体系1. 基类…

javaserver_如何在JavaServer Pages中使用Salesforce REST API

javaserver摘要:本教程提供了一个JSP示例以及如何将其与Salesforce REST API集成。 我们将逐步完成创建外部客户端以使用Force.com (同时使用HTTP(S)和JSON)管理数据的分步过程。 在此示例中,我将Mac OS X…

jmeter线程数并发数区别_如何确定Kafka的分区数、key和consumer线程数、以及不消费问题解决...

在Kafak中国社区的qq群中,这个问题被提及的比例是相当高的,这也是Kafka用户最常碰到的问题之一。本文结合Kafka源码试图对该问题相关的因素进行探讨。希望对大家有所帮助。怎么确定分区数?“我应该选择几个分区?”——如果你在Kaf…

插入排序java_「Java」各类排序算法

排序大的分类可以分为两种:内排序和外排序。在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序。下面讲的排序都是属于内排序。内排序有可以分为以下几类:(1) 插入排…

华为光伏usb适配器_华为系列原装充电器拆解第三弹:比亚迪版华为10W充电器

在对华为18W充电器的比亚迪版和赛尔康版进行拆解之后,充电头网今天继续为大家带来华为10W充电器的比亚迪版和达宏版的拆解。这两种10W规格的华为充电器外观延续了华为原装充电器的风格,而且型号也是一样的。那么,我们先一起来看看比亚迪版华为…