JDBC:使用Java连接数据库
JDBC

JDBC:使用java连接数据库。

使用步骤

  1. 导包

    数据库目录:\app\username\product\11.2.0\dbhome_1\jdbc\lib\

    ojdbc6.jar导入项目。

  2. 加载驱动程序

    Class.forName(driverClass)
    //加载MySql驱动
    Class.forName("com.mysql.jdbc.Driver")
    //加载Oracle驱动
    Class.forName("oracle.jdbc.driver.OracleDriver")
    
  3. 获得数据库连接

    //localhost或127.0.0.1表示本机
    //mysql数据库连接
    DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mysql", user, pwd);
    //oracle数据库连接
    DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", user, pwd);
    
  4. 创建Statement或PreparedStatement对象

    Statement需要拼接字符串,容易导致sql注入,不推荐使用。

    PreparedStatement:待编译的语句

    //Statement  不推荐使用
    //创建发送sql语句以及带回执行结果
    String sql = "select * from emp where empno="+empno;
    Statement st;
    st = conn.createStatement();
    
    //PreparedStatement
    String sql = "select * from emp where empno = ?";
    PreparedStatement ps;
    ps = conn.prepareStatement(sql);
    //在第一个?赋值
    ps.getInt(1,empno);
    
  5. 若查询操作返回多条信息,创建ResultSet集合存储

    //执行并且返回结果集ResultSet
    //查询使用executeQuery
    rs = ps.executeQuery(sql);
    //删除,添加,修改都是使用executeUpdate
    rs = ps.executeUpdate(sql);
    
  6. 释放内存

    //先打开的后关闭
    if(rs!=null) {rs.close();}
    if(st!=null) {st.close();}
    if(conn!=null) {conn.close();}
    

使用规范

  1. 一个Dao类只写一个表的增删改查。

  2. 对每个表提供对应pojo(实体)类,方便对表数据的处理。

  3. 每个Dao类需要提供对应的接口。

  4. 在写JDBC时不能使用Statement,拼接字符串时容易被sql注入。

  5. 如果查询多个返回List集合查询单个返回对应的实体类对象,如果是增删改返回int类型。

  6. dao层的方法要求只能有一个参数。

  7. 必要时提供动态sql语句。

  8. 提供工具类,提供父类。

增删改查实例

pojo包---->Emp实体类

//时间类型使用util包下的Date
import java.util.Date;
public class Emp {
    //emp表的属性列
    private Integer empNo;
    private String ename;
    private String job;
    private Integer mgr;
    private Date hireDate;
    private Double sal;
    private Double comm;
    private Integer deptNo;
    
	//提供get和set方法
    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 getJob() {return job;}
    public void setJob(String job) {this.job = job;}
    public Integer getMgr() {return mgr;}
    public void setMgr(Integer mgr) {this.mgr = mgr;}
    public Date getHireDate() {return hireDate;}
    public void setHireDate(Date hireDate) {this.hireDate = hireDate;}
    public Double getSal() {return sal;}
    public void setSal(Double sal) {this.sal = sal;}
    public Double getComm() {return comm;}
    public void setComm(Double comm) {this.comm = comm;}
    public Integer getDeptNo() {return deptNo;}
    public void setDeptNo(Integer deptNo) {this.deptNo = deptNo;}

    @Override
    public String toString() {
        return "Emp{" +
                "empNo=" + empNo +
                ", ename='" + ename + '\'' +
                ", job='" + job + '\'' +
                ", mgr=" + mgr +
                ", hireDate=" + hireDate +
                ", sal=" + sal +
                ", comm=" + comm +
                ", deptNo=" + deptNo +
                '}';
    }
}

dao包---->EmpDao接口

import com.example.jdbc.pojo.Emp;
import java.util.List;
public interface EmpDao {
    /**
     * 查询所有员工
     * */
    public List<Emp> queryAll();
    
    /**
     * 根据编号查询员工
     * */
    public Emp queryEmpByEmpNo(int empNo);
    
    /**
     * 修改员工的工资,奖金,部门编号,岗位
     * */
    public int updateEmpByEmpNo(Emp emp);
    
    /**
     * 添加员工
     * */
    public int insertEmp(Emp emp);
    
    /**
     * 删除员工
     * */
    public int deleteEmpByEmpNo(int empNo);
}

util包---->JDBCUtil工具类

import java.sql.*;

public class JDBCUtil {
    private static JDBCUtil ju=new JDBCUtil();
    private JDBCUtil() {
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    public static JDBCUtil init() {
        return ju;
    }
    /*提供公共的方法返回数据库连接*/
    public Connection getConnection() throws SQLException {
		Connection conn= DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "lee", "tiger");
		return conn;
    }
    /*关闭资源*/
    public void close(Connection conn, PreparedStatement ps, ResultSet rs) {
        try {
            if(rs!=null) {
                rs.close();
            }
            if(ps!=null) {
                ps.close();
            }
            if(conn!=null) {
                conn.close();
            }
        } catch (Exception e2) {
        }
    }
}

dao包---->daoImpl包---->EmpDaoImpl实现类


