简介
·JDBC(Java Data Base
Connectivity,java数据库连接),由一些接口和类构成的API。
·J2SE的一部分,由java.sql,javax.sql包组成。
连接数据的步骤
1.注册驱动(只做一次)
Class.forName("com.mysql.jdbc.Driver");
推荐这种方式,不会对具体的驱动类产生依赖。
DriverManager.registerDriver(com.mysql.jdbc.Driver);
会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖。
System.setPropery("jdbc.drivers","driver1:driver2");
虽然不会对具体的驱动类产生依赖,但注册不太方便,所以很少使用。
2.建立连接(Connection)
Connection conn =
DriverManager.getConnection(url,user,password);
url格式:
JDBC:子协议:名称//主机名:端口/数据库名?属性名=属性值%...
User,password可以用"属性名=属性值"方式告诉数据库
其他参数如:
useUnicode =
true&characterEncoding=GBK。
3.创建执行SQL的语句(Statement)
4.执行语句
5.处理执行结果(ResultSet)
6.释放资源
原则:链接尽量晚获取,早释放。
例子:
数据库jdbc
create database jdbc;
表user
create table user
(
id int not null,
name varchar(20),
birthday date,
money float
);
insert into user(id, name, birthday, money)
values(1, 'zhangsan', '1985-01-01',100);
insert into user(id, name, birthday, money)
values(2, 'lisi', '1986-01-01',200);
insert into user(id, name, birthday, money)
values(3, 'wangwu', '1987-01-01',300);
java代码:
import java.sql.*;
public class Base {
public static void main(String[] args)
throws SQLException {
test();
}
static void test() throws
SQLException{
//1.注册驱动
DriverManager.registerDriver(new
com.mysql.jdbc.Driver());
//2.建立连接
Connection conn =
DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc",
"root", "root");
//3.创建语句
Statement st =
conn.createStatement();
//4.执行语句
ResultSet rs = st.executeQuery("select *
from user");
//5.处理结果
while(rs.next()){
System.out.println(rs.getObject(1) + "\t" +
rs.getObject(2) + "\t" + rs.getObject(3) + "\t" +
rs.getObject(4));
}
//6.释放资源
rs.close();
st.close();
conn.close();
}
}
规范的JDBC代码:
创建一个工具类:JdbcUtils
import java.sql.*;
//工具类不需要继承,所以使用final
public final class JdbcUtils {
private static String url =
"jdbc:mysql://localhost:3306/jdbc";
private static String user = "root";
private static String password =
"root";
//把构造方法变为私有,防止new
private JdbcUtils(){
}
//类里面静态代码库只会被执行一次
static{
try{
Class.forName("com.mysql.jdbc.Driver");
}catch(ClassNotFoundException e){
throw new
ExceptionInInitializerError(e);
}
}
public static Connection getConnection()
throws SQLException{
return DriverManager.getConnection(url,
user, password);
}
public static void free(ResultSet rs,
Statement st, Connection conn){
try{
if(rs != null){
rs.close();
}
}catch(SQLException e){
e.printStackTrace();
}finally{
try{
if(st != null){
st.close();
}
}catch(SQLException e){
e.printStackTrace();
}finally{
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
}
方法改为:
static void template() throws
Exception{
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try{
//建立连接
conn = JdbcUtils.getConnection();
//创建语句
st = conn.createStatement();
//执行语句
rs = st.executeQuery("select * from
user");
//处理结果
while(rs.next()){
System.out.println(rs.getObject(1) + "\t" +
rs.getObject(2) + "\t" + rs.getObject(3) + "\t" +
rs.getObject(4));
}
}finally{
//无论程序是否出错,finally都会执行。所以写在finally里面。
//释放资源
JdbcUtils.free(rs, st, conn);
}
}
单例模式写工具类:
单例模式:一个虚拟机里面只会有一个实例
package cn.zcy.ltt;
import java.sql.*;
//工具类不需要继承,所以使用final
public final class JdbcUtilsSing {
private String url =
"jdbc:mysql://localhost:3306/jdbc";
private String user = "root";
private String password = "root";
private static JdbcUtilsSing instance =
null;
//把构造方法变为私有,防止new
private JdbcUtilsSing(){
}
public static JdbcUtilsSing
getInstance(){
//延时加载:第一次访问时才new对象
if(instance == null){
//解决延时加载可能出现的问题,需要加锁
synchronized (JdbcUtilsSing.class) {
//双重检查 必须在JDK1.5以上版本运行
if(instance == null){
instance = new JdbcUtilsSing();
}
}
}
return instance;
}
//类里面静态代码库只会被执行一次
static{
try{
Class.forName("com.mysql.jdbc.Driver");
}catch(ClassNotFoundException e){
throw new
ExceptionInInitializerError(e);
}
}
public Connection getConnection() throws
SQLException{
return DriverManager.getConnection(url,
user, password);
}
public void free(ResultSet rs, Statement
st, Connection conn){
try{
if(rs != null){
rs.close();
}
}catch(SQLException e){
e.printStackTrace();
}finally{
try{
if(st != null){
st.close();
}
}catch(SQLException e){
e.printStackTrace();
}finally{
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
}
调用函数:
static void templateSing() throws
Exception{
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try{
//建立连接
conn =
JdbcUtilsSing.getInstance().getConnection();
//创建语句
st = conn.createStatement();
//执行语句
rs = st.executeQuery("select * from
user");
//处理结果
while(rs.next()){
System.out.println(rs.getObject(1) + "\t" +
rs.getObject(2) + "\t" + rs.getObject(3) + "\t" +
rs.getObject(4));
}
}finally{
//无论程序是否出错,finally都会执行。所以写在finally里面。
//释放资源
JdbcUtilsSing.getInstance().free(rs, st,
conn);
}
}