一:JDBC

1.什么是JDBC

JDBC(Java Data Base Connectivity)SUN公司提供的一套操作数据库的标准规范。具体来讲是一种用于执行SQL语句的Java API,为多种数据库开发驱动的提供标准规范。

2.数据库驱动

我们安装好数据库之后,我们的应用程序也是不能直接使用数据库的,必须要通过相应的数据库驱动程序,通过驱动程序去和数据库打交道。数据库厂商为各自的数据库开发相应的驱动,例如Mysql的驱动,Oracle的驱动。

二:JDBC规范(掌握四个核心对象)

1.Driver接口

  Driver接口由数据库厂家提供,作为java开发人员,只需要使用Driver接口就可以了。在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序,不同的数据库有不同的装载方法。如:

  装载MySql驱动:Class.forName("com.mysql.jdbc.Driver");

  装载Oracle驱动:Class.forName("oracle.jdbc.driver.OracleDriver");

2.Connection接口

  Connection与特定数据库的连接(会话),在连接上下文中执行sql语句并返回结果。DriverManager.getConnection(url, user, password)方法建立在JDBC URL中定义的数据库Connection连接上。

  连接MySql数据库:Connection conn = DriverManager.getConnection("jdbc:mysql://host:port/database", "user", "password");

  连接Oracle数据库:Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@host:port:database", "user", "password");

  连接SqlServer数据库:Connection conn = DriverManager.getConnection("jdbc:microsoft:sqlserver://host:port; DatabaseName=database", "user", "password");

常用方法:

  createStatement():创建向数据库发送sql的statement对象。

  prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。

  prepareCall(sql):创建执行存储过程的callableStatement对象。

  setAutoCommit(boolean autoCommit):设置事务是否自动提交。

  commit() :在链接上提交事务。

  rollback() :在此链接上回滚事务。

3.Statement接口

  用于执行静态SQL语句并返回它所生成结果的对象。

三种Statement类:

  Statement:由createStatement创建,用于发送简单的SQL语句(不带参数)。

  PreparedStatement :继承自Statement接口,由preparedStatement创建,用于发送含有一个或多个参数的SQL语句。PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入,所以我们一般都使用PreparedStatement。

  CallableStatement:继承自PreparedStatement接口,由方法prepareCall创建,用于调用存储过程。

常用Statement方法:

  execute(String sql):运行语句,返回是否有结果集

  executeQuery(String sql):运行select语句,返回ResultSet结果集。

  executeUpdate(String sql):运行insert/update/delete操作,返回更新的行数。

  addBatch(String sql) :把多条sql语句放到一个批处理中。

  executeBatch():向数据库发送一批sql语句执行。

4.ResultSet接口

ResultSet提供检索不同类型字段的方法,常用的有:

  getString(int index)、getString(String columnName):获得在数据库里是varchar、char等类型的数据对象。

  getFloat(int index)、getFloat(String columnName):获得在数据库里是Float类型的数据对象。

  getDate(int index)、getDate(String columnName):获得在数据库里是Date类型的数据。

  getBoolean(int index)、getBoolean(String columnName):获得在数据库里是Boolean类型的数据。

  getObject(int index)、getObject(String columnName):获取在数据库里任意类型的数据。

  ResultSet还提供了对结果集进行滚动的方法:

  next():移动到下一行

  Previous():移动到前一行

  absolute(int row):移动到指定行

  beforeFirst():移动resultSet的最前面。

  afterLast() :移动到resultSet的最后面。

  使用后依次关闭对象及连接:ResultSet → Statement → Connection

三:JDBC使用步骤

1.注册驱动 (只做一次)

在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM,这过程通过java.lang.Class类的静态方法forName(String calssName)实现。成功加载后,会将Driver接口的实例注册到DriverManager类中。

  方式一:Class.forName(“com.MySQL.jdbc.Driver”);
  推荐这种方式,不会对具体的驱动类产生依赖。
  方式二:DriverManager.registerDriver(com.mysql.jdbc.Driver);
  会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖。

2.建立连接

  1)通过jdbc连接的URL:

  URL用于标识数据库的位置,通过URL地址告诉JDBC程序连接哪个数据库,后面还可以加编码方式等,URL的写法为:

   

  2)创建数据库的连接:

  要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象,该对象就代表一个数据库的连接。

  Connection conn = DriverManager.getConnection(url, user, password); 

3.创建执行SQL语句的statement

  要执行SQL语句,必须获得java.sql.Statement实例,该实例分为以下三种:

(1)、执行静态SQL语句,通常用Statement实例实现;

(2)、执行动态SQL语句,通常用PreparedStatement实例实现;

(3)、执行数据库存储过程,通常用CallableStatement实例实现。

  具体实现方式:

  Statement st = conn.createStatement();

  PreparedStatement ps = conn.preparedStatement(sql);

  CallableStatement cstmt = conn.prepareCall(“{CALL demoSp(?,?)}”);

