JDBC(Java Database Connectivity)SUN公司推出java访问数据库的标准规范(接口)
JDBC由一组java工具类和接口组成的
JDBC可以为多种关系型数据库提供统一的访问入口
JDBC使用步骤
注册驱动
方法一:class.forName("com.mysql.jdbc.Driver");
方法二:DriverManager.registerDriver(new com.mysql.jdbc.Driver());//注册俩次不建议
获得连接
DriverManager.getConnection(url,username,password);
url=jdbc:mysql://localhost:3306/数据库名
username=用户名
password=用户名对应的密码
获得语句执行者
执行sql语句
String sql="sql语句;";
Statement stmt=con.createStatement();
int executeUpdate(String sql);执行insert update delete语句DML语句
ResultSet executeQuery(String sql);执行select语句
boolean execute(String sql);执行select返回true或false
如果是true,需要使用getResultSet()获得查询结果
如果是false,需要使用getUpdateCount()获得影响行数
执行批处理
addBatch(String sql);
clearBatch();
executeBatch();
处理结果
...
释放资源
rs.close();
stmt.close();
con.close();
PreparedStatement(预编译声明,Statement的子接口)
防止sql攻击
提高代码的可读性和可维护性
提高效率
连接池
java为数据库连接池提供了公共的接口:java.sql.DataSource
常见连接池:DBCP、C3P0
DBUtil完成CRUD
QueryRunner核心类
QueryRunner(DataSource ds)提供数据源(连接池),DBUtil底层自动维护连接connection
update(String sql,Object... params)执更新数据
query(String sql,ResultSetHandler<T> rsh,Object... params)执行查询
ResultSetHandler结果处理类
BeanHandler将结果集中的第一条记录封装到一个指定的javaBean中
BeanListHandler将结果集中的每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中
ScalarHandler用于单数据,例如select count(*) from 表操作
MapHandler将结果集中的第一条记录封装到了Map<String,Object>集合中,key就是字段名称value就是字段值
ColumnListHandler将结果集中指定的列的值,封装到一个List集合中
DBUtils工具类
closeQuietly(Connection conn)关闭连接
commitAndCloseQuietly(Connection conn)提交并关闭连接
rollbackAndCloseQuietly(Connection conn)回滚并关闭连接
(引入以下几个包,另外写好db.properties文件)
DBUtils测试类:
import com.doMain.Product;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ColumnListHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;
public class TestDBUtil {
@Test
public void testDML() {
try {
//创建核心QueryRunner
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
//编写sql语句
String sql="insert into product values(null,?,?,?);";
//为占位符设置值
Object[] params= {"vivo","3000",1};
//执行添加操作
int rows=qr.update(sql,params);
if(rows>0) {
System.out.println("添加成功");
}else {
System.out.println("添加失败");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
@Test
public void testDQL1() {
try {
//创建核心QueryRunner
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
//编写sql语句
String sql="select * from product";
//执行添加操作
List<Product> rst = qr.query(sql,new BeanListHandler<Product>(Product.class));
for(Product pro:rst) {
System.out.println(pro.getCid()+" : "+pro.getPname()+" : "+pro.getPrice()+" : "+pro.getPid());
}
} catch (SQLException e) {
e.printStackTrace();
}
}
@Test
public void testDQL2() {
try {
//创建核心QueryRunner
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
//编写sql语句
String sql="select count(*) from product";
//执行添加操作
Long count = (long)qr.query(sql,new ScalarHandler());
System.out.println(count);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Test
public void testDQL3() {
try {
//创建核心QueryRunner
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
//编写sequel语句
String sql="select * from product";
//执行添加操作
List<Map<String, Object>> products = qr.query(sql,new MapListHandler());
for(Map<String, Object> product:products) {
System.out.println(product.get("pname"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
@Test
public void testDQL4() {
try {
//创建核心QueryRunner
QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
//编写sequel语句
String sql="select * from product";
//执行添加操作
List<Object> pnames = qr.query(sql,new ColumnListHandler("pname"));
for(Object name:pnames) {
System.out.println(name);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
C3P0自定义类:
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class C3P0Util {
private static ComboPooledDataSource dataSource=new ComboPooledDataSource();
public static DataSource getDataSource() {
return dataSource;
}
public static Connection getConnection() {
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
Product定义类:
package com.doMain;
public class Product {
private int pid;
private String pname;
private double price;
private int cid;
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getCid() {
return cid;
}
public void setCid(int cid) {
this.cid = cid;
}
}