当前位置:Gxlcms > 数据库问题 > IT十八掌 JDBC

IT十八掌 JDBC

时间:2021-07-01 10:21:17 帮助过:5人阅读

JDBC

Jdbc介绍

快速入门

Jdbc api详情

Sql注入

PreparedStatement

JDBC处理大数据

JDBC批处理

 

 

JDBC介绍

dbc是什么?

JDBCJava Data Base Connectivity,java数据库连接)

简单说:就是可以直接通过java语言,去操作数据库。

 

jdbc是一套标准,它是由一些接口与类组成的


学习中涉及到的类与接口

它们主要在两个包下

java.sql

:DriverManger

接口  Connection Statement ResultSet  PreparedStatement

CallableStatement(它是用于调用存储过程)

javax.sql

接口 DataSource



什么是驱动?

  两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信

 

 

 

 

 

 

 

 

JDBC体验

编程从user表中读取数据,并打印在命令行窗口中。

create table user(

   id int primary key auto_increment,

   username varchar(20) unique not null,

   password varchar(20) not null,

   email varchar(40) not null

);

一、搭建实验环境

1、在mysql中创建一个库,并创建user表和插入表的数据。

2、新建一个Java工程,并导入数据驱动。

二、编写程序,在程序中加载数据库驱动

DriverManager. registerDriver(Driver driver)

三、建立连接(Connection)

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

四、创建用于向数据库发送SQLStatement对象,并发送sql

Statement st = conn.createStatement();

ResultSet rs = st.executeQuery(sql);

五、从代表结果集的ResultSet中取出数据,打印到命令行窗口

六、断开与数据库的连接,并释放相关资源

 

1.下载驱动

将驱动jar包复制到lib.

2.创建一个JdbcDemo1

// 1.注册驱动

DriverManager.registerDriver(new Driver());

 

// 2.获取连接对象

Connection con = DriverManager.getConnection(

"jdbc:mysql://localhost:3306/day17", "root", "abc");

 

// 3.通过连接对象获取操作sql语句Statement

Statement st = con.createStatement();

 

// 4.操作sql语句

String sql = "select * from user";

 

// 操作sql语句(select语句),会得到一个ResultSet结果集

ResultSet rs = st.executeQuery(sql);

 

// 5.遍历结果集

// boolean flag = rs.next(); // 向下移动,返回值为true,代表有下一条记录.

// int id = rs.getInt("id");

// String username=rs.getString("username");

// System.out.println(id);

// System.out.println(username);


while(rs.next()){

int id=rs.getInt("id");

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

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

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


System.out.println(id+"  "+username+"  "+password+"  "+email);

}


//6.释放资源

rs.close();

st.close();

con.close();

JDBC编程步骤

技术分享 

 

JDBC访问数据库的流程

通过DriverManager加载驱动程序driver//

通过DriverManager类获得表示数据库连接的Connection类对象;

通过Connection对象绑定要执行的语句,生成Statement类对象;

执行SQL语句,接收执行结果集ResultSet

可选的对结果集ResultSet类对象的处理;

必要的关闭ResultSetStatementConnection

 

 

 

 

 

DriverManager介绍

技术分享 

 

技术分享 

 

技术分享 

 

加载可以通过反射加载

// DriverManager.registerDriver(new Driver()); //加载了两个驱动

Class.forName("com.mysql.jdbc.Driver"); // 加载mysql驱动

Class.forName("oracle.jdbc.driver.OracleDriver");// 加载oracle驱动

 

怎么知道是加载mysql还是oracal数据呢?

url作用:就是用于确定使用哪一个驱动.

mysql url:  jdbc:mysql://localhsot:3306/数据库名.

oralce url:   jdbc:oracle:thin:@localhost:1521:sid

 

总结

1.注册驱动

 DriverManager.registDriver(new Driver());


 1.DriverManager

   它是java.sql包下的一个驱动管理的工具类,可以理解成是一个容器(Vector),可以装入很多数据库驱动

它的registDriver方法分析

 public static synchronized void registerDriver(java.sql.Driver driver)

参数:java.sql.Driver

我们传递的是  com.mysql.jdbc.Driver;

  

com.mysql.jdbc.Driver类中有一段静态代码块:


static {

try {

java.sql.DriverManager.registerDriver(new Driver());

} catch (SQLException E) {

throw new RuntimeException("Can‘t register driver!");

}

}

上述代码的问题:

 1.在驱动管理器中会装入两个mysql驱动.

 解决方案:使用反射

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


 分析:使用反射的方式来加载驱动有什么好处?

 1.只加载一次,装入一个驱动对象.

 2.降低耦合,不依赖于驱动.


