JDBC连接数据库
14.JDBC连接数据库
现实需求——抽象出概念模型——设计逻辑模型、物理模型
使用jdbc技术需要导入数据库厂商的驱动包,使用dbcp连接池技术需要导入commons-dbcp包
DriverManager类:驱动程序管理器,JDBC定义了一系列的接口,数据库厂商自己具体实现接口。
方法一:用DriverManager的getConnection方法获取连接
方法二:用连接池技术获取连接
两种方法不同之处在于:前者先Class.forName()加载驱动包,再用DriverManager.getConnection(url,userName,pwd)获取一个Connection,剩下的都一样。
连接池:自动初始化一批连接,用户用完后归还,不够时再创建一些连接数,有一个最小连接数和最大连接数,空闲连接数太多自动销毁一部分。
DBCP 和C3P0技术
连接池重写了close方法,driverManager的创建连接后的close是直接关闭连接,连接池的close是用户使用完了之后归还给连接池,Datasource是ConnectionPool的管理者
jdbc规范要求关闭Connection连接时,连接所创建的Statement会自动关闭,所创建的ResultSet也会自动关闭,但是建议依次关闭ResultSet、Statement、Connection。
DataSource常用方法:
setDriverClassName(driverName) setUrl() setUserName() setPassword()
常用方法
Connection接口:连接数据库
默认情况下,Connection对象处于自动提交模式下,这意味着它在执行每个语句后都会自动提交更改。默认非只读模式
常用方法
|
createStatement() 创建一个 Statement 对象来将 SQL 语句发送到数据库。
|
|
|
prepareStatement(String sql) 创建PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。
|
|
|
boolean
|
getAutoCommit() 获取此 Connection 对象的当前自动提交模式。
|
|
void
|
setAutoCommit(boolean autoCommit) 将此连接的自动提交模式设置为给定状态
|
|
void
|
setReadOnly(boolean readOnly) 将此连接设置为只读模式,作为驱动程序启用数据库优化的提示。
|
|
boolean
|
isReadOnly() 查询此 Connection 对象是否处于只读模式。
|
|
void
|
commit() 使所有上一次提交/回滚后进行的更改成为持久更改,并释放此 Connection 对象当前持有的所有数据库锁。
|
|
void
|
rollback() 取消在当前事务中进行的所有更改,并释放此 Connection 对象当前持有的所有数据库锁。
|
|
void
|
close() 立即释放此 Connection 对象的数据库和 JDBC 资源,而不是等待它们被自动释放。
|
Statement接口:执行静态sql语句
|
boolean
|
|
|
executeQuery(String sql) 执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。
|
|
|
int
|
executeUpdate(String sql) 执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者DDL语句,返回更新计数(受影响的行数)
|
|
void
|
close() 立即释放此 Statement 对象的数据库和 JDBC 资源,而不是等待该对象自动关闭时发生此操作
|
preparedStatement接口:继承Statement动态执行sql语句.
|
void
|
setXX(int Index,XX x) 将指定参数设置为x值。1开始
|
|
executeQuery() 执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。
|
|
|
int
|
executeUpdate() 执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者DDL语句
|
PreparedStatement和Statement的区别:
statement把sql语句发送给数据库,数据库将其编译并执行,preparedstatement把带?的sql发送给数据库,数据库把?号的sql语句编译。再接受prepare发送过来的?的替代之执行sql语句,实现sql的复用,还可以避免sql注入攻击。
ResultSet接口:结果集,ResultSet 对象具有指向其当前数据行的光标。最初,光标被置于第一行之前。所以可以在 while 循环中next()使用它来迭代结果集。
常用方法
开发框架常用,了解即可:ResultSetMeteData:结果集元数据
了解一下,工作很少用:可滚动的ResultSet结果集
创建方法:
createStatement(type,concurrency)
prepareStatement(sql,type,concurrency)
Type取值:TYPE_FORWARD_ONLY(默认) TYPE_SCROLL_INSENSITIVE TYPE_SCROLL_UPDATABLE
concurrency取值:CONCUR_READ_ONLY 只读 CONCUR_UPDATABLE 可更新
事务
事务的特性:原子性 一致性 隔离性 持久性
JDBC中,事务默认是自动提交的
JDBC处理事务的通常模式:
获取事务的提交状态
先将事务的自动提交关闭;
执行事务中的若干SQL语句;
事务提交;SQL失败则回滚;
恢复JDBC的事务提交状态;释放资源。
Connection.getAutoCommit() :获得当前事务的提交方式,默认为true
Connection.setAutoCommit():设置事务的提交属性
Connection.commit():提交事务
Connection.rollback():回滚事务
批量更新:先添加到语句对象里,再批量提交
Statement: addBatch(str)
PreparedStatement: addBatch()
executeBatch():statement或preparedStatement批量提交
两个清空batch: clearBatch()
返回自动主键
用PreparedStatement方法
创建PrepareStatement(sql,new String[]{主键名}) 表示ps要记住的字段名称
再通过ps.getGeneratedKeys()返回一个结果集ResultSet,注意这里获取字段的时候getXX()必须使用数字传参
DAO设计模式:
是数据持久层中的所有类的统称,所有用将业务逻辑与数据库操作分离开,使得业务跟专注,并且数据库的操作可以完全面向对象化,DAO负责实体类与数据库中表中数据进行映射。DAO需要以下几个模块:
1.实体类,对应数据库的表,类的属性对应表的字段,类的实例就对应一个记录,实体类可以有有getset方法,必须有无参的构造函数,有包,实现序列化接口。
建议:1.属性类型用表的封装类型,因为数据库中表的内容可以为空,
2.日期采用java.sql下的日期
java.sql.Date(年月日) Time(时分秒) Timestamp(年月日时分秒) 都继承自javfa.util.Date(太笼统)
2.DAO接口,封装所有需要对数据库访问的方法,如insert delete update select
3.DAO接口的实现类,实现DAO接口,为从二维表格到对象的封装
4.接口工厂类
5.JDBC工具类,用于初始化参数,获取连接,关闭连接
6.jdbc中对大对象的处理CLOB(大文本) BLOB(二进制,如图片,视频)
preparedstatement中有setAsciiStream(int dex,InputStream s,int length) setBinaryStream(int dex,InputStream s,int length) 把大文本或者大二进制写入
ResultSet中有getClob(int dex|String s )和getAsciiStream(int dex|String s)获取大文本 getBlob(int dex|String s )和geNinaryStream(int dex|String s)获取二进制

浙公网安备 33010602011771号