JDBC
JDBC作用
可以使用一套代码来连接不同的关系型数据库.
JDBC 六大编程步骤
-
- 注册驱动 - 加载mysql的驱动类进jvm内存.
jdbc4.0规范之后,可以省略不写的.
Class.forName("com.mysql.jdbc.Driver");
-
- 获取连接
//准备参数 //String url = "主协议:次协议://主机ip地址:端口号/数据库名称?连接参数名=连接参数值&参数名2=参数值2"; String url="jdbc:mysql://localhost:3306/j02?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"; String user = "root"; String password = "root"; Connection conn = DriverManager.getConnection(url,user,password);
-
- 创建语句对象
//这个对象作用负责发送sql语句到db-server端. Statement st = conn.createStatement(); //1. 如果执行的是DQL语句,有返回的结果集的,需要进行处理的. //Result executeQuery(sql);
-
- 发送sql语句
//4. 发送sql语句 String sql= "select id,first_name fname,salary from s_emp"; ResultSet rs = st.executeQuery(sql); //2. 如果执行的是DML(insert,update,delete)语句的,返回的是受影响的行数 //int executeUpdate(sql); String sql = "delete from s_emp"; int count = st.executeUpdate(sql);
-
- 处理结果集
简介:如果sql是DML操作,则跳过第5步.如果是DQL,那么才需要处理结果集.
boolean next();//光标向下移动一行.如果下一行有数据,则返回true,否则返回false while(rs.next()){ //1. 通过列在查询结果中的序号 - 获取数据的时候,一定要注意该列在mysql中的数据类型. //int id = rs.getInt(1);//序号是从1开始的 //String name = rs.getString(2); //double salary = rs.getDouble(3); //通过列的名称去获取 int id = rs.getInt("id");//可读性强 String name = rs.getString("fname"); double salary = rs.getDouble("salary") //输出... //补充rs.getString这个方法是可以获取任意类型的. //sex enum('f','m'); //String id = rs.getString(sex);//ok }
-
- 关闭对象
Connection,Statement,ResultSet void close(); //注意关闭的顺序.先创建出来的对象最后关闭. //先后顺序 - ResultSet,Statement,Connection
DB、DBS、DBMS之间有什么关系?
DB:数据库,长期储存在计算机内的、有组织的、可共享的大量数据集合。一个应用系统通常包含多个数据库。
DBMS:数据库管理系统,位于用户(应用程序)与操作系统之间的一层数据库管理软件,DBMS是独立、开放的数据库管理软件(提供多种外部接口,管理的数据可以被其它外部应用程序调用),用于科学地组织和存储数据以及高效地获取和维护数据。
DBS:数据库系统指在计算机应用系统中引入数据库后的系统构成。数据库系统由数据库、数据库管理系统(及其开发工具)、应用系统、数据库管理员(和用户)构成。
DBS包括DB和DBMS
- DBMS
DBMS 数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件
用于建立、使用和维护数据库,简称DBMS。它对数据库进行统一的管理和控制,保证数据库的安全性和完
整性。用户通过DBMS访问数据库中的数据,数据库管理员也通过dbms进行数据库的维护工作。
- DBA
数据库管理员(Database Administrator,简称DBA),是从事管理和维护数据库管理系统(DBMS)的相关工作人员的统称
他属于运维工程师的一个分支,主要负责业务数据库从设计、测试到部署交付的全生命周期管理。DBA的核心目标是保证数据库管理系统的稳定性、安全性、完整性和高性能。
在国外,也有公司把DBA称作数据库工程师(Database Engineer),两者的工作内容基本相同,
都是保证数据库服务7*24小时的稳定高效运转,但是需要区分一下DBA和数据库开发工程师(Database Developer):
数据库开发工程师的主要职责是设计和开发数据库管理系统和数据库应用软件系统,侧重于软件研发;
DBA的主要职责是运维和管理数据库管理系统,侧重于运维管理。
- DBS
数据库系统DBS(Data Base System,简称DBS)通常由软件、数据库和数据管理员组成。
其软件主要包括操作系统、各种宿主语言、实用程序以及数据库管理系统。数据库由数据库
管理系统统一管理,数据的插入、修改和检索均要通过数据库管理系统进行。
数据管理员负责创建监控和维护整个数据库,使数据能被任何有权使用的人有效使用。
可以理解成:DBS = DBMS(核心)+DBA+DB
Statement和PreparedStatement区别
-
前者用于通用查询,后者用于参数查询
-
前者需要sql硬拼接,并且容易造成sql注入
-
前者是只要执行sql语句,数据库端都会进行编译和解释,当遇到批量sql处理的时候,使用
后者提前预编译同构的sql的时候,那么会大大提高性能.
-
同一个statement对象可以用来执行N条不同的sql语句.但是同一个PreaparedStatement
对象只能用来处理同构的sql语句.
元数据
jdbc中用来描述元信息的数据.
存储过程
- 存储过程是为了完成特定功能的SQL语句集,经编译之后存储在数据库中,用户通过指定存储过程的名字并给定参数来调用执行该存储过程,MySQL5.0开始支持存储过程
存储过程的优点
- 增强SQL语言的功能和灵活性:存储过程可以用控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
- 标准组件式编程:存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。
- 较快的执行速度:如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。
存储过程和函数的区别
- 函数只能返回一个变量,而存储过程可以返回多个
- 存储过程的参数有IN,OUT,INOUT三种类型,而函数之后IN一个
- 存储过程不需要声明返回类型,函数在声明时需要描述返回类型,且函数体中必须包含一个有效的RETURN语句
- 存储过程一般作为一个独立部分来执行,而函数可以作为SQL语句的一部分来调用
连接池
种类
commons-pool-1.6.jar
一.DBCP(Database Connection Pool)
是一个依赖Jakarta commons-pool对象池机制的数据库连接池,Tomcat的数据源使用的就是DBCP。目前 DBCP 有两个版本分别是 1.3 和 1.4。1.3 版本对应的是 JDK 1.4-1.5 和 JDBC 3,而1.4 版本对应 JDK 1.6 和 JDBC 4。因此在选择版本的时候要看看你用的是什么 JDK 版本了,功能上倒是没有什么区别。
二.C3P0
是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。
三.Proxool
是一个Java SQL Driver驱动程序,提供了对你选择的其它类型的驱动程序的连接池封装。可以非常简单的移植到现存的代码中。完全可配置。快速,成熟,健壮。可以透明地为你现存的JDBC驱动程序增加连接池功能
四.BoneCP
是一个开源的快速的 JDBC 连接池。BoneCP很小,只有四十几K(运行时需要log4j和Google Collections的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。另外个人觉得 BoneCP 有个缺点是,JDBC驱动的加载是在连接池之外的,这样在一些应用服务器的配置上就不够灵活。当然,体积小并不是 BoneCP 优秀的原因,BoneCP 到底有什么突出的地方呢,请看看性能测试报告。
连接池原理
第一、连接池的建立。一般在系统初始化时,连接池会根据系统配置建立,并在池中创建了几个连接对象,以便使用时能从连接池中获取。
连接池中的连接不能随意创建和关闭,这样避免了连接随意建立和关闭造成的系统开销。Java中提供了很多容器类可以方便的构建连接池,例如Vector、Stack等。
第二、连接池的管理。连接池管理策略是连接池机制的核心,连接池内连接的分配和释放对系统的性能有很大的影响。其管理策略是:
当客户请求数据库连接时,首先查看连接池中是否有空闲连接,如果存在空闲连接,则将连接分配给客户使用;如果没有空闲连接,
则查看当前所开的连接数是否已经达到最大连接数,如果没达到就重新创建一个连接给请求的客户;如果达到就按设定的最大等待时间进行等待,
如果超出最大等待时间,则抛出异常给客户。 当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,
如果超过就从连接池中删除该连接,否则保留为其他客户服务。该策略保证了数据库连接的有效复用,避免频繁的建立、
释放连接所带来的系统资源开销。
第三、连接池的关闭。当应用程序退出时,关闭连接池中所有的连接,释放连接池相关的资源,该过程正好与创建相反。
连接池相关配置
-
maxActive 连接池支持的最大连接数,这里取值为20,表示同时最多有20个数据库连接。一般把maxActive设置成可能的并发量就行了设 0 为没有限制。
-
maxIdle 连接池中最多可空闲maxIdle个连接 ,这里取值为20,表示即使没有数据库连接时依然可以保持20空闲的连接,而不被清除,随时处于待命状态。设 0 为没有限制。
-
minIdle 连接池中最小空闲连接数,当连接数少于此值时,连接池会创建连接来补充到该值的数量
-
initialSize 初始化连接数目
-
maxWait 连接池中连接用完时,新的请求等待时间,毫秒,这里取值-1,表示无限等待,直到超时为止,也可取值9000,表示9秒后超时。超过时间会出错误信息