jdbc
1. jdbc:使用java代码(程序)发送sql语句的技术
2. jdbc的核心接口(查看API):
java.sql
Driver,DriverManger,Statement,ResultSet(常用)
javax.sql
3.jdbc 主要应用内容
Statement执行( DDL,DML,DQL)
CallableStatment执行存储过程
PreparedStatment执行sql(预编译可防止恶意密码,防止sql注入)
存储过程的调用
批处理插入,删除,更新数据
事务
存储二进制文件(如图片)
4.DBUtils 组件(commons-dbutils.jar)
Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,
学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。
因此dbutils成为很多不喜欢hibernate的公司的首选。
两个常用的 (org.apache.commons.dbutils )classes -- 查看APIdoc
DbUtils
连接数据库,关闭资源
QueryRunner
查询,更新,批处理等
Interface ResultSetHandler<T> All Known Implementing Classes:
---》(一些DbUtils 提供的封装结果集对象)
AbstractKeyedHandler, AbstractListHandler,
ArrayHandler, ArrayListHandler,
BaseResultSetHandler, BeanHandler, BeanListHandler, BeanMapHandler,
ColumnListHandler, KeyedHandler,
MapHandler, MapListHandler,
ScalarHandler
以下较常用:
1)BeanHandler: 查询返回单个对象
2)BeanListHandler: 查询返回list集合,集合元素是指定的对象
3) ArrayHandler, 查询返回结果记录的第一行,封装对对象数组, 即返回:Object[]
4) ArrayListHandler, 把查询的每一行都封装为对象数组,再添加到list集合中
5) ScalarHandler 查询返回结果记录的第一行的第一列 (在聚合函数统计的时候用)
6) MapHandler 查询返回结果的第一条记录封装为map
自定义结果集封装数据:(我查询的是student表中的id=29的学生)
public void testQuery() throws Exception {
String sql = "select * from student where id=?";
conn = JdbcUtil.getConnection();
QueryRunner qr = new QueryRunner();
// select
Student student = qr.query(conn, sql, new ResultSetHandler<Student>() {
//封装student对象
public Student handle(ResultSet rs) throws SQLException{
if (rs.next()) {
Student student = new Student();
student.setId(rs.getInt("id"));
student.setName(rs.getString("name"));
student.setAge(rs.getInt("age"));
return student;
}
return null;
}
},29);
System.out.println(student);
conn.close();
}
使用DbUtils 组件封装结果集数据:
public void testQuery()throws Exception{
String sql = "select * from student where id=?";
conn = JdbcUtil.getConnection();
QueryRunner qr = new QueryRunner();
// 使用DbUtils 中已经封装好的方法(注意好参数)
Student student = qr.query(conn,sql, new BeanHandler<Student>(Student.class),29);
System.out.println(student);
conn.close();
}
----------------------------------------------------------------------------------------
jdbc连接数据库的方式:
--》基础做法
public class Demo1 {
private String url = "jdbc:mysql://localhost:3306/demo";
private String user = "root";
private String password = "root";
public void test() {
try {
// 1.驱动
Driver driver = new com.mysql.jdbc.Driver();
// 设置用户名和密码
Properties props = new Properties();
props.setProperty("user", user);
props.setProperty("pwd", password);
// 2.连接数据库
Connection conn = driver.connect(url, props);
System.out.println(conn);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
--》优化做法(封装成一个工具类)
public class JdbcUtil {
private static String url = "jdbc:mysql:///jdbc_demo";
private static String user = "root";
private static String password = "root";
public static Connection conn;
public static Statement stat;
public static ResultSet rs;
// 连接
public static Connection getConnection(){
try {
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 连接数据库
return DriverManager.getConnection(url,user,password);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static void close(){
try {
if (rs != null){
rs.close();
rs = null;
}
if (stat != null){
stat.close();
stat=null;
}
if (conn != null){
conn.close();
conn=null;
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}