使用JDK自带的方法来连接和操作数据库
一.JDBC(Java Data Base Connectivity,java数据库连接)
是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
即:使用JDBC可以实现对数据库的访问.
二.数据库常用的接口和类:
- -DriverManager:驱动管理器获得数据库的连接(获得Connection对象)
- -Connection:数据库连接接口,代表数据库连接对象,每个Connection代表一个物理连接会话
- -Statement:语句接口,用来静态操作SQL语句
- -PreparedStatement(Statement的子接口):预定义语句,用来动态操作SQL语句
- -ResultSet:结果集,保存数据记录的结果集合
三.JDBC 访问数据库的步骤:
- 加载数据库驱动类:driverName = Class.forName("com.mysql.jdbc.Driver");
- 获得数据库连接:getConnection();
- 获得数据库操作句柄:PreparedStatement ps;
- 获得结果集(查询):ResultSet rs
- 处理结果集
- 关闭结果集
- 关闭操作句柄
- 关闭数据库连接
package com.web.tools;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
public class DBUtilPro {
private static Properties pro;
static{
try {
//属性集,可保存在流中或在流中加载
pro = new Properties();
//通过类加载器的方法加载本地文件,获得一个字节输入流
InputStream is = DBUtilPro.class.getClassLoader().getResourceAsStream("JDBC.properties");
//加载输入流获得属性列表(键值对的集合)
pro.load(is);
//把注册驱动放在静态块,只加载一次
Class.forName(pro.getProperty("driverName"));
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//获得连接
public static Connection openConnection() throws Exception{
Connection conn = null;
String url = pro.getProperty("url");
String user = pro.getProperty("user");
String password = pro.getProperty("password");
conn = DriverManager.getConnection(url, user, password);
return conn;
}
//关闭数据库
public static void closeConnection(Connection conn,PreparedStatement ps,ResultSet rs){
//此部分代码省略
//关闭rs,ps,conn
}
--------------------JDBC.properties------------------
driverName=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl
user=yy_0105
password=yy_0105
四.操作实例
public class EmpDao {
private Connection conn;
private PreparedStatement ps;
private ResultSet rs;
//传入一个雇员编号,获得雇员信息
public Emp getOneEmp(int id){
Emp emp = null;
String str = "select empno,ename,sal,hiredate from newemp where empno = ?";
try{
conn = DBUtils.openConnection();
ps = conn.prepareStatement(str);
ps.setInt(1, id);
rs = ps.executeQuery();
while(rs.next()){
emp = new Emp();
emp.setEmpno(rs.getInt("empno"));
emp.setEname(rs.getString("ename"));
emp.setSal(rs.getDouble("sal"));
emp.setDate(rs.getDate("hiredate"));
}
}catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return emp;
}
}
public class EmpDao {
private Connection conn;
private PreparedStatement ps;
private ResultSet rs;
//查询所有名字长度为4的员工的员工编号,姓名
public List<Emp> getMessage(){
Emp emp = null;
List<Emp> listEmp = new ArrayList<Emp>();
String sql = "select empno,ename from newemp where length(ename) = 4";
conn = DBUtils.openConnection();
try {
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while(rs.next()){
emp = new Emp();
emp.setEmpno(rs.getInt("empno"));
emp.setEname(rs.getString("ename"));
listEmp.add(emp);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return listEmp;
}
}
public class EmpDao {
private Connection conn;
private PreparedStatement ps;
private ResultSet rs;
//根据指定的empno,来删掉记录,并得到删掉的记录数量
public int deleteCount(Integer empno){
int count = 0;
String sql = "delete from newemp where empno = ?";
try {
conn = DBUtils.openConnection();
ps = conn.prepareStatement(sql);
ps.setInt(1,empno);
//一旦DML语句中出现了 insert,update,delete语句,句柄就应该使用executeUpdate来执行SQL语句返回结果是一个int,影响函数
count = ps.executeUpdate();
//事物自动commit
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
}
return count;
}
}
public class EmpDao {
private Connection conn;
private PreparedStatement ps;
private ResultSet rs;
//插入
public int insertRecord(Emp emp){
int count = 0;
conn = DBUtils.openConnection();
String sql ="insert into newemp(empno,ename,sal,hiredate) values(?,?,?,?)";
try {
ps = conn.prepareStatement(sql);
ps.setInt(1, emp.getEmpno());
ps.setString(2, emp.getEname());
ps.setDouble(3, emp.getSal());
ps.setDate(4, new Date(emp.getDate().getTime()));
count = ps.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return count;
}
}