JDBC(Java Data Base Connectivity)

1.JDBC快速入门

一、JDBC(Java Data Base Connectivity)

1、数据库驱动:

数据库厂商为了方便开发人员从程序中操作数据库而提供的一套jar包,通过导入这个jar包就可以调用其中的方法操作数据库,这样的jar包就叫做数据库驱动

2、JDBC:

sun定义的一套标准,本质上是一大堆的操作数据库的接口所有数据库厂商为java设计的数据库驱动都实现过这套接口,这样一来,统一了不同数据库驱动的方法,开发人员只需要学习JDBC就会使用任意数据库驱动了。

六个步骤实现JDBC:

//1.注册数据库驱动

--由于mysql在Driver类的实现中自己注册了一次,而我们又注册了一次,于是会导致MySql驱动被注册两次。

--创建MySql的Driver对象时,导致了程序和具体的Mysql驱动绑死在了一起,在切换数据库时需要改动java代码。

//DriverManager.registerDriver(new Driver());

Class.forName("com.mysql.jdbc.Driver");

//2.从客户端发出一个和数据库服务端的连接,url=哪台主机哪个端口哪个数据库

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day10", "root", "root");

//3.获取传输器对象。连接=路;传输器=卡车,载数据。

Statement stat = conn.createStatement();

//4.利用传输器传输sql语句到数据库中执行,获取结果集对象

ResultSet rs = stat.executeQuery("select * from user");

//5.遍历结果集获取查询结果

//有一个小游标一行一行的指向结果集,最后一行没东西了返回false

//ResultSet用于代表Sql语句的执行结果。封装执行结果采用的类似于表格的方式。ResultSet 对象维护了一个指向表格数据行的游标,初始的时候,游标在第一行之前,第一次调用ResultSet.next() 方法,游标指向第一行数据,再次调用ResultSet.next()方法,指向下一行,也就是第二行数据。

while(rs.next()){ String name = rs.getString("name");

System.out.println(name);

}

//6.关闭资源

rs.close();

stat.close();

conn.close();

2.JDBC细节

Connection对象,它是非常稀有的资源,用完后必须马上释放,如果Connection不能及时、正确的关闭,极易导致系统宕机。

为确保资源释放代码能运行,资源释放代码也一定要放在finally语句中。

Connection conn = null;

Statement stat = null;

ResultSet rs = null;

try{...... .......

}catch (Exception e) {

e.printStackTrace();

}finally{

//6.关闭资源

if(rs!=null){

try {

rs.close();

} catch (SQLException e) {

e.printStackTrace();

}finally{

rs = null;

}

}

if(stat!=null){

try {

stat.close();

} catch (SQLException e) {

e.printStackTrace();

}finally{

stat = null;

}

}

if(conn!=null){

try {

conn.close();

} catch (SQLException e) {

e.printStackTrace();

}finally{

conn = null;

}

}

}

3.JDBC增删改查

config.properties

driver=com.mysql.jdbc.Driver

url=jdbc:mysql:///day10

user=root

password=root

JDBCUtils.java

