JDBC
使用JDBC,需要导入驱动包,下载驱动包放于 Referenced Libraries
内容
Java DataBase Connectivity API由一组用Java编程语言缩写的类和接口组成
JDBC API包含2个主要组件:
- 数据库厂商对接口的实现
- 应用于应用程序和小程序的接口
JDBC API位于java.sql包下,共6个部分:
1. 管理连接数据源
java.sql.DriverManager:管理数据库驱动程序
java.sql.Driver:提供数据库管理系统的连接
java.sql.Connection:用于数据库的连接
2. 用来发送sql语句
java.sql.Statement:静态sql语句
java.sql.PreparedStatement:预制sql语句
java.sql.CallableStament:sql存储过程或函数
3. 用来获取查询结果集
java.sql.ResultSet:其实现类是一个数据库结果集的包装类对象
4. 用于匹配sql数据类型和java数据类型
java.sql.Date :用于匹配sql中的Date类型
java.sql.Time
java.sql.TimeStamp
5. 用来获取数据库元数据
java.sql.DatebaseMetaData:其实现类要提供JDBC连接的数据库的相关信息
java.sql.ResultSetMetaData
6. 提供异常处理功能
java.sql.SQLException
java.sql.Warning
连接数据库
3种方式
- Thin方式
- OCI
- JDBC-ODBC
访问数据库常用接口
1. Statement
executeQuery():执行select语句
executeUpdate()
execute():可以执行所有sql语句
2. ResultSet: 结果集
从结果集中读取数据
结果集分类:基本的结果集、可滚动的结果集
3. PreparedStatement:预制语句,功能和statement一样,不过更安全
4. CallableStatement:执行sql存储过程和函数的接口
调用存储过程
CallableStatement csPro=conn.prepareCall("call firstRaiseSalary(?,?)")
JDBC高级功能
批处理
批量执行sql语句
共2个方法:
Statement,PreparedStatement中设计2个方法:
1. addBatch(String)
将某个sql语句加入到当前批处理中(此时还没有执行)
2. executeBatch
执行批处理,返回一个int数组。数组包括每条语句影响到的行数。
如果批处理中有select或其他只返回结果的语句,会报SQLException
#例1
Statement stmt=conn.createStatement();
stmt.addBatch("insert into emp(empno,deptno) values(7911,30)"); //插入
int[] result=stmt.executeBatch(); //执行
事务处理
mysql在默认情况下,是自动提交模式下的。为人为的管理事务操作、更好的性能,通过调用Connection类的setAutoCommie方法关闭自动提交
conn.setAutoCommit(false)
一旦关闭自动提交,就必须手动commit和rollback
conn.setAutoCommit(false);
Statement stmt= conn.createStatement();
int result= stmt.executeUpate("delete from emp where deptno=40"); //删除deptno为40的emp表的记录
if(result < 5 && result >0){
conn.rollback(); //如果小于5个员工则撤销删除
}else{
stmt.executeUpate("delete from dept where deptno=40"); //删除dep表中deptno为40的记录
conn.commit(); //提交
}
conn.close();
元数据
- java.sql.DatabaseMetaData 数据库元数据类
- java.sql.ResultSetMetaData 结果集元数据类
数据库元数据
#调用Connection的getMetaData方法
Connection conn=DriverManager.getConnection(url, username, password);
DatabaseMetaData dbmd=conn.getMetaData();
System.out.println("dbmd:driver version = "+ dbmd.getDriverVersion());
conn.close();
结果元数据
#调用ResultSet的getMetaData方法
Connection conn=DriverManager.getConnection(url, username, password);
Statement stmt=conn.createStatement();
ResultSet rs=stmt.executeQuery("select * from dept"); //ResultSet
ResultSetMetaData rsmd=rs.getMetaData(); //ResultSetMetaData
int cols = rsmd.getColumnCount();
conn.close();
DAO设计模式
Data Aceess Object 数据访问对象,与数据库或数据文件打交道,夹在业务逻辑与数据库资源中间
DAO是J2EE设计模式之一,典型的DAO有:
1. 一个DAO工厂类
2. 一个DAO接口
3. 一个实现了DAO接口的具体类
3. 数据传送对象DTO7
数据库连接池
预先建立一定数量的数据库连接在数据库连接池中,当客户端连接数据库时,返回一个未使用的连接并标记忙。用完则连接池将它设为空闲
如果连接池中的连接用光了,就新建一定数量的连接(由配置文件决定)
如果连接等待一段时间仍没有人用(由配置文件决定),则将它彻底释放。但如果连接个数等于连接池的最小连接数,那它也不会被释放
#以Tomcat为例,配置文件在Tomcat安装目录下的conf文件夹下的context.xml
<Context>
< Resource
name="jdbc/sql"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
username="root"
password="12341234"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/test"
/>
</Context>
配置后,在程序中获取数据库连接
Context ctx=new InitialContext();
DataSource envctx=(DataSource) ctx.lookup("java:com/env/jdbc/sql");
Connection conn=envctx.getConnection();
#用完关闭连接,但是将连接还给连接池
conn.close();