JDBC基础

JDBC

JDBC(Java Data Base Connectivity)是一种用于执行SQL语句的JavaAPI,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序


JDBC原理
  • JDBC是以前SUN公司定义的一套访问数据库的接口,具体的实现由各大数据库厂家去实现。数据库厂家有自家的JDBC驱动实现类,Java应用程序连接指定数据库,需要使用厂家提供的JDBC驱动才能连接。
  • Application
  • –> JDBC Driver Interface
  • –>Oracle(SQLServer、MySQL) JDBC Driver
  • –>Oracle(SQLServer、MySQL) Database
连接数据库
  1. 加载驱动
  • 右击项目-> Build Path -> Configure Build Path -> Add Exteranl JARs->在MySQL的文件夹找Connector J/
  • Class.forName(驱动名)
  1. 连接数据库
  • static Connection DriverManager.getConnection(String url,String user,String password);
  • url命名方式:“协议名:子协议//主机名:端口/数据库名”。如 jdbc:mysql://localhost:3306/db_book
  • 为了使MySQL JDBC驱动与UTC时区配合使用,需要在url后面指定serverTimezone。如:jdbc:mysql://localhost:3306/db_book?serverTimezone=UTC
  1. 使用语句操作数据库
  2. 关闭数据库连接,释放资源
  • Connection.close();
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class demo1 {
	private static String jdbcName = "com.mysql.cj.jdbc.Driver";
	private static String dbUrl = "jdbc:mysql://localhost:3306/bookstore?serverTimezone=UTC";
	private static String dbUserName = "root";
	private static String dbPassword = "1234";

	public static void main(String[] args) {
		try {
			Class.forName(jdbcName);
			System.out.println("jdbc loaded successfully");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			System.out.println("jdbc loaded failed");
			e.printStackTrace();
		}
		Connection con = null;
		try {
			con = DriverManager.getConnection(dbUrl, dbUserName, dbPassword);
			System.out.println("db connected successfully");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("jdbc connnected failed");
			e.printStackTrace();
		} finally {
			try {
				con.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}
Statement

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

  • int executeUpdate(String sql),执行sql语句,可能为insert、update、delete语句,或者不返回任何内容的sql语句(sql ddl 语句)。
  • void close(),立即释放Statement对象的数据库和JDBC资源,而不是等待该对象自动关闭时发生此操作。
...
java.sql.Statement stmt = con.createStatement();
int res = stmt.executeUpdate(sql);
stmt.close();
con.close();
...
PreparedStatement

PreparedStatement是Statement的子接口,属于预处理操作。PreparedStatement在操作时,先在数据库中准备好一条SQL语句,具体内容以后再进行设置,开发更常用。

...
Book book = new Book(...);
String sql = "insert into t_book values(null,?,?,?,?)";
PreparedStatememt pstmt=con.perparedStatement(sql);

pstmt.setString(1,book.getBookName);
pstmt.setString(2,book.getBookWriter);
pstmt.setString(3,book.getBookType);
pstmt.setFloat(4,book.getPrice);

pstmt.close();
con.close();
...
ResultSet

遍历二维的结果集,获取每一行的数据

  • boolean next(); //讲光标从当前位置向前移动一行
  • String getString(int columnIndex);
  • String getString(String columnLabel); //以Java编程语言中String的形式获取此ResultSet对象的当前行中指定列的值
...
List<Book> bookList = new ArrayList<Book>();
ResultSet rs = pstmt.executeQuery(sql);
while(rs.next()){
    int id = rs.getInt(1);
    //rs.getInt("id");
    String bookName = rs.getString(2);
    //rs.getString("bookname");
    String bookWriter = rs.getString(3);
    //rs.getString("writer");
    String bookType = rs.getString(4);
    //rs.getString("type");
    Float price = rs.getFloat(5);
    //rs.getFloat("price");
    Book book=new book(id,bookName,bookWriter,bookType,price);
    bookList.add(book);
}
...
处理大数据对象

主要有CLOB(character large object大型文本数据)和BLOB(binary large oject大型二进制数据)两种类型的字段。

...
//写入
File context=book.getContext();
InputStream is = new FileInputStream(context);
pstmt.setAsciiStream("context",is,context.length());

File pic=book.getPic();
is = new FileInputStream(pic);
pstmt.setBinaryStream("picture",is,pic.length());
//读取
Clob c = rs.getClob("context");
String str = c.getSubString(1,(int)c.length());

Blob b=rs.getBlob("picture");
new FileOutputStream(new FIle(...)).write(b.getBytes(1,(int)b.length()).close();
...
CallableStatement
  • CallableStatement 主要是调用数据库中的存储过程,CallableStatement 也是Statement 接口的子接口。在使用
    CallableStatement 时可以接收存储过程的返回值。
  • void registerOutParameter(int parameterIndex, int sqlType) //
    按顺序位置parameterIndex 将OUT 参数注册为JDBC 类型sqlType。
...
String sql = "call pro_getBookNameById(?,?)";
CallabelStatement cstmt = con.prepareCall(sql);
cstmt.setInt(1,id);
cstmt.registerOutParameter(2,Types.VARCHAR);
//设置返回类型
cstmt.execute();
String bookName=cstmt.getString("bN");
...

过程pro_getBookNameById源代码如下

create definer='root'@'localhost' procedure 'pro_getBookNameById'(in bookId int, out bN varchar(20))
begin
    select b_name into bN from t_book where id=bookId;
end;
使用元数据分析数据库
  1. 使用DatabaseMetaData 获取数据库基本信息
  • DatabaseMetaData 可以得到数据库的一些基本信息,包括数据库的名称、版本,以及得到表的信息。
  • String getDatabaseProductName() 获取此数据库产品的名称。
  • int getDriverMajorVersion() 获取此JDBC 驱动程序的主版本号。
  • int getDriverMinorVersion() 获取此JDBC 驱动程序的次版本号。
DatabaseMetaData dmd = con.getMetaData();
System.out.println(dmd.getDriverMajorVersion()+dmd.getDriverMinorVersion());
  1. 使用ResultSetMetaData 获取ResultSet 对象中的信息
  • ResultSetMetaData 可获取关于ResultSet 对象中列的基本信息;
  • int getColumnCount() 返回此ResultSet 对象中的列数。
  • String getColumnName(int column) 获取指定列的名称。
  • int getColumnTypeName(int column) 获取指定列的SQL 类型名称。
...
PreparedStatement pstmt=con.prepareStatement(sql);
ResultSetMetaData rsmd = pstmt.getMetaData();
int num = rsmd.getColumnCount();
for(int i=1;i<=num;i++){
    System.out.println(rsmd.getColumnName(i)+','+rsmd.getColumnTypeName(i));
}
...
JDBC事物处理

所谓事务就是所有的操作要么一起成功,要么一起失败,事务
本身具有原子性(Atomicity)、一致性(Consistency)、隔离性或独立性(Isolation)、持久性(Durability)4 个特
性,这4 个特性也被称为ACID 特征。

  • 原子性:原子性是事务最小的单元,是不可再分隔的单元,相当于一个个小的数据库操作,这些操作必须同时
    成功,如果一个失败了,则一切的操作将全部失败。

  • 一致性:指的是在数据库操作的前后是完全一致的,保证数据的有效性,如果事务正常操作则系统会维持有效
    性,如果事务出现了错误,则回到最原始状态,也要维持其有效性,这样保证事务开始时和结束时系统处于一
    致状态。

  • 隔离性:多个事务可以同时进行且彼此之间无法访问,只有当事务完成最终操作时,才可以看到结果。

  • 持久性:事务完成之后,它对于系统的影响是永久性的。该修改即使出现致命的系统故障也将一直保持。

  • MySQL的事务支持

命令描述
set autocommit = 0取消自动提交处理,开启事务处理
set autocommit = 1打开自动提交处理,关闭事务处理
start启动事务
begin启动事务,等于start transaction
commit提交事务
rollback回滚全部事务
savepoint 事务保存点名称设置事务保存点
rollback to savepoint 保存点名称回滚操作到保存点
...
Connection con = null;//Connection就是一个事务
try{
    con=dbUtil.getCon();
    con.setAutoCommit(false);//取消自动提交
    Savepoint sp = con.setSavepoint();//设置一个保存点
    //数据库操作
    outCount(con,1,account);
    inCount(con,2,account);
}catch(Exception e){
    try{
        con.rollback(sp);//回滚到sp保存点
    }catch(SQLException e1){
        e1.printStackTrace();
    }
    e.printStackTrace();
}finally{
   try{
    con.commit(); //提交事务
    con.close();
}catch (SQLException e){
    e.printStackTrace();
}
...
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值