jdbc技術
java database connectivity--java 數據庫 連接
sun設計的技術規範
接口
各個數據廠商做具體的實現
sqlserver -- 微軟
Oracle、mysql -- Oracle
DB2 -- IBM
...
JDBC四個重要參數
四個重要參數
a.驅動字符串
com.microsoft.sqlserver.jdbc.SQLServerDriver
com.microsoft.sqlserver.jdbc.SQLServerDriver.class
b.url連接字符串
jdbc:sqlserver://localhost:1433;dataBaseName=數據庫名
c.user(數據庫用戶名)
d.pwd(數據庫密碼)
三個核心接口(java.sql)
a.Connection接口(連接對象)
b.Statement接口(語句操作對象)
c.ResultSet接口(結果集對象)
預編譯語句對象PrepareStatement
預編譯:在java程序這一段就將sql語句編譯好,生成編譯文件
向數據庫發送的是預編譯文件,而非sql
相同sql(參數可以不同),不會重複發送預編譯文件
大大提升了程序的性能
建表
部門表
刪除表
drop table Dept
drop table Emp
create table Dept(
deptno int primary key, --部門編號
dname varchar(200) not null,--部門名稱
location varchar(400) not null -- 部門地址
)
員工表
create table Emp(
empno int primary key identity,--員工編號
ename varchar(50) not null,--姓名
sex char(3) check(sex in('男','女')) default '男',--性別
age int check(age between 18 and 60),--年齡
sal float check(sal>=3000) default 3000,--薪資
deptno int references Dept(deptno)
)
select * from dept
select * from emp
添加
insert into dept values(10,'java開發部','北京'),(20,'市場','上海'),
(30,'企劃部','長沙')
select * from dept
insert into emp values('熊大','男',25,12000,10),('熊二','男',23,11000,10),
('張三','女',21,9000,10),('李四','女',26,15000,20),('王五','男',27,16000,20),
('趙六','女',20,6000,20),('孫七','男',21,10000,30),('吳八','女',23,13000,30),
('鄧九','男',20,9000,30),('常十','女',21,8000,30);
select * from emp
刪除表中所有的記錄,如果再添加記錄標識列,會重新開始
truncate table emp
package demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
import org.junit.Test;
public class TestDemo {
/**
* 使用jdbc往數據庫dept表中插入一條記錄
* 增刪改
*/
@Test
public void test1(){
try {
//加載數據的驅動類
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//連接字符串
String url = "jdbc:sqlserver://localhost:1433;dataBaseName=db01";
//用戶名
String user = "sa";
//密碼
String pwd = "123";
//獲得連接對象(java和數據庫之間搭建橋樑)
Connection conn = DriverManager.getConnection(url, user, pwd);
//增
//String sql = "insert into dept values(50,'人力資源部','武漢') ";
//刪
//String sql = "delete from dept where deptno=50";
//改
String sql = "update emp set sal += 1000";
//獲得語句對象,語句對象通過連接對象獲得
Statement stmt = conn.createStatement();
//發送sql,操作數據庫 ,增刪改都使用executeUpdate()
int num = stmt.executeUpdate(sql);
System.out.println(num);//1 表示成功
//關閉資源(三個接口)
//順序 先打開的後關閉
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 查詢
* 查詢emp
* select * from emp
*/
@Test
public void test2(){
//聲明三個核心接口
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
//註冊驅動類
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String url = "jdbc:sqlserver://localhost:1433;dataBaseName=db01";
String user = "sa";
String pwd = "123";
//獲得連接對象
conn = DriverManager.getConnection(url, user, pwd);
//sql
String sql = "select * from emp";
//獲得語句對象
stmt = conn.createStatement();
//發送sql語句,執行sql
rs = stmt.executeQuery(sql);
//將數據庫中查詢到的記錄打印到控制檯
while(rs.next()){
//取出這一行的記錄
int empno = rs.getInt("empno");
String ename = rs.getString("ename");
float sal = rs.getFloat("sal");
System.out.println(empno+","+ename+","+sal);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
//關閉資源
rs.close();
stmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
@Test
public void test3(){
Scanner sc = new Scanner(System.in);
System.out.print("請輸入員工的姓名:");
String name = sc.nextLine();
//聲明三個核心接口
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
//註冊驅動類
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String url = "jdbc:sqlserver://localhost:1433;dataBaseName=db01";
String user = "sa";
String pwd = "123";
//獲得連接對象
conn = DriverManager.getConnection(url, user, pwd);
//sql
String sql = "select * from emp where ename='"+name+"'";
//獲得語句對象
stmt = conn.createStatement();
//發送sql語句,執行sql
rs = stmt.executeQuery(sql);
//將數據庫中查詢到的記錄打印到控制檯
while(rs.next()){
//取出這一行的記錄
int empno = rs.getInt("empno");
String ename = rs.getString("ename");
float sal = rs.getFloat("sal");
System.out.println(empno+","+ename+","+sal);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
//關閉資源
rs.close();
stmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 查詢
* select * from emp where deptno=? and sex=?
*/
@Test
public void test4(){
Scanner scInt = new Scanner(System.in);
Scanner sc = new Scanner(System.in);
System.out.print("請輸入部門編號:");
int dno = scInt.nextInt();
System.out.print("輸入查詢員工的性別:");
String sex = sc.nextLine();
//聲明三個核心接口
Connection conn = null;
PreparedStatement prep = null;
ResultSet rs = null;
//註冊驅動類
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String url = "jdbc:sqlserver://localhost:1433;dataBaseName=db01";
String user = "sa";
String pwd = "123";
//獲得連接對象
conn = DriverManager.getConnection(url, user, pwd);
//sql
String sql = "select * from emp where deptno=? and sex=?";
//獲得預編譯語句對象
prep = conn.prepareStatement(sql);
//設置參數
prep.setInt(1, dno);
prep.setString(2, sex);
//發送預編譯文件,執行sql
//增刪改 prep.executeUpdate()
rs = prep.executeQuery();//查詢
//將數據庫中查詢到的記錄打印到控制檯
while(rs.next()){
//取出這一行的記錄
int empno = rs.getInt("empno");
String ename = rs.getString("ename");
float sal = rs.getFloat("sal");
System.out.println(empno+","+ename+","+sal);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
//關閉資源
rs.close();
prep.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
員工類Emp
package demo02;
public class Emp {
//與數據表結構一致
private Integer empno;
private String ename;
private String sex;
private Integer age;
private Float sal;
private Integer deptno;
public Emp() {
super();
// TODO Auto-generated constructor stub
}
public Emp(Integer empno, String ename, String sex, Integer age, Float sal, Integer deptno) {
super();
this.empno = empno;
this.ename = ename;
this.sex = sex;
this.age = age;
this.sal = sal;
this.deptno = deptno;
}
public Integer getEmpno() {
return empno;
}
public void setEmpno(Integer empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Float getSal() {
return sal;
}
public void setSal(Float sal) {
this.sal = sal;
}
public Integer getDeptno() {
return deptno;
}
public void setDeptno(Integer deptno) {
this.deptno = deptno;
}
@Override
public String toString() {
return empno+"\t"+ename+"\t"+sex+"\t"+age+"\t"+sal+"\t"+deptno;
}
}
package demo02;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DBUtils {
//jdbc的四個重要參數作爲工具類的常量
//驅動字符串
public static final String DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
//連接字符串
public static final String URL = "jdbc:sqlserver://localhost:1433;dataBaseName=db01";
//用戶名
public static final String USER = "sa";
//密碼
public static final String PASSWORD = "123";
//在靜態塊中加載驅動類
//在類加載的時候,執行的代碼
static{
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//獲得連接對象的方法
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USER, PASSWORD);
}
//關閉資源的方法
public static void closeAll(ResultSet rs, PreparedStatement prep,Connection conn) throws SQLException{
try {
if(rs!=null){
rs.close();
}
if(prep!=null){
prep.close();
}
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
throw e;//將異常信息繼續往上拋,通知調用者
}
}
//測試
public static void main(String[] args) throws SQLException {
Connection conn = getConnection();
System.out.println(conn);
}
}
package demo02;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class EmpDao {
//封裝基礎業務邏輯
//增
public int save(Emp emp) throws SQLException{
//聲明2個核心接口
Connection conn = null;
PreparedStatement prep = null;
String sql = "insert into emp values(?,?,?,?,?)";
try {
//獲得連接對象
conn = DBUtils.getConnection();
//獲得預編譯對象
prep = conn.prepareStatement(sql);
//設置參數
prep.setString(1,emp.getEname());
prep.setString(2, emp.getSex());
prep.setInt(3, emp.getAge());
prep.setFloat(4, emp.getSal());
prep.setInt(5, emp.getDeptno());
//發送預編譯文件,執行sql
return prep.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
throw e;
}finally{
//關閉資源
DBUtils.closeAll(null, prep, conn);
}
}
//刪,依據主鍵刪除
public int delete(int empno) throws SQLException{
//聲明2個核心接口
Connection conn = null;
PreparedStatement prep = null;
String sql = "delete from emp where empno=?";
try {
//獲得連接對象
conn = DBUtils.getConnection();
//獲得預編譯對象
prep = conn.prepareStatement(sql);
//設置參數
prep.setInt(1,empno);
//發送預編譯文件,執行sql
return prep.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
throw e;
}finally{
//關閉資源
DBUtils.closeAll(null, prep, conn);
}
}
//改
//只能修改數據庫存在的記錄
//修改的前提是查詢
//修改應該能夠修改除主鍵以外所有的字段
//應該依據主鍵去修改
//參數emp對象是數據庫存在的記錄,所以它是查詢方法
//查詢出來的
public int modify(Emp emp) throws SQLException{
//聲明2個核心接口
Connection conn = null;
PreparedStatement prep = null;
//sql
String sql = "update emp set ename=?,sex=?,age=?,sal=?,deptno=? where empno=?";
try {
//獲得連接對象
conn = DBUtils.getConnection();
//獲得預編譯對象
prep = conn.prepareStatement(sql);
//設置參數
prep.setString(1, emp.getEname());
prep.setString(2, emp.getSex());
prep.setInt(3, emp.getAge());
prep.setFloat(4, emp.getSal());
prep.setInt(5, emp.getDeptno());
prep.setInt(6, emp.getEmpno());
//發送預編譯文件,執行sql
return prep.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
throw e;
}finally{
//關閉資源
DBUtils.closeAll(null, prep, conn);
}
}
//查(最複雜)
//只查詢一條記錄,依據員工編號查詢
public Emp queryForId(int empno) throws SQLException{
//聲明3個核心接口
Connection conn = null;
PreparedStatement prep = null;
ResultSet rs = null;
Emp emp = null;
//sql
String sql = "select * from emp where empno=?";
try {
//獲得連接對象
conn = DBUtils.getConnection();
//獲得預編譯對象
prep = conn.prepareStatement(sql);
//設置參數
prep.setInt(1,empno);
//發送預編譯文件,執行sql
//獲得結果集對象
rs = prep.executeQuery();
//遍歷結果集,用結果集中的數據
//封裝對象
while(rs.next()){
emp = new Emp();
emp.setEmpno(rs.getInt("empno"));
emp.setEname(rs.getString("ename"));
emp.setSex(rs.getString("sex"));
emp.setAge(rs.getInt("age"));
emp.setSal(rs.getFloat("sal"));
emp.setDeptno(rs.getInt("deptno"));
}
return emp;
} catch (SQLException e) {
e.printStackTrace();
throw e;
}finally{
//關閉資源
DBUtils.closeAll(rs, prep, conn);
}
}
//查詢所有的記錄
public List<Emp> queryAll() throws SQLException{
//聲明3個核心接口
Connection conn = null;
PreparedStatement prep = null;
ResultSet rs = null;
List<Emp> emps = null;
//sql
String sql = "select * from emp";
try {
//獲得連接對象
conn = DBUtils.getConnection();
//獲得預編譯對象
prep = conn.prepareStatement(sql);
//發送預編譯文件,執行sql
//獲得結果集對象
rs = prep.executeQuery();
//遍歷結果集,用結果集中的數據
//封裝對象
while(rs.next()){
if(emps==null){
//循環第一次,實例化集合對象
emps = new ArrayList<Emp>();
}
//實例化一個員工對象
Emp emp = new Emp();
emp.setEmpno(rs.getInt("empno"));
emp.setEname(rs.getString("ename"));
emp.setSex(rs.getString("sex"));
emp.setAge(rs.getInt("age"));
emp.setSal(rs.getFloat("sal"));
emp.setDeptno(rs.getInt("deptno"));
emps.add(emp);
}
return emps;
} catch (SQLException e) {
e.printStackTrace();
throw e;
}finally{
//關閉資源
DBUtils.closeAll(rs, prep, conn);
}
}
}
package demo02;
import java.sql.SQLException;
import java.util.List;
import org.junit.Test;
public class TestDemo {
//測試添加
@Test
public void testSave() throws SQLException{
//創建Dao對象
EmpDao dao = new EmpDao();
//創建一個員工對象
Emp e = new Emp();
e.setEname("康熙");
e.setSex("男");
e.setAge(25);
e.setSal(20000F);
e.setDeptno(10);
int num = dao.save(e);
if(num==1){
System.out.println("添加成功");
}
}
@Test
public void test(){
//空值調用方法就會拋 NullPointerException
String s = null;
s.length();
}
@Test
public void testDelete() throws SQLException{
//創建Dao對象
EmpDao dao = new EmpDao();
int num = dao.delete(11);
if(num==1){
System.out.println("刪除成功");
}
}
@Test
public void testQueryForId() throws SQLException{
EmpDao dao = new EmpDao();
Emp e = dao.queryForId(13);
System.out.println(e.getEname()+","+e.getSal());
}
@Test
public void testQueryAll() throws SQLException{
EmpDao dao = new EmpDao();
List<Emp> es = dao.queryAll();
for(Emp e:es){
System.out.println(e);
}
}
@Test
public void testModify() throws SQLException{
EmpDao dao = new EmpDao();
Emp e = dao.queryForId(13);
e.setAge(30);
e.setSal(30000F);
int num = dao.modify(e);
if(num==1){
System.out.println("修改成功");
}
}
}