JDBC技术

1、JDBC简介
java

  JDBC,Java Ddatabase Connection,Java数据库链接。mysql

  Sun公司为了简化、统一对数据库的操做,定义了一套Java操做数据库的规范,称之为JDBC。程序员

wKiom1jTsi2SZw6CAAA9tlwO81M640.png

wKioL1jTskyA8LrJAABH8_oqf5o968.png


什么是驱动?两个设备要进行通讯,知足必定通讯数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,经过软件能够与该设备进行通讯。sql


若是没有JDBC,Java程序员须要面向各个数据库驱动接口编程,开发复杂;sun公司提供一套统一JDBC接口规范,Java程序只须要使用JDBC就能够操做任何数据库,JDBC实现类由各个数据库厂商提供。数据库


1.组成JDBC的2个包:java.sql和javax.sql。编程

DriverManger驱动管理类、Connection链接接口、Statement(PreparedStatement、CallableStatement)数据库操做、ResultSet结果集。并发

2.开发jdbc应用须要以上2个包外,还须要导入相应JDBC的数据库实现。oracle


2、JDBC快速入门
ide

建立一个user表url

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
);
package cn.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import com.mysql.jdbc.Driver;

public class Test1 {
	public static void main(String[] args) throws Exception {
		//加载数据库驱动
		DriverManager.registerDriver(new Driver());
		//获取链接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15", "root", "root");
		//建立用于向数据库发送SQL的Statement对象,并发送SQL
		Statement stat = conn.createStatement();
		//从结果集中取出数据
		String sql = " select * from user ";
		ResultSet rs = stat.executeQuery(sql);
		while(rs.next()){
			System.out.println(rs.getInt(1)+","+rs.getString(2)+","+rs.getString(3)+","+rs.getString(4));
		}
		//断开数据库的链接,并释放相关资源
		rs.close();
		conn.close();
		
	}
}


3、JDBC编程步骤

wKiom1jTuAixemdMAADHwV-kFrs058.png


4、JDBC访问数据库的流程

wKioL1jTuEGxsmJJAADmygqL-IA232.png

5、JDBC API详解


5.1DriverManager类

  jdbc程序中的DriverManager用于加载驱动,并建立和数据库的链接,这个API的经常使用方法:

DriverManager.registerDriver(new Driver);
DriverManager.getConnection(url,username,password);

 注意,在实际开发中并不推荐采用registerDriver方法注册驱动,缘由有二:

    1)查看Driver的源代码能够看出,若是采用此种方式,会致使驱动程序注册两次,也就是在内存中会有两个Driver对象。

package com.mysql.jdbc;

import java.sql.DriverManager;
import java.sql.SQLException;

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
	static {
		try {
			DriverManager.registerDriver(new Driver());
		} catch (SQLException E) {
			throw new RuntimeException("Can't register driver!");
		}
	}
}

    2)程序依赖MySQL的API,脱离MySQL的jar包,程序将没法编译,未来程序切换底层数据库将会很是麻烦。


  推荐方式:class.forName("com.mysql.jdbc.Driver");

    采用此种方式不会致使驱动对象在内存中重复出现,而且采用此种方式,程序仅仅只须要一个字符串,不须要依赖具体的驱动,使得程序的灵活性更高。


一样,在开发中也不建议采用具体的驱动类型指向getConnection方法返回的Connection对象。


5.2数据库URL

URL用于标识数据库的位置,程序员经过URL地址告诉JDBC程序链接那个数据库,URL的写法为:

wKioL1jTu6nhyVbtAAAt0VWrL_M556.png

经常使用数据库URL的地址的写法:

oracle  jdbc:oracle:thin:@localhost:1521:sid
mysql    jdbc:mysql://localhost:3306/sid

经常使用属性:useUnicode=true&characterEncoding=UTF-8


5.3Connection链接接口

应用一:获取SQL的操做对象

Statement stat = conn.createSteatement() 该对象能够将SQL发送给数据库进行执行
PreparedStatement pstmt = conn.prepareStatement(String sql) 对SQL语句进行预编译,防止SQL注入
CallableStatement cstmt = conn.prepareCall(String sql) 该对象能够调用数据库中存储过程


应用二:对数据库事务进行管理

