01 JDBC简介
1. 简介概述各个数据库厂商去实现这套接口,提供数据库驱动jar包我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类 各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发。可随时替换底层数据库,访问数据库的Java代码基本不变。以后编写操作数据库的代码只需要面向JDBC(接口),操作哪儿个关系型数据库就需要导入该数据库的驱动包,如需要操作MySQL数据库,就需要再项目中导入MySQL数据库的驱动包。 jdbc的架构 数据库操作的层次 准备一个数据库:mysql JDBC数据库连接:JDBC定义了数据库操作的规范,数据库驱动实现了数据库操作的规范。 DataSource数据源/连接池。舔奶盖理论,当创建和销毁连接消耗了大量的性能,引进池化技术,创建连接池只释放连接、不销毁连接,实现对连接的复用。 数据库操作框架:SpringData、Mybatis。提供了对JDBC基本数据库操作的封装。 2. 核心类 DriverManager 将第三方尝试实现的驱动jar注册到程序中 可以根据数据库链接信息获取connection Co...
02 JDBC使用
基本步骤 1.注册驱动 准备数据库的建表语句 12345CREATE TABLE user ( id INT AUTO_INCREMENT, name VARCHAR(100), PRIMARY KEY(id)); 通过反射机制+静态代码块初始化数据库驱动。 通过反射的方式读取文件中的数据库驱动类路径,,方便外部化配置 使用静态代码块,在类加载的时候数据库初始化驱动只需要初始化一次,实现数据库驱动的初始化。 1234567891011121314151617181920//反射的方式try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace();}//在无惨构造方法中通过静态代码块初始化了唯一的数据库驱动。public class Driver extends NonRegisteringDri...
03 批量操作
1 使用方法批量执行SQL语句批量执行 SQL 语句当需要成批插入或者更新记录时,可以采用 Java 的 批量 更新 机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率 JDBC 的批量处理语句包括下面三个方法: addBatch(String):添加需要批量处理的 SQL 语句或是参数; executeBatch():执行批量处理语句; clearBatch(): 清空缓存的数据 通常我们会遇到两种批量执行 SQL 语句的情况: 多条 SQL 语句的批量处理; 一个 SQL 语句的批量传参; 使用实例向数据表中插入20000条数据 实现层次一:使用 Statement123456Connection conn = JDBCUtils.getConnection();Statement st = conn.createStatement();for(int i = 1;i <= 20000;i++){ String sql = "insert into goods(name) values('name...
04 事务操作
1 事务操作数据库事务介绍事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态。 事务处理(事务操作): 保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都 被提交(commit),那么这些修改就永久地保存下来;要么数据库管理系统将放弃所作的所有修改,整个事务 回滚(rollback) 到最初状态。 为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单元:当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应全部视为错误,所有从起始点以后的操作应全部回退到开始状态。 JDBC 事务处理数据一旦提交,就不可回滚。 数据什么时候意味着提交? 当一个连接对象被创建时,默认情况下是自动提交事务:每次执行一个 SQL 语句时,如果执行成功,就会向数据库自动提交,而不能回滚。关闭数据库连接,数据就会自动的提交。 如果多个操作,每个操作使用的是自己单独的连接,则无法保证事务。即同一个事务的多个操作必须在同一个连接下。JDBC 程序中为了让多个 SQL 语句作为一个事务执行: 调用 ...
05 连接池
1 简介JDBC数据库连接池的必要性在使用开发基于数据库的 web 程序时,传统的模式基本是按以下步骤: 在主程序(如 servlet、beans )中建立数据库连接 进行 sql 操作 断开数据库连接 这种模式开发,存在的问题: 普通的 JDBC 数据库连接使用 DriverManager 来获取,每次向数据库建立连接的时候都要将 Connection 加载到内存中,再验证用户名和密码(得花费0.05s~1s的时间)。需要数据库连接的时候,就向数据库要求一个,执行完成后再断开连接。这样的方式将会消耗大量的资源和时间。数据库的连接资源并没有得到很好的重复利用。 若同时有几百人甚至几千人在线,频繁的进行数据库连接操作将占用很多的系统资源,严重的甚至会造成服务器的崩溃。 对于每一次数据库连接,使用完后都得断开。 否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将导致重启数据库。(回忆:何为 Java 的内存泄漏?)这种开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃。 数据库连接池技术为解决传统开发中...
06 操作封装
1 泛型方法封装JDBCUtil反射+线程变量实现数据库连接和事务控制 单例化datasource。无需重复创建 使用property从配置文件中加载配置 创建druid线程池复用连接,提升查询效率。 利用线程变量获取连接信息,确保一个线程中的多个方法可以获取同一个connection 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253package org.example.dao;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;import java.io.IOException;import java.io.InputStream;import java.sql.Connection;import java.sql.SQLException;import java.util.Properties;public class...
Java核心思想
1 观察者模式简介先是一种对象间的一对多的关系;最简单的如交通信号灯,信号灯是目标(一方),行人注视着信号灯(多方)。当目标发送改变(发布),观察者(订阅者)就可以接收到改变。 观察者如何处理(如行人如何走,是快走/慢走/不走,目标不会管的), 目标无需干涉;所以就松散耦合了它们之间的关系。 别名:观察者模式、事件监听机制、事件通知机制、回调机制 关键概念 可观察对象、观察者。(观察者模式) 事件、响应。(事件驱动、事件监听机制、响应式编程) 使用场景观察着模式在不同场景下的实现。 java语言中的回调机制 设计模式中的观察者模式 jdk中的observable和observer 在操作系统中就是IO多路复用的一种策略 在socket网络编程、IO编程中(netty、springWebFlux、sofarpc)就是Reactor模式 Spring的事件驱动模型 在UI框架中就是Listener,事件监听机制和响应机制 在web网站开发中,被称为响应式编程。 消息队列中的事件通知机制,消息队列中通过Event的事件传递变化。 2 服务发现机制简介观察者模式...
07 数据访问-2数据源
1 基本概念JDBCjava数据库链接,java database connectivity。java语言用来规范客户访问数据库的应用程序接口。提供了查询、更新数据库的方法。java.sql与javax.sql主要包括以下类: DriverManager:负责加载不同的驱动程序Driver,返回相应的数据库连接Connection。 Driver:对应数据库的驱动程序。 Connection:数据库连接,负责与数据库进行通信。可以产生SQL的statement. Statement:用来执行SQL查询和更新。 CallableStatement:用以调用数据库中的存储过程。 SQLException:代表数据库联机额的建立和关闭和SQL语句中发生的例情况。 数据源 封装关于数据库访问的各种参数,实现统一管理。 通过数据库的连接池管理,节省开销并提高效率。 简单理解,就是在用户程序与数据库之间,建立新的缓冲地带,用来对用户的请求进行优化,对数据库的访问进行整合。 常见的数据源:DBCP、C3P0、Druid、HikariCP。 2 HikariCP默认数据源配置通用配置以...
07 数据访问-4Redis
1 简介引入NoSQLRedis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。 自动配置1234<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-st...
08 单元测试
springboot with junit4 &junit5 https://segmentfault.com/a/1190000040803747 1 概述spring-boot-starter-testSpringBoot中有关测试的框架,主要来源于 spring-boot-starter-test。一旦依赖了spring-boot-starter-test,下面这些类库将被一同依赖进去: JUnit:java测试事实上的标准。 Spring Test & Spring Boot Test:Spring的测试支持。 AssertJ:提供了流式的断言方式。 Hamcrest:提供了丰富的matcher。 Mockito:mock框架,可以按类型创建mock对象,可以根据方法参数指定特定的响应,也支持对于mock调用过程的断言。 JSONassert:为JSON提供了断言功能。 JsonPath:为JSON提供了XPATH功能。 多种测试模式 @RunWith(SpringJUnit4ClassRunner.class)启动Spring上下文环境。 @Ru...