2.可以通过DriverManager来获取连接对象

  Connection con=DriverManager.getConection(String url,String user,String password);

 url作用:就是用于确定使用哪一个驱动.

 mysql url:  jdbc:mysql://localhsot:3306/数据库名.

 oralce url: jdbc:oracle:thin:@localhost:1521:sid


  总结:DriverManager作用:

1.注册驱动

2.获取连接Connection

 

 

关于url

url格式

主协议  子协议   主机 端口  数据库

jdbc   :  mysql ://localhost:3306/day24?


mysqlurl可以简写:

  前提:主机是localhost 端口是3306

 jdbc:mysql:///day17


了解:url后面可以带参数

 useUnicode=true&characterEncoding=UTF-8

 

技术分享 

 

 

Connection详解

java.sql.Connection,它代表的是一个连接对象。简单说,就是我们程序与数据库连接。


Connection作用:

 1.可以通过Connection获取操作sqlStatement对象。

 Statement createStatement() throws SQLException

  示例:

 Statement st=con.createStatement();


  了解:

 1.可以获取执行预处理的PreparedStatement对象.

 PreparedStatement prepareStatement(String sql) throws SQLException

 2.可以获取执行存储过程的 CallableStatement

 CallableStatement prepareCall(String sql) throws SQLException


             2.操作事务

setAutoCommit(boolean flag);开启事务

               

rollback();事务回滚  

commit();事务提交

 

Statement详解

java.sql.Statement用于执行sql语句.

Statement作用:

  1.执行sql

 DML:insert update delete

    int executeUpdate(String sql)


 利用返回值判断非0来确定sql语句是否执行成功。


 DQL:select

ResultSet executeQuery(String sql)


  可以通过execute方法来执行任何sql语句.

   execute(String sql):用于向数据库发送任意sql语句

 

2.批处理操作

  addBatch(String sql); sql语句添加到批处理

  executeBatch();批量执行

  clearBatch();清空批处理.

 

案例:

//演示executeUpdate方法

public class JdbcDemo3 {

 

public static void main(String[] args) throws SQLException,

ClassNotFoundException {

 

// 1.注册驱动

 

Class.forName("com.mysql.jdbc.Driver"); // 加载mysql驱动

 

String url = "jdbc:mysql:///day17";

 

// 2.获取连接对象

Connection con = DriverManager.getConnection(url, "root", "root");

 

// 3.通过连接对象获取操作sql语句Statement

Statement st = con.createStatement();

 

// 4.执行update语句

int row = st.executeUpdate("update user set password=‘135‘ where id=1");

System.out.println(row);

// 6.释放资源

st.close();

con.close();

}

}

 

ResultSet详解

java.sql.ResultSet它是用于封装select语句执行后查询的结果

常用API

 1.next()方法

public boolean next();用于判断是否有下一条记录。如果有返回true,并且让游标向下移动一行。

如果没有返回false.


2.可以通过ResultSet提供的getXxx()方法来获取当前游标指向的这条记录中的列数据。

常用:

getInt()

getString()

getDate()

getDouble()

参数有两种

1.getInt(int columnIndex);

2.getInt(String columnName);


如果列的类型不知道,可以通过下面的方法来操作

getObject(int columnIndex);

   getObject(String columnName);

 

技术分享 

 

 

技术分享 

思考:如果SQL语句可能会返回一行数据,也可能查不到任何记录时,代码应该怎么写?

 

 

程序详解—释放资源

Jdbc程序运行完后,切记要释放程序在运行过程中,创建的那些与数据库进行交互的对象,这些对象通常是ResultSet, StatementConnection对象。

 

特别是Connection对象,它是非常稀有的资源,用完后必须马上释放,如果Connection不能及时、正确的关闭,极易导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放。

 

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

 

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

 

//对异常进行try-catch

public class JdbcDemo5 {

 

public static void main(String[] args) {

Connection con = null;

Statement st = null;

ResultSet rs = null;

try {

// 1.注册驱动

 

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

 

// 2.获取连接

con = DriverManager.getConnection("jdbc:mysql:///day17", "root",

"abc");

 

// 3.获取操作sql语句对象Statement

st = con.createStatement();

 

// 4.执行sql

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

 

// 5.遍历结果集

while (rs.next()) {

int id = rs.getInt("id");

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

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

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

 

System.out.println(id + "  " + username + "  " + password

+ "  " + email);

}

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (SQLException e) {

e.printStackTrace();

} finally {

// 6.释放资源

 

try {

if (rs != null) {

rs.close();

}

} catch (SQLException e) {

e.printStackTrace();

}

 

try {

if (st != null)

st.close();

} catch (SQLException e) {

e.printStackTrace();

}

try {

if (con != null)

con.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

}

}

CURD

//jdbccrud操作

public class JdbcDemo6 {

 

@Test

public void findByIdTest() {

// 1.定义sql

String sql = "select * from user where id=1";

 

Connection con = null;

Statement st = null;

人气教程排行