java中数据库连接(JDBC)

一、JDBC - Java Database Connectivity

1、java.sql.Driver - 此接口负责建立数据库连接,Driver的实现类由厂商自己完成

eg:Oracle厂商的实现是:oracle.jdbc.driver.OracleDriver
eg:Mysql厂商的实现是:com.mysql.jdbc.Driver

2、java.sql.Connection- 此接口表示一个数据库连接

3、java.sql.DriverManager-创建连接的工具

4、java.sql.ResultSet-查询结果集

1)、 结果集指针初始状态指向第一行之前
2)、 下移指针,最后会移动到最后一行之后
3)、 next() - 移动指针,并返回boolean值表示是否有数据
4)、 getInt(字段序号)
         getInt(字段名)
         getString(字段序号)
    getString(字段名)

      getDouble()
         .......
5)、 setFetchSize(int)
每次next()预先下载的数据行数
默认是1

5、java.sql.Date - 年月日

6、java.sql.Time - 时分秒

7、java.sql.Timestamp - 年月日时分秒

8、sql语句字符串连接时,将字符串中的单引号替换为两个单引号

9、数据库和结果集的元数据

结果集列数、列名、列类型

从结果集获得元数据
ResultSetMetadata m = rs.getMetaData();
getColumnCount() - 列数
getColumnType(列序号) - 字段类型, 使用Types中的常量进行判断
getColumnName(列序号) - 字段名

10、java.sql.PreparedStatement-----Statement 的子类型 

1)、将带?参数的sql语句发送到数据库进行预编译
pstmt = con.prepareStatement(带问号的sql语句)
2)、对问号的值进行设置
setInt(问号序号, 值);
setString(问号序号, 值);


基本类型设置null值:
setNull(问号序号, Types中的常量表示的类型)

引用类型设置null值:
setString(问号序号, null)
setDate(问号序号, null)

日期类型:
setTime(new java.sql.Time(毫秒))
setDate(new java.sql.Date(毫秒))
setTimestamp(new java.sql.Timestamp(毫秒))

3)、执行
pstmt.executeQuery();
pstmt.executeUpdate();

4)、重复执行多次相同的sql语句效率较高
5)、一般使用PreparedStatement比Statement多

10、事务处理

1)、事务原则

A - 原子性
要么都成功,要么都失败
C - 一致性
转账前a+b=100
转账后a+b=100
I - 独立性
一个事务操作完成前
另一个事务不能操作数据
D - 持久性
事务完成后
数据的修改应该持久有效

2)、事务隔离级别

脏读
a事务修改数据且未提交
b事务读到a事务未提交的数据
不可重复读
a事务查询一条数据
b事务修改此条数据并提交
a事务重新查询此条数据,得到不同的数据
幻读、虚读
a事务查询多条数据
b事务插入或删除数据并提交
a事务执行相同的查询,结果多出几行或少了几行

DataBaseMetadata
supportsTransactionIsolationLevel(Connection中表示隔离级别的常量)

Connection
setTransactionIsolation(隔离级别常量)
setAutoCommit(是否自动提交) - 开始事务
commit()
rollback()

11、批处理

addBatch() - 客户端本地将语句添加到批中
executeBatch() - 执行一批语句
clearBatch() - 清楚未执行的一批语句

12、自动主键处理

seqence.nextval
seqence.currval

自动获取主键API
Statement
executeUpdate(sql语句, 自动获取主键常量)
常量:
Statement.RETURN_GENERATED_KEYS
Statement.NO_GENERATED_KEYS
executeUpdate(sql语句, new String[]{主键字段名})

PreparedStatement
con.prepareStatement(sql语句, 自动获取主键常量)
con.prepareStatement(sql语句, new String[]{主键字段名})

stmt.getGeneratedKeys方法
获得生成的主键值数据, 返回ResultSet类型

13、分页处理

con.createStatement(resultSetType,resultSetConcurrency);
con.prepareStatement(sql, , );
---------------------------------------------
resultSetType
ResultSet.TYPE_FORWARD_ONLY 默认
ResultSet.TYPE_SCROLL_INSENSITIVE - 对可更新的结果集中修改的新数据不敏感
ResultSet.TYPE_SCROLL_SENSITIVE - 对可更新的结果集中修改的新数据敏感
resultSetConcurrency
ResultSet.CONCUR_UPDATABLE - 查询结果集中的数据是可修改的
ResultSet.CONCUR_READ_ONLY - 查询结果集是只读的(默认)


rs.absolute(从1开始的行号);

rs.isBeforeFirst()
rs.isAfterLast()

依赖于数据库的分页查询

Oracle
-----------------------------
select * from
(select t.*, rownum r from
(select * from emp) t
where rownum < 4)
where r >= 2

