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的开发者有所帮助.
浙公网安备 33010602011771号