import com.example.jdbc.dao.EmpDao;
import com.example.jdbc.pojo.Emp;
import com.example.jdbc.util.JDBCUtil;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class EmpDaoImpl implements EmpDao {

    private Connection conn;
    private PreparedStatement ps;
    private ResultSet rs;

    @Override
    public List<Emp> queryAll() {
        String sql = "select * from emp";
        try {
            conn = JDBCUtil.init().getConnection();
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
            /*把结果集中的数据封装成emp对象并放到List集合中*/
            List<Emp> es = new ArrayList<Emp>();
            while(rs.next()){
                Emp emp = new Emp();
                emp.setEmpNo(rs.getInt("empno"));
                emp.setEname(rs.getString("ename"));
                emp.setSal(rs.getDouble("sal"));
                emp.setComm(rs.getDouble("comm"));
                emp.setDeptNo(rs.getInt("deptno"));
                emp.setMgr(rs.getInt("mgr"));
                emp.setJob(rs.getString("job"));
                emp.setHireDate(rs.getDate("hiredate"));
                es.add(emp);
            }
            return es;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            JDBCUtil.init().close(conn,ps,rs);
        }
        return null;
    }

    @Override
    public Emp queryEmpByEmpNo(int empNo) {
        String sql = "select * from emp where empno = ? ";
        try {
            conn = JDBCUtil.init().getConnection();
            ps = conn.prepareStatement(sql);
            /*给占位符绑定值*/
            ps.setInt(1,empNo);
            rs = ps.executeQuery();
            Emp emp = new Emp();
            rs.next();
            emp.setEmpNo(rs.getInt("empno"));
            emp.setEname(rs.getString("ename"));
            emp.setSal(rs.getDouble("sal"));
            emp.setComm(rs.getDouble("comm"));
            emp.setDeptNo(rs.getInt("deptno"));
            emp.setMgr(rs.getInt("mgr"));
            emp.setJob(rs.getString("job"));
            emp.setHireDate(rs.getDate("hiredate"));
            return emp;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            JDBCUtil.init().close(conn,ps,rs);
        }
        return null;
    }

    @Override
    public int updateEmpByEmpNo(Emp emp) {

        try {
            conn = JDBCUtil.init().getConnection();
            StringBuffer sql = new StringBuffer("update emp set ");
            List<Object> args = new ArrayList<Object>();

            if (emp.getSal() != null){
                sql.append(" ,sal=?");
                args.add(emp.getSal());
            }
            if (emp.getComm() != null){
                sql.append(" ,comm=?");
                args.add(emp.getComm());
            }
            if (emp.getDeptNo() != null){
                sql.append(" ,deptno=?");
                args.add(emp.getDeptNo());
            }
            if (emp.getJob() != null && !"".equals(emp.getJob())){
                sql.append(" ,job=?");
                args.add(emp.getJob());
            }
            sql.append(" where empno=?");
            args.add(emp.getEmpNo());
            sql.replace(sql.indexOf(","), sql.indexOf(",")+1, " ");
            System.out.println(sql);
            ps=conn.prepareStatement(sql.toString());
            for(int i=0;i<args.size();i++) {
                ps.setObject(i+1, args.get(i));
            }
            int num=ps.executeUpdate();
            return num;
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtil.init().close(conn,ps,rs);
        }
        return 0;
    }

    @Override
    public int insertEmp(Emp emp) {
        try {
            String sql = "insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values(?,?,?,?,?,?,?,?)";
            conn = JDBCUtil.init().getConnection();
            ps = conn.prepareStatement(sql);
            ps.setInt(1,emp.getEmpNo());
            ps.setString(2,emp.getEname());
            ps.setString(3,emp.getJob());
            ps.setInt(4,emp.getMgr());
            ps.setDate(5,new java.sql.Date(emp.getHireDate().getTime()));//需要把util包下的Date转换成sql包下的Date
            ps.setDouble(6,emp.getSal());
            ps.setDouble(7,emp.getComm());
            ps.setInt(8,emp.getDeptNo());
            int num = ps.executeUpdate();
            return num;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            JDBCUtil.init().close(conn,ps,rs);
        }
        return 0;
    }

    @Override
    public int deleteEmpByEmpNo(int empNo) {
        String sql = "delete from emp where empno = "+empNo;
        try {
            conn = JDBCUtil.init().getConnection();
            ps = conn.prepareStatement(sql);
            int num = ps.executeUpdate();
            return num;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }  finally {
            JDBCUtil.init().close(conn,ps,rs);
        }
        return 0;
    }
}

EmpDaoTest测试类


import com.example.jdbc.dao.EmpDao;
import com.example.jdbc.dao.daoImpl.EmpDaoImpl;
import com.example.jdbc.pojo.Emp;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class EmpDaoTest {
    public static void main(String[] args) {
        List<Emp> es = new ArrayList<Emp>();
        Emp emp = new Emp();
        emp.setEmpNo(250);
        emp.setEname("loo");
        emp.setSal(1000.0);
        emp.setComm(250.0);
        emp.setJob("king");
        emp.setHireDate(new Date());
        emp.setMgr(6666);
        emp.setDeptNo(10);
        EmpDao empDao = new EmpDaoImpl();

        /*
        es = empDao.queryAll();
        for (int i = 0; i < es.size(); i++) {
            System.out.println(es.get(i));
        }
        */

        //System.out.println(empDao.queryEmpByEmpNo(6666));
        //System.out.println(empDao.updateEmpByEmpNo(emp));
        //System.out.println(empDao.insertEmp(emp));
        //System.out.println(empDao.deleteEmpByEmpNo(250));
    }
}