jdbc: java database connectivity, java与数据库的连接。
连接
在进行连接数据库之前我们需要做一些准备工作。
1.引入驱动包
2.构建路径 build path
3.测试用户是否正确登录
JDBC常用接口:
java.sql.Connection:连接
java.sql.Statement:静态处理块
java.sql.PreparedStatement:预处理块
java.sql.ResultSet:结果集
java.sql.ResultSetMetaData:结果集元信息
JDBC连接基本流程:
1.加载驱动 (选择数据库)
硬编码: new oracle.jdbc.driver.OracleDriver();
软编码: class.forName(“oracle.jdbc.driver.OracleDriver”)
2.获取连接 (与数据库建立连接)
Connection con =DriverManager.getConnection(“jdbc:oracle:thin:@服务器地址:端口:orcl”,“用户名”,“密码”)
3.准备sql
4.创建处理块 (发送执行sql的工具)
静态处理快:Statement
预处理快:PreparedStatement
5.发送sql
6.获取结果集
利用next(),getXxx(索引列名或别名)来分析数据
7关闭
静态处理快用于执行不带参数的简单SQL语句,有变量时需要我们自己拼接。
创建:
连接.Statement(sql)
执行:
dml -->executeUpdate(dml语句)
select -->executeQuery(select)
预处理快有变量时,可以给占位符‘?’,在下面语句中在给占位符处分别赋变量。
创建:
连接.prepareStatement(sql)
执行:
dml -->executeUpdate()
select -->executeQuery()
采用静态处理快进行连接:
public class JDBCDemo01 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.加载驱动 (选择数据库) 1)调用方法 2)创建对象 3)反射
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.获取连接 (与数据库建立连接)
Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "SCOTT", "TIGER");
//3.准备sql
String sql="select empno,ename from emp"; //sql不要加分号
//4.创建处理块 (发送执行sql的工具)
//静态处理块
Statement state=conn.createStatement();
//5.发送sql (这里sql语句)
ResultSet result=state.executeQuery(sql);
//6.获取结果集+处理
while(result.next()){
int id=result.getInt(1);
String name=result.getString("ename");
System.out.println(id+"--->"+name);
}
//7关闭
result.close();
state.close();
conn.close();
}
}
上述方式有两个缺点,一个就是无法捕获异常,还有就是更换数据库或修改了数据库用户名和密码时时要经常修改源代码。所以下面采用利用配置文件的方式来建立连接。
public class JDBCDemo02 {
public static void main(String[] args){
Properties pro=new Properties();
//加载资源流
try {
pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
} catch (IOException e) {
e.printStackTrace();
}
//1.加载驱动 (选择数据库) 1)调用方法 2)创建对象 3)反射
try {
Class.forName(pro.getProperty("driver"));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Connection conn=null;
Statement state=null;
ResultSet result=null;
try {
//2.获取连接 (与数据库建立连接)
conn=DriverManager.getConnection(
pro.getProperty("url"),
pro.getProperty("name"),
pro.getProperty("pwd"));
//3.准备sql
String sql="select ename,sal,deptno from emp where deptno=30";
//4.创建处理块 (发送执行sql的工具)
state=conn.createStatement();
//5.发送sql (这里sql语句)
result=state.executeQuery(sql);
//6.获取结果集+处理
while(result.next()){
Object name=result.getObject(1);
Object sal=result.getObject("sal");
Object deptno=result.getInt(3);
System.out.println(name+"-->"+sal+"-->"+deptno);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
//7关闭
if(result!=null){
try {
result.close();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
if(state!=null){
try {
state.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
jdbc封装
DBUtil:jdbc工具类
静态方法:
加载驱动
获取连接
关闭资源
public class DBUtil {
private static Properties pro=new Properties();
static{
try {
pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
} catch (IOException e) {
e.printStackTrace();
}
//加载驱动 (选择数据库)
try {
Class.forName(pro.getProperty("driver"));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//获取连接
public static Connection getConnection() throws SQLException{
Connection conn=null;
conn=DriverManager.getConnection(
pro.getProperty("url"),
pro.getProperty("name"),
pro.getProperty("pwd"));
return conn;
}
//关闭功能
public static void release(Connection conn,Statement state,ResultSet result){
if(result!=null){
try {
result.close();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
if(state!=null){
try {
state.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void release(Connection conn,Statement state){
release(conn,state,null);
}
}
BaseDao:通过访问数据库对象的工具类
操作数据库通过执行2大类操作:1.增删改,2.查询
public class BaseDao<T> {
/*
* 通用查询方法
* 数据库中的表中的每一条数据对应-->java中的一个对象
* 有一个条数据-->创建一个对象,为这个对象的属性赋值-->放入集合中
*
* 返回值:集合List 参数:要执行的sql,参数数组,容器中要存储的对象的类型的Class对象(-->可以根据Class对象创建不同类的对象)
*/
public List<T> query(String sql,Object[] args,Class<T> cls){
List<T> list=new ArrayList<T>();
Connection conn=null;
PreparedStatement state=null;
ResultSet result=null;
ResultSetMetaData data=null;
try {
conn=DBUtil.getConnection();
state=conn.prepareStatement(sql);
//给参数赋值 i是数组的索引
if(args!=null && args.length>0){
for(int i=0;i<args.length;i++){
state.setObject(i+1, args[i]);
}
}
//执行查询
result=state.executeQuery();
//结果集原信息
data = state.getMetaData();
//查询数据的字段个数
int count=data.getColumnCount();
/*for(int i=1;i<=count;i++){
System.out.println(data.getColumnLabel(i));
}*/
//一条数据对象java一个对象
while(result.next()){
//1.创建对象
T obj=cls.newInstance();
//根据字段的个数遍历
for(int i=1;i<=count;i++){
//2.获取字段(数据库中查询语句的字段的别名)名字 ,为了获取User类中的同名字段
String columnName=data.getColumnLabel(i);
System.out.println(columnName);
//3.获取字段的值
Object value=result.getObject(i);
System.out.println(value);
System.out.println(value.getClass().getName());
/*if("java.math.BigDecimal".equals(value.getClass().getName())){
BigDecimal value2=(BigDecimal)value;
value=value2.doubleValue();
}*/
//4.获取字段,通过反射
Field field=cls.getDeclaredField(columnName);
Class fieldCls=field.getType();
if("java.lang.Double".equals(fieldCls.getName())){
BigDecimal value2=(BigDecimal)value;
value=value2.doubleValue();
}
//5.给字段赋值
/*field.setAccessible(true); //放开权限
field.set(obj, value);
field.setAccessible(false);//回收权限*/
//获取每个字段公共的设置器
Method method=cls.getMethod("set"+columnName.substring(0, 1).toUpperCase()+columnName.substring(1), fieldCls);
method.invoke(obj, value);
}
//6.把对象存入容器
list.add(obj);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
DBUtil.release(conn, state, result);
}
return list;
}
//赠删改操作-->更新操作
//返回值 参数:执行的sql,参数的数组
public boolean update(String sql,Object[] args){
boolean flag=true;
//获取连接
Connection conn=null;
PreparedStatement state=null;
try {
conn=DBUtil.getConnection();
state=conn.prepareStatement(sql);
//给参数赋值 i是数组的索引
if(args!=null && args.length>0){
for(int i=0;i<args.length;i++){
state.setObject(i+1, args[i]);
}
}
int rows=state.executeUpdate();
if(rows<=0){
flag=false;
}
} catch (SQLException e) {
flag=false;
e.printStackTrace();
} finally{
DBUtil.release(conn, state, null);
}
return flag;
}
}