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("修改成功");
}
}
}