SpringBoot实战(四)之使用JDBC和Spring访问数据库
这里演示的是h2databse示例,所以简单的介绍普及下h2database相关知识
H2数据库是一个开源的关系型数据库。
H2是一个嵌入式数据库引擎,采用java语言编写,不受平台的限制,同时H2提供了一个十分方便的web控制台用于操作和管理数据库内容。它还提供兼容模式,可以兼容一些主流的数据库,因此采用H2作为开发期的数据库非常方便。
H2数据库特点:
短小精干。
Java编写,可使用GCJ和IKVM.NET编译。
同时支持网络版和嵌入式版本,另外还提供了内存版。
有比较好的兼容性,支持相当标准的sql标准,支持集群。
提供JDBC、ODBC访问接口,提供了非常友好的基于web的数据库管理界面。
这里说下JdbcTemplate,之所以会出现JdbcTemplate,我个人加上我自己的一些想法,传统的JDBC的高耦合性和许多重复性增删改查,使得JDBC的升级版诞生,这一点与MyBatis Plus有共同的特点。而JDBCTemplate正是看到这一点后,对于JDBC进行升级。
关于JDBCTemplate示例,大家可以参考这位朋友写的示例:https://www.cnblogs.com/janes/p/6971839.html
下面引用下他的关于JdbcTemplate的介绍:
JdbcTemplate是最基本的Spring JDBC模板,这个模板支持简单的JDBC数据库访问功能以及基于索引参数的查询。
Spring数据访问模板:在数据库操作过程中,有很大一部分重复工作,比如事务控制、管理资源以及处理异常等,Spring的模板类处理这些固定部分。同时,应用程序相关的数据访问在回调的实现中处理,包括语句、绑定参数以及整理结果等。这样一来,我们只需关心自己的数据访问逻辑即可。
Spring的JDBC框架承担了资源管理和异常处理的工作,从而简化了JDBC代码,我们只需要编写从数据库读写数据的必需代码就万事大吉了。
一、导入依赖
<?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><groupId>org.springframework</groupId><artifactId>gs-relational-data-access</artifactId><version>0.1.0</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.8.RELEASE</version></parent><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
二、编写实体
Customer.java
package hello;public class Customer {private long id;private String firstName, lastName;public Customer(long id, String firstName, String lastName) {this.id = id;this.firstName = firstName;this.lastName = lastName;}@Overridepublic String toString() {return String.format("Customer[id=%d, firstName='%s', lastName='%s']",id, firstName, lastName);}public long getId() {return id;}public void setId(long id) {this.id = id;}public String getFirstName() {return firstName;}public void setFirstName(String firstName) {this.firstName = firstName;}public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName = lastName;}}
三、编写启动类
package hello;import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.jdbc.core.JdbcTemplate;import java.util.Arrays; import java.util.List; import java.util.stream.Collectors;@SpringBootApplication public class Application implements CommandLineRunner {private static final Logger log = LoggerFactory.getLogger(Application.class);public static void main(String args[]) {SpringApplication.run(Application.class, args);}@AutowiredJdbcTemplate jdbcTemplate;@Overridepublic void run(String... strings) throws Exception {log.info("Creating tables");jdbcTemplate.execute("DROP TABLE customers IF EXISTS");jdbcTemplate.execute("CREATE TABLE customers(" +"id SERIAL, first_name VARCHAR(255), last_name VARCHAR(255))");// Split up the array of whole names into an array of first/last namesList<Object[]> splitUpNames = Arrays.asList("John Woo", "Jeff Dean", "Josh Bloch", "Josh Long").stream().map(name -> name.split(" ")).collect(Collectors.toList());// Use a Java 8 stream to print out each tuple of the listsplitUpNames.forEach(name -> log.info(String.format("Inserting customer record for %s %s", name[0], name[1])));// Uses JdbcTemplate's batchUpdate operation to bulk load datajdbcTemplate.batchUpdate("INSERT INTO customers(first_name, last_name) VALUES (?,?)", splitUpNames);log.info("Querying for customer records where first_name = 'Josh':");jdbcTemplate.query("SELECT id, first_name, last_name FROM customers WHERE first_name = ?", new Object[] { "Josh" },(rs, rowNum) -> new Customer(rs.getLong("id"), rs.getString("first_name"), rs.getString("last_name"))).forEach(customer -> log.info(customer.toString()));} }
最终结果是:
该main()
方法使用Spring Boot的SpringApplication.run()
方法来启动应用程序。您是否注意到没有一行XML?也没有web.xml文件。此Web应用程序是100%纯Java,您无需处理配置任何管道或基础结构。
Spring Boot支持H2,一种内存中的关系数据库引擎,并自动创建连接。因为我们使用的是spring-jdbc,Spring Boot会自动创建一个JdbcTemplate
。该@Autowired JdbcTemplate
字段自动加载它并使其可用。
这个Application
类实现了Spring Boot CommandLineRunner
,这意味着它将run()
在加载应用程序上下文后执行该方法。
首先,使用JdbcTemplate’s `execute
方法安装一些DDL 。
其次,您获取字符串列表并使用Java 8流,将它们拆分为Java数组中的firstname / lastname对。
然后使用JdbcTemplate’s `batchUpdate
方法在新创建的表中安装一些记录。方法调用的第一个参数是查询字符串,最后一个参数(Object
s 的数组)包含要替换为“?”字符的查询的变量。
补充说明:
Java 8 lambdas很好地映射到单个方法接口,如Spring的RowMapper
。如果您使用的是Java 7或更早版本,则可以轻松插入匿名接口实现,并具有与lambda expresion正文所包含的相同的方法体,并且它可以毫不费力地使用Spring。
SpringBoot实战(四)之使用JDBC和Spring访问数据库相关推荐
- Spring访问数据库异常的处理方法(转)
原文链接:http://sarin.javaeye.com/blog/888458 今天我们将谈谈Spring访问数据库异常的处理方法,使用JDBC API时,很多操作都要声明抛出java.sql.S ...
- Spring 访问数据库
数据库基本上是现代应用程序的标准存储,绝大多数程序都把自己的业务数据存储在关系数据库中,可见,访问数据库几乎是所有应用程序必备能力. 我们在前面已经介绍了Java程序访问数据库的标准接口JDBC,它的 ...
- 第一步:Spring访问数据库(jdbcTemplate)
2019独角兽企业重金招聘Python工程师标准>>> 首先当然是访问数据库,以前学习php的时候,就是从留言板.登录等功能开始学习的,之所以这样学习无非就是因为从前台到后台,该有的 ...
- SpringBoot实战(十二):集成 Spring Boot Admin 监控
强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan [前言] 程序开发完实现相应的功能只是一个部分,如何让系统在线上运行更好创造更高的价值是另外一个 ...
- springboot实战pdf_腾讯架构师Spring Boot实战篇(PDF文档)
前言: 什么是Spring Boot?? Spring Boot应用本质上就是一个基于Spring框架的应用 Spring Boot的核心是什么? 自动配置 起步依赖 Actuator 命令行界面(C ...
- SpringBoot实战(十三):Spring Boot Admin 动态修改日志级别
强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan [前言] 之前关于线上输出日志一直有个困惑:如何可以动态调整的日志级别,来保证系统在正常运行时性 ...
- Java程序员从笨鸟到菜鸟之(七十八)细谈Spring(七)spring之JDBC访问数据库及配置详解
利用spring访问数据库是我们ssh程序中必不可少的步骤,在没有hibernate之前,我们一般都用jdbc访问数据库,所以用jdbc访问数据库必不可少的要进行一些配置,spring中为我们提供了访 ...
- Java JDBC基础 连接数据库 操作数据库
1.JDBC概述 1.1 数据持久化 持久化(persistence) :把数据保存到可掉电式存储设备中以供之后使用.大多数情况下,特别是企业级应用数据持久化意味着将内存中的数据保存到硬盘上加以&qu ...
- SpringBoot 实战 (八) | 使用 Spring Data JPA 访问 Mysql 数据库
微信公众号:一个优秀的废人 如有问题或建议,请后台留言,我会尽力解决你的问题. 前言 如题,今天介绍 Spring Data JPA 的使用. 什么是 Spring Data JPA 在介绍 Spri ...
最新文章
- 两步聚类算法+Two Step
- 高可用高性能负载均衡软件HAproxy详解指南-第三章:HAproxy实例
- 【积淀】半夜突然有点想法
- sqlmap 进行sql漏洞注入
- Linux学习笔记-文件压缩与解压缩
- 数据结构---多源最短路径
- [学习笔记]--ASP.Net MVC
- Java(58):maven test 运行特定单元测试类
- 计算机二级纸张b5大小,b5的尺寸(a4a5b5纸张大小对比)
- 5-1. 约分最简分式(15)
- 6.misc类设备与蜂鸣器驱动
- UVA#11584Partitioning by Palindromes
- STM32CubeMX介绍、下载与安装
- Python selenium实现全自动购买火车票
- matlab读文件函数程序,Matlab 文件读写函数
- 剑指offer纪念版 何海涛著 部分纠正
- EL PSY CONGROO
- OPPO Find5 X909T ColorOS1.0系统精简笔记
- 纪中游记 - Day45
- 基于Zigbee的智能路灯控制系统的Qt操作界面
热门文章
- AI泡沫之上,创业公司的护城河和边界扩张
- 颠覆认知:SRE 到底是干啥的?
- 它又来了!C**HashMap是如何保证线程安全的?会用不就完了?
- 我把 Spring Boot 的 banner 换成了美女,老板说工作不饱和,建议安排加班
- 漫画 | 小公司卧薪尝胆三年,意外拿到美团offer
- TCP/IP 基础知识总结
- 算法工程师在岗3年小结!
- 机器学习之sklearn基础教程!
- 傅里叶变换取代Transformer自注意力层,谷歌这项研究GPU上快7倍、TPU上快2倍
- 手把手教你洞悉 PyTorch 模型训练过程,彻底掌握 PyTorch 项目实战!(文末重金招聘导师)...