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
execute(String sql) 执行给定的 SQL 语句,该语句可能返回多个结果。
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()使用它来迭代结果集。
常用方法
 
 XX
getXX(int columnIndex)/getXX(String str)   列号或者列名获取此 ResultSet 对象的当前行中指定列的值。从1开始,建议写下标
 
开发框架常用,了解即可: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)获取二进制
 
 
 
posted @ 2020-08-23 19:32  z街角的风铃y  阅读(217)  评论(0)    收藏  举报