本帖最后由 小石姐姐 于 2018-6-7 10:21 编辑
就业班_JavaEE_day10_11_JDBC
一概述
开发人员
jdbc接口规范 sun规定的标准,在 java.sql 包下
mysql驱动jar包 oracle驱动jar包 数据库厂商提供
mysql数据库 oracle数据库
二 开发流程
1注册驱动
Class.forName("com.mysql.jdbc.Driver"); 加载mysql驱动类,实现自动注册。
因为所有的数据库厂商提供的Driver实现类都添加了静态代码块来自动注册。代码如下:
static {
DriverManager.registerDriver(new Driver());
}
2获取连接
String url = "jdbc:mysql://localhost:3306/store"; jdbc:mysql 表示协议 localhost:3306 表示数据库服务器IP和端口 store 表示数据库名称
Connection conn = DriverManager.getConnection(String url,String username,String password);
3获取Statement
Statement stmt = conn.createStatement();
4执行sql并返回resultset
ResultSet rs = stmt.executeQuery(String sql);
5处理结果集
while(rs.next()) { //rs.next() 将结果集的游标向下移动一行。默认在第一行的前面。
rs.getInt();
rs.getString();
}
6释放资源
rs.close() stmt.close() conn.close() 先开后关,写在finally中 标准写法如下:
if(rs != null) {
try{
rs.close();
}catch(SQLException e) {
e.printStack();
}
rs = null;
}
三 API
1 Driver
2 DriverManager
1 DriverManager.regedistDriver(new com.msql.jdbc.Driver());
2 DriverManager.getConnection(String url,String username,String password);
3 Connection
1 statement
2 事务操作
4 Statement(实际不用)
executeQuery(DQL) executeUpdate(DML,DDL) 批处理
5 PreparedStatement (mysql5之后默认不支持预编译,需要通过参数设置开启 useServerPrepStmts=true)
好处:
* 防止SQL注入 ,屏蔽输入字符串中的mysql关键字功能,当作普通字符串。
* 提高可读性
* 提高效率
预编译原理:
sql需要先被校验语法,然后被编译,才能被执行。pstmt的sql在第一次会做校验语法和编译,第二次则跳过语法校验和编译过程,从而提高效率。
SQL模板带有占位符?,占位符索引从1开始 模糊查询的匹配符在参数设置中体现,在sql中不体现。ps.setString("%s%")
6 CallableStatement 调用存储过程
注意:ps和cs是statement的子接口
7 ResultSet
1 next() 判断下一行是否有数据 默认resultset的行光标在第一行的前面。
2 getInt() getString() getDouble() getDate() (返回的是java.sql.Date) getObject()
索引或者列名 索引从1开始 如果有别名则是别名 建议用列名来获取。
四 JDBCUtils自定义工具类
将注册驱动、获取连接、释放资源的代码 和 jdbc连接的四要素用配置文件进行加载 进行封装。
五 批处理
批处理 url中添加参数rewriteBatchedStatements=true
Statement批处理
sql1 sql2 addBatch(sql1) addBatch(sql2) executeBatch() clearBatch()
PreparedStatement批处理
sql setString(1,"name1") addBatch() setString(1,"name2") addBatch() executeBatch() clearBatch()
eg:
String sql = "insert into t_user(username,pwd,email) values(?,?,?)";
ps = conn.prepareStatement(sql);
for (int i = 0; i <= 10000; i++) {
ps.setString(1, "wangwu"+i);
ps.setString(2, "pwd"+i);
ps.setString(3, "wangwu"+i+"@163.com");
ps.addBatch();
if(i % 1000 == 0){
ps.executeBatch();
ps.clearBatch();
}
}
六 事务
事务由Connection管理,核心思想是业务的各个逻辑操作要由同一个connection 进行管理。
操作步骤如下:
setAutoCommit commit rollback setSavePoint
七 连接池概述
1 javax.sql包下的DataSource 连接池接口
2 连接池原理:在服务器启动时,就初始化一批连接供应用使用,应用使用完不关闭连接,而是归还给连接池。这样就节省了连接的创建和关闭时间。
3 自定义连接池。增强类的方法有3种方式: 1 子类继承父类重写父类方法 2 装饰者模式 装饰类实现与被装饰类相同的接口,并持有被装饰类的引用。3 动态代理
eg MyConnection implements Connection {
Connection conn = DriverManager.getConnection(url,username,password);
public statement createStatement(){
conn.createStatement();
}
public void close() {
//不关闭连接,只释放。
}
}
因为接口中的方法很多,所有可以通过继承模版类来简化编写。模版类中实现了Connection接口,里面也持有Connection的引用,并对所有方法通过引用做了实现。
我们继承后只需对需要改写的方法进行重写即可。
5 dbcp
a 导包 commons-dbcp-1.4.jar commons-pool-1.3.jar
b BasicDataSource source = new BasicDataSource();
c 设置连接池基本四要素 驱动类全名称 连接URL 用户名 密码
6 c3p0
a 导包 c3p0-0.9.1.2.jar
b 配置文件 c3p0-config.xml 配置文件名称是固定的
c ComboPooledDataSource dataSource = ComboPooledDataSource()
不带参数默认加载classpath下的c3p0-config.xml中的default-config
带参数可以加载配置文件中指定名称的config
对于Java工程项目 classpath对应src目录。
7 druid
a 导包 druid-1.0.9.jar
b 配置文件 druid.properties 配置文件中的key是固定的。 driverClassName url username password
c DruidDataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
八 DBUtils
1 导包 commons-dbutils-1.4.jar
2 QueryRunner 该类对preparedstatement resultset 以及资源的关闭 都做了封装,我们使用完不需要再做释放资源操作。
可以控制事务的一组方法:
QueryRunner()
T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)
int update(Connection conn, String sql, Object... params)
不可以控制事务的一组方法
QueryRunner(DataSource ds)
T query(String sql, ResultSetHandler<T> rsh, Object... params)
int update(String sql, Object... params)
3 QueryRunner的ResultSetHandler需要掌握的5种形式
BeanHandler
BeanListHandler
MapHander 将字段名称与字段值作为键值对
MapListHandler
ScalarHandler 单行单列 例如 select count(*) from account
|
|