public class JDBCUtils {

private staticProperties prop = null;

private JDBCUtils() {

}

static{

try{

prop = new Properties();

prop.load(new                             FileReader(JDBCUtils.class.getClassLoader().getResource("config.properties").getPath()));

}catch (Exception e) {

e.printStackTrace();

throw new RuntimeException(e);

}

}

//连接

public static Connection getConn() throws ClassNotFoundException, SQLException{

// 1.注册数据库驱动

Class.forName(prop.getProperty("driver"));

// 2.获取连接

return DriverManager.getConnection(prop.getProperty("url"), prop.getProperty("user"),     prop.getProperty("password"));

//关闭

public static void close(ResultSet rs, Statement stat,Connection conn)  {.......}

JDBCDemo2.java

@Test

public void update() {

Connection conn = null;

Statement stat = null;

try{

conn = JDBCUtils.getConn();

stat =  conn.createStatement();

stat.executeUpdate("update user set password=999 where name=‘zhaoliu‘");

}catch (Exception e) {

e.printStackTrace();

}finally{

JDBCUtils.close(null, stat, conn);

}

}

4.改造User案例

层与层耦合的概念,利用工厂类解耦,service如何用dao? DaoFactory.getFactory().getDao();

public class DaoFactory {

private static DaoFactory factory = new DaoFactory();

private static Properties prop = null;

static{   try{

prop = new Properties();

prop.load(new     FileReader(DaoFactory.class.getClassLoader().getResource("config.properties").getPath()));

}catch (Exception e) { e.printStackTrace();

throw new RuntimeException(e);  }  }

private DaoFactory() {   }

public static DaoFactory getFactory(){

return factory; }

public UserDao getDao(){

try{

String clazz = prop.getProperty("UserDao");

return  (UserDao) Class.forName(clazz).newInstance();

}catch (Exception e) {  e.printStackTrace();

throw new RuntimeException(e); }  }  }

5.PreparedStatement防止sql注入

SQL注入攻击:

由于dao中执行的SQL语句是拼接出来的,其中有一部分内容是由用户从客户端传入,所以当用户传入的数据中包含sql关键字时,就有可能通过这些关键字改变sql语句的语义,从而执行一些特殊的操作,这样的攻击方式就叫做sql注入攻击

PreparedStatement:

利用预编译的机制将sql语句的主干和参数分别传输给数据库服务器,从而使数据库分辨的出哪些是sql语句的主干哪些是参数,这样一来即使参数中带了sql的关键字,数据库服务器也仅仅将他当作参数值使用,关键字不会起作用,从而从原理上防止了sql注入的问题

PreparedStatement主要有如下的三个优点:

1.可以防止sql注入

2.由于使用了预编译机制,执行的效率要高于Statement

3.sql语句使用?形式替代参数,然后再用方法设置?的值,比起拼接字符串,代码更加优雅.

6.大文本大二进制

数据库中存储的是大数据的路径,大数据存在硬盘上,从数据库读大数据费时费力。

了解即可

*JDBC大数据

Text Blob

1.1设置Text类型

PreparedStatement.setCharacterStream(index, reader, length);

//注意length长度须设置,并且设置为int型

//当包过大时修改配置:[mysqld] max_allowed_packet=64M

1.2获取Text类型

reader = resultSet. getCharacterStream(i);

2.1设置BLOB数据类型

PreparedStatement. setBinaryStream(i, inputStream, length);

2.1获取BLOB类型

InputStream in  = resultSet.getBinaryStream(i);

InputStream in  = resultSet.getBlob(i).getBinaryStream();

public class BlobDemo1 {

@Test

public void findBlob(){

Connection conn = null;

PreparedStatement ps = null;

ResultSet rs = null;

try{

conn = JDBCUtils.getConn();

ps = conn.prepareStatement("select * from blobdemo");

rs = ps.executeQuery();

while(rs.next()){

String name = rs.getString("name");

InputStream in = rs.getBinaryStream("content");

OutputStream out = new FileOutputStream(name);

byte [] bs = new byte[1024];

int i = 0;

while((i=in.read(bs))!=-1){

out.write(bs,0,i);

}

in.close();

out.close();

}

}catch (Exception e) {

e.printStackTrace();

}finally{

JDBCUtils.close(rs, ps, conn);

}

}

@Test

public void addBlob(){

Connection conn = null;

PreparedStatement ps = null;

ResultSet rs = null;

try{

conn = JDBCUtils.getConn();

ps = conn.prepareStatement("insert into blobdemo values (null,?,?)");

ps.setString(1, "洛天依.mp3");

File file = new File("1.mp3");

ps.setBinaryStream(2, new FileInputStream(file),(int)file.length());

ps.executeUpdate();

}catch (Exception e) {

e.printStackTrace();

}finally{

JDBCUtils.close(rs, ps, conn);

}

}

}

7.批处理机制

业务场景:当需要向数据库发送一批SQL语句执行时,应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率。

实现批处理有两种方式,第一种方式:

Statement.addBatch(sql) 执行批处理SQL语句

executeBatch()方法:执行批处理命令

clearBatch()方法:清除批处理命令

Connection conn = null;

Statement st = null;

ResultSet rs = null;

try {

conn = JdbcUtil.getConnection();

String sql1 = "insert into person(name,password,email,birthday)

values(‘kkk‘,‘123‘,‘[email protected]‘,‘1978-08-08‘)";

String sql2 = "update user set password=‘123456‘ where id=3";

st = conn.createStatement();

st.addBatch(sql1);  //把SQL语句加入到批命令中

st.addBatch(sql2);  //把SQL语句加入到批命令中

st.executeBatch();

} finally{

JdbcUtil.free(conn, st, rs);

}

采用Statement.addBatch(sql)方式实现批处理:

优点:可以向数据库发送多条不同的SQL语句。

缺点:

SQL语句没有预编译。

当向数据库发送多条语句相同,但仅参数不同的SQL语句时,需重复写上很多条SQL语句。

实现批处理的第二种方式:

PreparedStatement.addBatch()

conn = JdbcUtil.getConnection();

String sql = "insert into person(name,password,email,birthday) values(?,?,?,?)";

st = conn.prepareStatement(sql);

for(int i=0;i<50000;i++){

st.setString(1, "aaa" + i);

st.setString(2, "123" + i);

st.setString(3, "aaa" + i + "@sina.com");

st.setDate(4,new Date(1980, 10, 10));

st.addBatch();

if(i%1000==0){

st.executeBatch();

st.clearBatch();

}

}

st.executeBatch();

采用PreparedStatement.addBatch()实现批处理

优点:发送的是预编译后的SQL语句,执行效率高。

缺点:只能应用在SQL语句相同,但参数不同的批处理中。因此此种形式的批处理经常用于在同一个表中批量插入数据,或批量更新表的数据。

时间: 2024-10-13 17:27:39

JDBC(Java Data Base Connectivity)的相关文章

Java基础知识强化25:JDBC(Java Data Base Connectivity,java数据库连接)

JDBC  1.    JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名. 2.     有了JDBC,向各种关系数据发送SQL语句就是一件很容易的事.换言之,有了JDBC API,就不必为访问Sybase数据库专门写一

JDBC(Java Data Base Connectivity——java数据库连接)

一.定义 数据库驱动:数据库厂商为了方便开发人员从程序中操作数据库而提供的一套jar包,通过导入这个jar包就可以调用其中的方法操作数据库,这样的jar包就叫做数据库驱动 JDBC:sun定义的一套标准,本质上是一大堆的操作数据库的接口,所有数据库厂商为java设计的数据库驱动都实现过这套接口,这样一来同一了不同数据库驱动的方法,开发人员只需要学习JDBC就会使用任意数据库驱动了. 二.使用JDBC连接数据库 方法一: package com.shelly.jdbc; import java.s

(十七)jdbc(Java Data Base Connectivity,java数据库连接)基础使用

一.JDBC相关概念介绍 1.1 JDBC介绍 SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范(接口),称之为JDBC.这套接口由数据库厂商去实现,这样,开发人员只需要学习jdbc接口,并通过jdbc加载具体的驱动,就可以操作数据库. 如下图所示: 二.编写JDBC程序 2.1 搭建实验环境 A. 启动mysql数据库,即开启mysql/bin/mysqld.exe. B. 创建数据库,并创建所需的表.如下图(在创建数据库和表的时候请对其编码设置为utf-8编码否则后

JDBC(Java Data Base Connectivity)基本用法

一.什么是JDBC JDBC(Java Database Connection)为java开发者使用数据库提供了统一的编程接口,它由一组java类和接口组成.是java程序与数据库系统通信的标准APl. JDBC API使得开发人员可以使用纯 java 的方式来连接数据库,并执行操作. sun公司由于不知道各个主流商用数据库的程序代码,因此无法自己写代码连接各个数据库.因此,sun公司决定自己提供一套api,凡是数据库想与Java进行连接的,数据库厂商自己必须实现JDBC这套接口.而数据库厂商的

JDBC(Java Data Base Connectivity)高级用法

一.批处理 Batch 对于大量的批处理,建议使用statement,因为PreparedStatement的预编译空间有限,当数据量特别大时,会发生异常. 示例 package com.lgd.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /**

JAVA学习笔记一(JAVA输出环境变量)

package mytest; import java.util.*;; public class mymain { public static void main(String[] args) { // TODO Auto-generated method stub System.out.print(new Date()); Properties p=System.getProperties(); p.list(System.out); Runtime rt=Runtime.getRuntim

批处理文件工具(java+shell命令实现)

批处理文件工具(java+shell命令实现) 有一堆语料需要处理一下才能使用,本来应该可以直接用shell脚本直接处理的. 但是对shell脚本不熟,只会简单的一些命令. 因此就利用java+shell命令实现. 也许,直接用shell脚本处理是最好的.或许你有什么绝妙的方法也请告诉我哦! 当然,我这个工具有个好处,就是如果通过shell命令实现不了的功能,可以用java实现, 添加相应接口就可以了. 工具里面的功能,Java负责调度,shell负责具体功能. 意思是说,我写的shell命令是

建造者模式(Java与Kotlin版)

前文推送 设计模式 简单工厂模式(Java与Kotlin版) 工厂方法模式(Java与Kotlin版) 抽象工厂模式(Java与Kotlin版) Kotlin基础知识 Kotlin入门第一课:从对比Java开始 Kotlin入门第二课:集合操作 Kotlin入门第三课:数据类型 初次尝试用Kotlin实现Android项目 1. 定义 建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 2. 结构 Product:产品角色:

工厂方法模式(Java与Kotlin版)

前文推送 设计模式 简单工厂模式(Java与Kotlin版) Kotlin基础知识 Kotlin入门第一课:从对比Java开始 Kotlin入门第二课:集合操作 Kotlin入门第三课:数据类型 初次尝试用Kotlin实现Android项目 1. 定义 工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式.在工厂方法模式中,工厂父类负责