***注:SQL语句分为4种:DDL,DML,DCL,DQL.

  执行SQL语句,Statement接口提供了三种执行SQL语句的方法:executeQuery、executeUpdate、execute。

  (1)ResultSet executeQuery(String sqlString)执行查询数据库的SQL语句,返回一个结果集(ResultSet)对象。

  (2)int executeUpdate(String sqlString)用于执行SQL的DML和DDL语句。

  (3)execute(String sqlString)用于执行返回多个结果集、多个更新计数或二者结合的语句。

  具体实现方式:

  ResultSet rs = st. executeQuery(“SELECT*FROM...”);

  int rows = st. executeUpdate(“INSERT INTO...”);

  boolean flag = st. execute(String sql)

方式1:

1
//Statement

2
String id = "5";

3
String sql = "delete from table where id=" +  id;

4
Statement st =
conn.createStatement();

5
st.executeQuery(sql);

6
//存在sql注入的危险

7
//如果用户传入的id为“5 or 1=1”,那么将删除表中的所有记录

方式2:

1  //PreparedStatement 有效的防止sql注入(SQL语句在程序运行前已经进行了预编译,当运行时动态地把参数传给PreprareStatement时,即使参数里有敏感字符如 or '1=1'也数据库会作为一个参数一个字段的属性值来处理而不会作为一个SQL指令)
2 String sql = “insert into user (name,pwd) values(?,?)”;  
3 PreparedStatement ps = conn.preparedStatement(sql);  
4 ps.setString(1, “col_value”);  //占位符顺序从1开始
5 ps.setString(2, “123456”); //也可以使用setObject
6 ps.executeQuery();
 

4.处理结果ResultSet

两种情况:

(1)执行更新返回的是本次操作影响到的记录数;

(2)执行查询返回的是一个结果集(ResultSet)对象。

1 ResultSet rs = ps.executeQuery();  
2 While(rs.next()){  
3     rs.getString(“col_name”);  
4     rs.getInt(1);  
5     //…
6 }  

5.释放资源

(把上面创建的对象依次close,ResultSet → Statement → Connection)

 //数据库连接(Connection)非常耗资源,尽量晚创建,尽量早的释放
 //都要加try catch 以防前面关闭出错,后面的就不执行了
 1 try {
 2     if (rs != null) {
 3         rs.close();
 4     }
 5 } catch (SQLException e) {
 6     e.printStackTrace();
 7 } finally {
 8     try {
 9         if (st != null) {
10             st.close();
11         }
12     } catch (SQLException e) {
13         e.printStackTrace();
14     } finally {
15         try {
16             if (conn != null) {
17                 conn.close();
18             }
19         } catch (SQLException e) {
20             e.printStackTrace();
21         }
22     }
23 } 

四:事务

1.事务概念

Mysql中的事务:

a、mysql引擎是支持事务的

b、mysql默认自动提交事务。每条语句都处在单独的事务中。

c、手动控制事务:

开启事务:start transaction | begin

提交事务:commit

回滚事务:rollback

提交前,数据操作是在内存中进行的

2.事务的四大特点(ACID)

原子性(atomicity):指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

一致性(consistency):事务必须使数据库从一个一致性状态变换到另外一个一致性状态。转账前和转账后的总金额不变。(即如果一个事务内有一个操作失败,所有更改过的数据必须回滚到修改前的状态)。

隔离性(isolation):事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,多个并发事务之间要相互隔离。(即一个事务查看某个数据时,要么是另一个并发事务修改它之前的状态,要么是修改它之后的状态,不会看到中间状态的数据)

持久性(durability):指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该

对其有任何影响。

3.隔离级别

赃读:指一个事务读取了另一个事务未提交的数据。

不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同。一个事务读取到了另一个事务提交后的数据。(update)

虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。  (insert)

数据库通过设置事务的隔离级别防止以上情况的发生:

* 1、READ UNCOMMITTED: 赃读、不可重复读、虚读都有可能发生。

* 2、READ COMMITTED: 避免赃读。不可重复读、虚读都有可能发生。(oracle默认的)

* 4、REPEATABLE READ:避免赃读、不可重复读。虚读有可能发生。(mysql默认)

* 8、SERIALIZABLE: 避免赃读、不可重复读、虚读。

级别越高,性能越低,数据越安全

mysql中:

查看当前的事务隔离级别:SELECT @@TX_ISOLATION;

更改当前的事务隔离级别:SET TRANSACTION ISOLATION LEVEL 四个级别之一。

设置隔离级别必须在事务之前

JDBC控制事务的隔离级别:

Connection接口:

五:连接池

负责分配、管理和释放数据库连接,它允许应用程序重复使用同一个数据库连接(但不是同时,即一个不用了,另一个再用)。

目的:解决建立数据库连接耗费资源和时间很多的问题,提高性能。

参考:https://www.cnblogs.com/erbing/p/5805727.html以及网络查找