Mysql
------------------------------
select * from emp limit 20, 5
limit 从0开始的起始行号, 条数


SqlServer
------------------------------
select top 25 * from emp
取前25条

 

BLob、CLob
-------------------------
Lob - Large Object
B - Byte
C - Character

Oracle
---------------------------
CLob - 4G
BLob - 4G

MySql
---------------------------
BLob - 255
TinyBlob - 64k
MediumBLob - 16M
LongBLob - 4G


API
--------------------------------
向Blob字段插入数据
PreparedStatement
setBinaryStream(字段, 文件流, int类型字节量)

从Blob字段下载数据
ResultSet
getBinaryStream(字段)

向Clob字段插入数据
PreparedStatement
setCharacterStream(字段, 文件字符流, int类型字符量)

从Clob字段下载数据
ResultSet
getCharacterStream(字段)

连接池
-------------------------
java连接数据库必须使用连接池

DBCP
----------------------
Tomcat


Proxool
C3P0
----------------------
Hibernate


DAO模式 - Data Access Object
-------------------------------------
Dao将业务层与数据存储之间进行解耦和
Dao接口中定义数据访问方法
在不同子类实现中可以实现对不同数据库的访问或
使用不同数据访问api

14、简单demo实例演示

1)、Configuration类,获取数据库配置中的信息

package cn.java.jdbc;

import java.io.InputStream;

import javax.xml.transform.sax.SAXResult;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class Configuration {
    
    private String url;
    private String driver;
    private String username;
    private String password;

    public Configuration() {
    }
    
    public Configuration(String url, String driver, String username,
            String password) {
        super();
        this.url = url;
        this.driver = driver;
        this.username = username;
        this.password = password;
    }
    
    public static Configuration getConfigure()
    {
        
        try {
            InputStream in = Configuration.class.getResourceAsStream("/db.xml");
            return load(in);
        } catch (DocumentException e) {
            e.printStackTrace();
            return null;
        }
        
    }

    private static Configuration load(InputStream in) throws DocumentException {
        SAXReader reader = new SAXReader();
        Document doc = reader.read(in);
        Element jdbc = doc.getRootElement();
        String url = jdbc.element("url").getText();
        String driver = jdbc.element("driver").getText();
        String username = jdbc.element("username").getText();
        String password = jdbc.element("password").getText();
        Configuration cfg = new Configuration(url, driver, username, password);
        return cfg;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getDriver() {
        return driver;
    }

    public void setDriver(String driver) {
        this.driver = driver;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }


}

2)、ConnectionFactory类,封装数据库连接

package cn.java.jdbc;

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

public class ConnectionFactory {
    
    private static ConnectionFactory connectionFactory=null;
    private static Configuration config=Configuration.getConfigure();
    
    private ConnectionFactory()
    {
        try {
        Class.forName(config.getDriver());
    } catch (ClassNotFoundException e) {
    }
    }
    
    public Connection getConnection() throws SQLException
    {
        
        Connection con=null;
        try {
            con=DriverManager.getConnection(config.getUrl(), config.getUsername(), config.getPassword());
            return con;
        }finally{
            if (null != con) {
                con.close();
            }
        }
        
    }
    
    public static ConnectionFactory getInstance()
    {  
        if (null==connectionFactory) {
            connectionFactory=new ConnectionFactory();
        }
        
        return connectionFactory;
        
    }

}

3、ConnectionFactory2类-MySql另外一种连接方法

package cn.java.jdbc;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

public class ConnectionFactory2 {


    private DataSource ds ;

    private static ConnectionFactory2 connectionFactory2 = null;

    private ConnectionFactory2() {
        
        MysqlDataSource myDS = new MysqlDataSource() ;
        myDS.setServerName("localhost");
        myDS.setDatabaseName("class_book");
        myDS.setPort(3306) ;
        myDS.setUser("root");
        myDS.setCharacterEncoding("utf-8");
        myDS.setPassword("");
        this.ds = myDS ;
    }

    public Connection getConnection() throws SQLException {

        Connection conn = null;
        try {
            conn = ds.getConnection() ;
            conn.setAutoCommit(false);
            return conn;
        } catch (SQLException e) {
            if (null != conn) {
                conn.close();
            }
            throw e;
        }
    }

    public static ConnectionFactory2 getInsatnce() {

        if (null == connectionFactory2) {
            connectionFactory2 = new ConnectionFactory2();
        }
        return connectionFactory2;

    }

}

注:上面部分总结来源于一些培训资料,代码是自己总结的,希望对不了解JDBC的开发者有所帮助.

posted @ 2016-04-20 11:15  伟雪无痕  阅读(251)  评论(0)    收藏  举报