[19/05/06-星期一] JDBC(Java DataBase Connectivity,java数据库连接)_基本知识
一、概念
JDBC(Java Database Connectivity)为java开发者使用数据库提供了统一的编程接口,它由一组java类和接口组成。是java程序与数据库系统通信的标准API。
JDBC API 使得开发人员可以使用纯java的方式来连接数据库,并执行操作。sun公司由于不知道各个主流商用数据库的程序代码,因此无法自己写代码连接各个数据库,
因此,sun公司决定,自己提供一套api,凡是数据库想与Java进行连接的,数据库厂商自己必须实现JDBC这套接口。而数据库厂商的JDBC实现,称为数据库的数据库驱动。
JDBC驱动程序由各个数据库厂商提供,如mysql的驱动程序
二、JDBC接口
(1)Driver接口
– Driver接口由数据库厂家提供,对于java开发者而言,只需要使用Driver接口就可以了。
– 在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序。不同的数据库有不同的装载方法。
– 驱动:就是各个数据库厂商实现的Sun公司提出的JDBC接口。 即对Connection等接口的实现类的jar文件
– 装载MySql驱动 Class.forName("com.mysql.jdbc.Driver");
– 装载Oracle驱动 Class.forName("oracle.jdbc.driver.OracleDriver");
(2)DriverManager接口
– DriverManager是JDBC的管理层,作用于用户和驱动程序之间。
– DriverManager跟踪可用的驱动程序,并在数据库和相应的驱动程序之间建立连接。
(3)Connection接口
– Connection与特定数据库的连接(会话),在连接上下文中执行 SQL语句并返回结果。
– DriverManager的getConnection()方法建立在JDBC URL中定义的数据库Connection连接上
– 连接MYSQL数据库:Connection con =DriverManager.getConnection("jdbc:mysql://host:port/database","user","password");
– 连接ORACLE数据库:Connection con =DriverManager.getConnection("jdbc:oracle:thin:@host:port:databse","user","password");
(4)Statement接口
– 用于执行静态 SQL 语句并返回它所生成结果的对象。
三种Statement类:
• Statement:由createStatement创建,用于发送简单的SQL语句。(不带参数的)
• PreparedStatement:继承自Statement接口,由prepareStatement创建,用于发送含有一个或多个输入参数的sql语句。PreparedStatement对象比Statement对象的效率更
高,并且可以防止SQL注入。我们一般都用PreparedStatement.
• CallableStatement:继承自PreparedStatement 。由方法prePareCall创建,用于调用存储过程。
常用的Statement方法:
• execute():运行语句,返回是否有结果集
• executeQuery():运行select语句,返回ResultSet结果集
• executeUpdate():运行insert/update/delete操作,返回更新的行数
(5)ResultSet接口
– Statement执行SQL语句时返回ResultSet结果集。
– ResultSet提供的检索不同类型字段的方法,常用的有:
• getString():获得在数据库里是varchar、char等数据类型的对象。
• getFloat():获得在数据库里是Float类型的对象。
• getDate():获得在数据库里面是Date类型的数据。
• getBoolean():获得在数据库里面是Boolean类型的数据
/**
* 测试与数据库的连接
*/
package com.sxt.jdbc; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement; public class Demo01 {
public static void main(String[] args) throws Exception {
//1、加载mysql驱动
Class.forName("com.mysql.jdbc.Driver");//加载mysql数据库的Driver类驱动。这个类是由mysql厂商写的驱动程序的提供,非sun官方 //2、建立连接。程序与数据库建立连接(是比较耗时的)。Connection是Java官方给的接口,让数据库厂商去实现它。
//参数("jdbc:mysql://host:port/database","user","password");那台机器那个端口连接哪一个数据库,用户名,密码
Connection coon=DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","123456"); //3、执行sql语句。execute:[英文]执行 Statement:声明;事务;语句. Statement是Java官方的接口
/**Statement容易发生sql注入的危险。因为他可以采用拼接字符串的形式,参数可以从外界传进来,可能有恶意代码
* 下面的id采用拼接字符串的形式
* String id="5 or 1=1"; 这个 or 1=1就是恶意代码,可以把数据库的所有数据删除。
* String sqlStr="delete from t_user where id"+id;
* 这种方式不推荐
* */
/*Statement state=coon.createStatement();
String sqlStr="insert into t_user (id,username,pwd,ragTime) values (5,'李贺',980,now())";
state.execute(sqlStr);*/ /**使用PreparedStatement提高安全性,PreparedStatement是Java官方的接口,有数据库厂商提供实现
*?是占位符,外界只能传入符合数据库类型的数据,像or 1=1这样的恶意代码不能传入。第1个?代表只能传入一个int型数字
*其余同理。防止sql恶意注入,提高安全
* */ String sql="insert into t_user (id,username,pwd,ragTime) values (?,?,?,now())";//?是占位符
PreparedStatement ps=coon.prepareStatement(sql);
ps.setObject(1, 6);//1代表第1个占位符,不是从0开始,6是id号. 等价于ps.setInt(1, 6); Object是通用类型
ps.setObject(2, "苏轼");//2代表第2个占位符 等价于ps.setString(2, "苏轼");
ps.setObject(3, "897");//传入时间也可采用new java.sql.Date(System.currentTimeMillis()),前提是采用占位符
//ps.execute(); //executeUpdate():运行insert/update/delete操作,返回更新的行数,是个int的值,表示受到这个sql语句影响的行数
String sql2="select *from t_user where id>?";
PreparedStatement ps2=coon.prepareStatement(sql2);
ps2.setObject(1, 2);//查询id>2的记录 ,Query[英文]查询
ResultSet rs=ps2.executeQuery();//executeQuery():运行select语句,返回ResultSet结果集
while (rs.next()) {//1 2 3 4代表列 第l列数int型 第2和3列数String型 第4列是Date型
System.out.println(rs.getInt(1)+" "+rs.getString(2)+" "+rs.getString(3)+" "+rs.getDate(4));
} //4、关闭连接 顺序是result ->statement-> connection
rs.close();
ps2.close();
ps.close();
coon.close(); }
}
【特别】
详细操作:灵活指定SQL语句中的变量
– PreparedStatement 对存储过程进行调用
– CallableStatement 运用事务处理
– Transaction 批处理
– Batch 对于大量的批处理,建议使用Statement,因为PreparedStatement的预编译空间有限 当数据量特别大时,会发生异常。
/**
* 练习批处理
*/
package com.sxt.jdbc; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement; public class Demo02 {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection coon=DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","123456");
coon.setAutoCommit(false);//把事务(执行语句) 设为手动提交就是false Statement state=coon.createStatement(); for (int i = 10; i < 15; i++) {//Batch:[英文]一批
state.addBatch("insert into t_user (id,username,pwd,ragTime) values ("+i+",'李 "+i+" ',888,now())");
} state.executeBatch(); coon.commit(); } }
三、事务
一组要么同时执行成功,要么同时执行失败的SQL语句。是数据库操作的一个执行单元!
如:往银行卡中存钱,既要向本人的银行卡数据库中增加一条记录,又要向银行系统的日志中增加一条记录。如果存钱失败,则2个数据库都失败,要么都成功增加记录
他们2个是个单元。是个整体。
开始于:数据操纵语言(Data Manipulation Language, DML)
• 连接到数据库上,并执行一条DML语句(INSERT、UPDATE或DELETE)。
• 前一个事务结束后,又输入了另外一条DML语句。
结束于:
• 执行COMMIT或ROLLBACK语句。
• 执行一条DDL语句,例如CREATE TABLE语句;在这种情况下,会自动执行COMMIT语句。
• 执行一条DCL语句,例如GRANT语句;在这种情况下,会自动执行COMMIT语句。
• 断开与数据库的连接。
• 执行了一条DML语句,该语句却失败了;在这种情况中,会为这个无效的DML语句执行ROLLBACK语句。
事务的四大特点(ACID)
– atomicity(原子性)
• 表示一个事务内的所有操作是一个整体,要 么全部成功,要么全失败;
– consistency(一致性)
• 表示一个事务内有一个操作失败时,所有的更改过的数据都必须回滚到修改前的状态;
– isolation(隔离性)
• 事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。
事务隔离级别从低到高:
– 读取未提交(Read Uncommitted)
– 读取已提交(Read Committed)
– 可重复读(Repeatable Read)
– 序列化(serializable)
– durability(持久性)
• 持久性事务完成之后,它对于系统的影响是永久性的。
/***
* 测试事务
*/
package com.sxt.jdbc; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement; public class Demo03 {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection coon=DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","123456");
coon.setAutoCommit(false);//默认是true 自动提交,这里是手动提交。通过设置如果ps2语句有错,即使ps1语句没错
//数据库也不会改变因为他们是一批事务.他们要么同时成功要么同时失败。 PreparedStatement ps1=coon.prepareStatement("insert into t_user (id,username,pwd,ragTime) values (?,?,?,now())");
ps1.setObject(1, 7);
ps1.setObject(2, "韩愈");
ps1.setObject(3, "667");
ps1.execute();
Thread.sleep(2000); PreparedStatement ps2=coon.prepareStatement("insert into t_user (id,username,pwd,ragTime) values (?,?,?,now())");
ps2.setObject(1, 8);
ps2.setObject(2, "陆游");
ps2.setObject(3, "907");
ps2.execute(); coon.commit(); } }
四、时间类型
/***
* 测试时间处理相关的(java.sql.Date 年月日,Time 时分秒,TimeStamp 时间戳 年与日时分秒)
*/
package com.sxt.jdbc; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Timestamp;
import java.util.Random; public class Demo04 {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection coon=DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","123456"); PreparedStatement ps1=coon.prepareStatement("insert into t_user (id,username,pwd,ragTime) values (?,?,?,?)");
ps1.setObject(1, 9);
ps1.setObject(2, "曹操");
ps1.setObject(3, "689");
//1、测试java.sql.Date
java.sql.Date date=new java.sql.Date(System.currentTimeMillis());
ps1.setObject(4, date);//Date类在添加到数据库中只有年月日是没有时分秒,如果数据库采用时间戳格式则时分秒默认为00:00:00
//ps1.execute(); //2、测试java.sql.TimeStamp 时间戳
PreparedStatement ps2=coon.prepareStatement("insert into t_user (id,username,pwd,ragTime) values (?,?,?,?)");
ps2.setObject(1, 10);
ps2.setObject(2, "杜牧");
ps2.setObject(3, "459");
//若要插入指定日期需要使用Calendar类 或者DateFormat类
Timestamp ts =new Timestamp(System.currentTimeMillis());
ps2.setObject(4, ts);
//ps2.execute(); //3、测试插入随机日期
for (int i = 15; i <= 20; i++) {
PreparedStatement ps3=coon.prepareStatement("insert into t_user (id,username,pwd,ragTime) values (?,?,?,?)");
ps3.setObject(1, i);
ps3.setObject(2, "杜"+i);
ps3.setObject(3, "999"); int rand=200000+new Random().nextInt(10000000);//1000万范围的随机数+200000
Timestamp ts2 =new Timestamp(System.currentTimeMillis()-rand);//单位是毫秒
ps3.setObject(4, ts2);
ps3.execute();
} }
}
/***
* 查询指定日期的记录
*/
package com.sxt.jdbc; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.DateFormat;
import java.text.SimpleDateFormat; import javax.xml.stream.events.EndDocument; public class Demo05 { public static long strToDate(String strDate) throws Exception { DateFormat format=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
return format.parse(strDate).getTime();//把传进来的字符串改成时间格式然后获取它的时间
} public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection coon=DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","123456"); String sql="select *from t_user where ragTime>? and ragTime<?";
PreparedStatement ps=coon.prepareStatement(sql);
java.sql.Timestamp start=new java.sql.Timestamp(strToDate("2019-05-10 10:00:00"));
java.sql.Timestamp end=new java.sql.Timestamp(strToDate("2019-05-15 10:00:00")); ps.setObject(1, start);//设置第一个占位符,查询ragTime>start的记录 ,Query[英文]查询
ps.setObject(2, end);
ResultSet rs=ps.executeQuery();//executeQuery():运行select语句,返回ResultSet结果集
while (rs.next()) {//1 2 3 4代表列 第l列数int型 第2和3列数String型 第4列是Date型 也可以写rs.getInt("id")等
System.out.println(rs.getInt(1)+" "+rs.getString(2)+" "+rs.getString(3)+" "+rs.getTimestamp(4));
} } }
[19/05/06-星期一] JDBC(Java DataBase Connectivity,java数据库连接)_基本知识的更多相关文章
- JDBC (Java DataBase Connectivity)数据库连接池原理解析与实现
一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...
- JDBC(Java Database Connectivity,Java数据库连接)API是一个标准SQL(Structured Query Language
JDBC(Java Database Connectivity,Java数据库连接)API是一个标准SQL(Structured Query Language,结构化查询语言)数据库访问接口,它使数据 ...
- 【学习笔记】JDBC数据库连接技术(Java Database Connectivity)
一.JDBC简介 Java是通过JDBC技术实现对各种数据库的访问的,JDBC是Java数据库连接技术的简称.它可以把数据持久保存,是一种持久化机制. 1.持久化 持久化就是将程序中的数据在瞬时状态和 ...
- JDBC(Java Database Connectivity)编写步骤
JDBC是代表一组公共的接口,是Java连接数据库技术: JDBC中的这些公共接口和DBMS数据库厂商提供的实现类(驱动jar),是为了实现Java代码可以连接DBMS,并且操作它里面的数据而声名的. ...
- [19/05/07-星期二] JDBC(Java DataBase Connectivity)_CLOB(存储大量的文本数据)与BLOB(存储大量的二进制数据)
一. CLOB(Character Large Object ) – 用于存储大量的文本数据 – 大字段有些特殊,不同数据库处理的方式不一样,大字段的操作常常是以流的方式来处理的.而非一般的字段,一次 ...
- [19/05/05-星期日] JDBC(Java DataBase Connectivity,java数据库连接)_mysql基本知识
一.概念 (1).是一种开放源代码的关系型数据库管理系统(RDBMS,Relational Database Management System):目前有很多大公司(新浪.京东.阿里)使用: (2). ...
- [19/05/08-星期三] JDBC(Java DataBase Connectivity)_ORM(Object Relationship Mapping, 对象关系映射)
一.概念 基本思想: – 表结构跟类对应: 表中字段和类的属性对应:表中记录和对象对应: – 让javabean的属性名和类型尽量和数据库保持一致! – 一条记录对应一个对象.将这些查询到的对象放到容 ...
- JDBC:(java database Connection) java数据库连接。
JDBC 指 Java 数据库连接,是一种标准Java应用编程接口( JAVA API),用来连接 Java 编程语言和广泛的数据库. JDBC连接步骤: 1.先导入jar包,把jar放入到工程下并 ...
- [19/05/13-星期一] HTML_head标签 和 body标签_文本标签
一.概念 概念:超文本标记语言 作用:需要将Java在后台根据用户的请求处理结果在浏览器显示给用户.数据已经过来了,但是显示可能比较凌乱,所以html应用而生,就像写作文要加标点看着舒服. 在浏览器中 ...
随机推荐
- hdu 4638 Group(离线+树状数组)
Group Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- VMware使用自带工具vmware-vdiskmanager精简占用磁盘空间
https://blog.csdn.net/xcl113/article/details/50715943 vmware-vdiskmanager压缩磁盘大小,验证有效 一 .sudo apt-get ...
- java String源码浅出
1.public char charAt(int index) 返回指定索引处的 char 值. 源码: =====================String.class============== ...
- java 中的编码(二)
UTF-16编码规则: 按照UTF-16编码规则计算下Unicode码位为 U+10002 (十进制:65538)的字符的UTF-16编码表示. U+10002落在 [U+10000, U+10FFF ...
- classloader加载class的流程及自定义ClassLoader
java应用环境中不同的class分别由不同的ClassLoader负责加载.一个jvm中默认的classloader有Bootstrap ClassLoader.Extension ClassLoa ...
- 快速幂(Fast Pow)
定义 快速求a^b%c的算法 原理 指数可以被二进制分解 那么a^b可以分解为a^2^k1*a^2^k2*…… 又显然a^2^(k+1)=a^(2^k*2)=(a^2^k)^2 所以可以将指数在二进制 ...
- Django模板自定义标签和过滤器,模板继承(extend),Django的模型层
上回精彩回顾 视图函数: request对象 request.path 请求路径 request.GET GET请求数据 QueryDict {} request.POST POST请求数据 Quer ...
- luogu 3488 [POI2009]LYZ-Ice Skates 线段树 + 思维
Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin), ...
- 【bzoj4136】[FJOI2015]带子串包含约束LCS问题
题目描述: 带有子串包含约束的最长公共子序列问题可以具体表述如下. 给定2个长度分别为n和m的序列X和Y,以及一个子串包含约束集S. S中共有k个字符串S={S1,S2,…,Sk},其中字符串Si的长 ...
- WEB编程 入门简单 进阶难
其实不论是WEB还是其他什么编程,都是这个道理,至于为什么,我贴几段代码,大家感受下. JS 计算今天是星期几 入门级 // 计算系统当前是星期几 var str =""; var ...