JDBC、事务和连接池的更多相关文章

  1. jdbc事务、连接池概念、c3p0、Driud、JDBC Template、DBUtils

    JDBC 事务控制 什么是事务:一个包含多个步骤或者业务操作.如果这个业务或者多个步骤被事务管理,则这多个步骤要么同时成功,要么回滚(多个步骤同时执行失败),这多个步骤是一个整体,不可分割的. 操作: ...

  2. 一、DAO设计模式 二、DAO设计模式的优化 三、JDBC中的事务,连接池的使用

    一.DAO设计模式概述###<1>概念 DAO,Data Access Object ,用于访问数据库的对象. 位于业务逻辑和数据持久化层之间,实现对数据持久化层的访问![](1.png) ...

  3. 十三、事务、连接池 、ThreadLocal 、BaseServlet自定义Servlet父类 、 DBUtils à commons-dbutils

    l 事务 l 连接池 l ThreadLocal l BaseServlet自定义Servlet父类(只要求会用,不要求会写) l DBUtils à commons-dbutils 事务 l 事务的 ...

  4. eclipse下jdbc数据源与连接池的配置及功能简介

    今天在做四则运算网页版的时候遇到了一个困惑,由于需要把每个产生的式子存进 数据库,所以就需要很多次重复的加载驱动,建立连接等操作,这样一方面写程序不方便,加大了程序量,另一方面,还有导致数据库的性能急 ...

  5. jdbc事务处理和连接池

    JDBC: * JDBC概念:Java DataBase Connectivity(Java数据库连接) SUN公司提供的一组连接数据库API. * JDBC开发步骤: * 1.注册驱动. * 2.获 ...

  6. jdbc基础 (五) 连接池与数据源 DBCP以及C3P0的使用

    一.连接池的概念和使用 在实际应用开发中,特别是在WEB应用系统中,如果JSP.Servlet或EJB使用JDBC直接访问数据库中的数据,每一次数据访问请求都必须经历建立数据库连接.打开数据库.存取数 ...

  7. Java实战之04JavaWeb-05事务和连接池

    一.事务部分 1.事务的简介 做一件事情,这个一件事情中有多个组成单元,这个多个组成单元要不同时成功,要不同时失败.A账户转给B账户钱,将A账户转出钱的操作与B账户转入钱的操作绑定到一个事务中,要不这 ...

  8. 03 事务,连接池DBCP,C3P0,DBUtils

    事务 Transaction  其实指的一组操作,里面包含许多个单一的逻辑.只要有一个逻辑没有执行成功,那么都算失败. 所有的数据都回归到最初的状态(回滚) 事务的作用:为了确保逻辑的成功. 例子: ...

  9. jdbc pool java连接池技术

    1 ConnectPool .java: 2 3 package pool; 4 5 /** 6 * Title: ConnectPool.Java 7 * Description: 连接池治理器 8 ...

随机推荐

  1. FFT卷积相加模板

    struct Complex { double r,i; Complex(double _r,double _i):r(_r),i(_i){} Complex(){} Complex operator ...

  2. mysql数据库优化原则

    一.一个例子 数据库需要处理的行数: 189444*1877*13482~~~479亿 如果在关联字段上加上合适的索引: 数据库需要处理的行数:368006*1*3*1~~~110万 MySQL通常是 ...

  3. 开启WIFI

    C:\Windows\system32>netsh wlan set hostednetwork mode=allow ssid=wuyechun-wifi k ey= 承载网络模式已设置为允许 ...

  4. HDU 3003

    找规律吧.可以快速幂模 #include <iostream> #include <cstdio> using namespace std; __int64 Power(__i ...

  5. C语言:一个涉及指针函数返回值与printf乱码、内存堆栈的经典案例

    一个奇怪的C语言问题,涉及到指针.数组.堆栈.以及printf.以下实现: 整数向字符串的转换,返回字符串指针,并在main函数中调用printf显示. #include<stdio.h> ...

  6. 前端 自定义format函数

    为字符串创建format方法,用于字符串格式化  {# 前端没有字符串占位符%s的替代方法,以下是自定义字符串替换的方法,以后前端拓展方法都可以使用下面的形式 #} String.prototype. ...

  7. h5-news_index

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdcAAABuCAIAAAD6VM6fAAAUEUlEQVR4nO2dfXRTZZ7Hfx735Z/lr9 ...

  8. How to remove focus without setting focus to another control?

    How to remove focus without setting focus to another control? Ask Question up vote 67 down vote favo ...

  9. BZOJ:2958 序列染色 DP

    bzoj2958 序列染色 题目传送门 Description 给出一个长度为N由B.W.X三种字符组成的字符串S,你需要把每一个X染成B或W中的一个. 对于给出的K,问有多少种染色方式使得存在整数a ...

  10. chrome设置书签默认显示

    实用的设置! 这样已设置,就可以方便的查看一些常用的书签了!