conn.setAutoCommit(boolean flag) 设置事务是否自动提交
conn.commit()    提交数据库事务
conn.rollback()    回滚数据库事务


5.4Statement 用于将SQL发送给数据库,获取操做结果

  jdbc程序中的Statement对象用于向数据库发送SQL语句,Statement对象经常使用方法::

executeQuery(String sql) 用于向数据发送查询语句
executeUpdate(String sql) 用于向数据库发送insert、update或delete语句
execute(String sql) 用于向数据库发送任意SQL语句
addBatch(String sql) 把多条SQL语句放到一个批处理中
executeBatch() 向数据库发送批处理执行


5.5ResultSet

  jdbc程序中采用的ResultSet用于表明SQL语句的执行结果。ResultSet封装执行结果的时候,采用相似于表格的方式。ResultSet对象维护了一个指向表格数据行的游标,初始化的时候,游标在第一行以前,调用next()方法,可使得游标指向具体的数据行,进而调用方法获取该行数据。

  resultSet既然用于封装执行结果,因此该对象提供的大部分方法都是用获取数据的get方法:

    获取任意类型的数据

getObject(int index) 
getObject(String columnName)

   获取指定类型的数据

getString(int index)

getString(String columnName)


5.6释放资源

  jdbc程序运行完毕后,切记要释放程序在运行过程当中,建立的那些与数据库进行交互的对象,这些对象一般是ResultSet、Statement和Connection对象。

  特别是Connection对象,它是很是稀有的资源,用完后必须立刻释放,若是Connection不能及时、正确的关闭,极易致使系统宕机。Connection的使用原则是尽可能晚建立,尽可能早的释放。

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


6、JDBC完成CRUD示例

增长:

private static void create() throws Exception {
		//加载数据库驱动
		Class.forName("com.mysql.jdbc.Driver");
		//获取链接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15", "root", "root");
		//建立用于向数据库发送SQL的Statement对象,并发送SQL
		Statement stat = conn.createStatement();
		String sql = " insert into user (username,password,email) values('哈哈','haha','hah@163.com') ";
		int rows = stat.executeUpdate(sql);
		if(rows > 0){
			System.out.println("执行增长完毕");
		}
		
		//断开数据库的链接,并释放相关资源
		conn.close();
	}

删除

private static void delete() throws Exception {
		//加载数据库驱动
		Class.forName("com.mysql.jdbc.Driver");
		//获取链接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15", "root", "root");
		//建立用于向数据库发送SQL的Statement对象,并发送SQL
		Statement stat = conn.createStatement();
		String sql = " delete from user where username = '哈哈'; ";
		int rows = stat.executeUpdate(sql);
		if(rows > 0){
			System.out.println("执行删除完毕");
		}
		
		//断开数据库的链接,并释放相关资源
		conn.close();

	}

修改

private static void update() throws Exception {
		//加载数据库驱动
		Class.forName("com.mysql.jdbc.Driver");
		//获取链接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15", "root", "root");
		//建立用于向数据库发送SQL的Statement对象,并发送SQL
		Statement stat = conn.createStatement();
		String sql = " update user set email = '123@163.com' where id = 1 ";
		int rows = stat.executeUpdate(sql);
		if(rows > 0){
			System.out.println("执行修改完毕");
		}
		
		//断开数据库的链接,并释放相关资源
		conn.close();
		
	}

查询

//加载数据库驱动
		Class.forName("com.mysql.jdbc.Driver");
		//获取链接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15", "root", "root");
		//建立用于向数据库发送SQL的Statement对象,并发送SQL
		Statement stat = conn.createStatement();
		//从结果集中取出数据
		String sql = " select * from user ";
		ResultSet rs = stat.executeQuery(sql);
		while(rs.next()){
			System.out.println(rs.getInt(1)+","+rs.getString(2)+","+rs.getString(3)+","+rs.getString(4));
		}
		//断开数据库的链接,并释放相关资源
		rs.close();
		conn.close();


7、DAO模式

  DAO模式(Data Access Object 数据库访问对象),在持久成经过DAO将数据源操做彻底封装起来,业务层经过Java对象,完成对数据源操做。

wKioL1jTw32hBa1pAAECA62sYNg848.png

相关文章
相关标签/搜索