数据库 JDBC基础

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库 JDBC基础相关的知识,希望对你有一定的参考价值。

最后有分页、批处理等代码文件

01 DB.properties  创建数据库配置文件

className=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl
username=scott
password=tiger

 

02 DB.java 创建数据库工具类

/**
 * 2016年5月31日上午10:45:35
 */

package d530JDBC.util;

import java.io.IOException;
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.Properties;
import java.util.Scanner;

public class DB {
    // 1 加载驱动
    static Properties properties = new Properties();
    static {
        try {
            properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("DB.properties"));
            Class.forName(properties.getProperty("className"));
=============

dbs.load( new FileInputStream("D:/WorkSpace55/JDBC2016527/src/DBConfig.properties") );
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream( fileName );
is = DBUtils.class.getClassLoader().getResourceAsStream("DBConfig.properties");

=============
}
catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } // 2 获取连接 public static Connection getCon() { Connection con = null; try { con = DriverManager.getConnection(properties.getProperty("url"), properties.getProperty("username"), properties.getProperty("password")); } catch (SQLException e) { e.printStackTrace(); } return con; } // 3获取会话stmt public static Statement getStmt(Connection con) { Statement stmt = null; try { stmt = con.createStatement(); } catch (SQLException e) { e.printStackTrace(); } return stmt; } // 3获取会话pstmt public static PreparedStatement getPstmt(Connection con, String sql) { PreparedStatement pstmt = null; try { pstmt = con.prepareStatement(sql); } catch (SQLException e) { e.printStackTrace(); } return pstmt; } // 4 获取结果集stmt public static ResultSet getResultSet(Statement stmt, String sql) { ResultSet rs = null; try { rs = stmt.executeQuery(sql); } catch (SQLException e) { e.printStackTrace(); } return rs; } // 4获取结果集pstmt public static ResultSet getResultSet(PreparedStatement pstmt) { ResultSet rs = null; try { rs = pstmt.executeQuery(); } catch (SQLException e) { e.printStackTrace(); } return rs; } // 5关闭 public static void closeAll(ResultSet rs, Statement stmt, Connection con) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (con != null) { try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } } public static String Input(String msg) { System.out.println(msg); return new Scanner(System.in).nextLine(); } }

 

03 User.java 创建实体类

/**
 * 2016年5月31日下午12:38:16
 */

package d530JDBC.po;

import java.util.Date;

public class User {
    private int id;
    private String name;
    private String password;
    private Date regdate;

    public User() {
    }

    public User(int id, String name, String password, Date regdate) {
        super();
        this.id = id;
        this.name = name;
        this.password = password;
        this.regdate = regdate;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Date getRegdate() {
        return regdate;
    }

    public void setRegdate(Date regdate) {
        this.regdate = regdate;
    }

    @Override
    public String toString() {
        return "用户编号" + id + "\t名称:" + name + "\t密码" + password;
    }
}

 

 

04 UserDAO.java 创建数据访问对象

/**
 * 2016年5月31日下午12:42:22
 */

package d530JDBC.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

import d530JDBC.po.User;
import d530JDBC.util.DB;

public class UserDAO {
    public void addUser(User user, Connection con) {
        String sql = "insert into tb_users values(?,?,?,?)";
        PreparedStatement pstmt = DB.getPstmt(con, sql);
        try {
            // 设置编号
            while (true) {
                user.setId((int) (Math.random() * 1000) + 1000);
                if (check(1, user, con)) {
                    pstmt.setInt(1, user.getId());
                    break;
                }
            }
            // 设置姓名
            while (true) {
                user.setName(DB.Input("请输入姓名:"));
                if (check(2, user, con)) {
                    pstmt.setString(2, user.getName());
                    break;
                }
                System.out.print("用户名已存在,");
            }
            // 设置密码
            user.setPassword(DB.Input("输入密码"));
            pstmt.setString(3, user.getPassword());
            // 设置注册时间
            user.setRegdate(new Date());
            pstmt.setDate(4, new java.sql.Date(user.getRegdate().getTime()));
            if (pstmt.executeUpdate() != 0) {
                System.out.println("注册成功,信息如下:\n" + user);
            } else {
                System.out.println("注册失败");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DB.closeAll(null, pstmt, null);
        }
    }

    private boolean check(int i, User user, Connection con) {
        boolean flag = true;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            if (i == 1) {
                String sql = "select * from tb_users where id=?";
                pstmt = DB.getPstmt(con, sql);
                pstmt.setInt(1, user.getId());
            } else {
                String sql = "select * from tb_users where name=?";
                pstmt = DB.getPstmt(con, sql);
                pstmt.setString(1, user.getName());
            }
            rs = pstmt.executeQuery();
            if (rs.next()) {
                flag = false;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DB.closeAll(rs, pstmt, null);
        }
        return flag;
    }
}

 

05  UserTest.java 创建测试文件

/**
 * 2016年5月31日下午1:53:55
 */

package d530JDBC.Test;

import java.sql.Connection;

import d530JDBC.dao.UserDAO;
import d530JDBC.po.User;
import d530JDBC.util.DB;

// 测试类
public class UserTest {

    public static void main(String[] args) {
        // 建立连接
        Connection con = DB.getCon();
        // 办理业务
        new UserDAO().addUser(new User(), con);
        // 关闭连接
        DB.closeAll(null, null, con);
    }

}

06 分页文件

 

/**
        1、分页查询:
            在Oracle中使用 rownum 伪列
            
            select * from ( select e.* , rownum RNO from emp e )
            where RNO between ? and ? ;
             
             select * from emp;
 */
public class JDBCTest06分页 {
    //1获取连接
    static Connection con = null;
    
    static {
        con = DBUtils.getConntionOfDB();
    }
    
    public static void main(String[] args) throws SQLException {
        StringBuilder vs = new StringBuilder();
        vs.append("select * from ( select e.* , rownum RNO from emp e )");
        vs.append("where RNO between ? and ?");
        
        String sql = "select count(1) from emp";
        int num = 5; //每页约定显示5条记录
        int pages = getTotalPages( num, sql);
        
        while( true ){
            System.out.printf("每页以%2d个记录方式显示,请输入要显示的页码[ 总页数为: %3d页 ]" , num, pages);
            String str = null;
            int page = 0;
            while( true ){
                str = inputString("\n请输入[exit]>>>");
                if( "exit".equalsIgnoreCase(str) ){
                    System.out.println("\n业务结束了!");
                    System.out.println("byebye!");
                    System.exit(0);
                }
                if( str.matches("\\d+") ){
                    page = Integer.parseInt( str );
                    break;
                }
            }
            
            sql = vs.toString();
            
            //显示第几页
            findPageOfAll(page, num, sql);
        }
    }
    
    public  static String inputString( String info ){
        System.out.print( info );
        Scanner sc = new Scanner(System.in);
        return sc.nextLine();
    }

    //sql = select count(1) from emp;
    //获取总页数
    public static int getTotalPages(int num, String sql) throws SQLException{
        int pages = 0;
        Statement stmt = DBUtils.getStatementOfDB(con);
        ResultSet rs = DBUtils.getResultSetOfDB(stmt, sql);
        
        if( rs.next() ){
            pages = rs.getInt( 1 );
            pages = (int)Math.ceil( pages * 1.0 /num ); 
        }
        return pages ;
    }
    
    /**
     * 
     * @param sql 
     *         sql语句
     * @param num
     *         每页显示的记录数
     * @param page
     *         第几页
     */
    public static void findPageOfAll( int page, int num, String sql ){
        int start = num*(page-1) + 1;
        int end = num * page ;
        ResultSet rs = null;
        //2建立会话
        PreparedStatement pstmt = DBUtils.getPreparedStatementOfDB(con, sql);
        
        //3为?赋值
        try {
            pstmt.setInt(1, start);
            pstmt.setInt(2, end);
            
            //4 执行
            rs = DBUtils.getResultSetOfDB(pstmt);
            
            System.out.println("第 " + page + " 页的信息如下:");
            //5 遍历 
            while( rs.next() ){
                System.out.printf("%6d" , rs.getInt("empno") );
                System.out.printf("%15s" , rs.getString("ename") );
                System.out.printf("%15s" , rs.getString("job") );
                System.out.printf("%6d" , rs.getInt("mgr") );
                System.out.printf("%15tF" , rs.getDate("hiredate") );
                System.out.printf("%12.0f" , rs.getDouble("sal") );
                System.out.printf("%12.0f" , rs.getDouble("comm") );
                System.out.printf("%6d" , rs.getInt("deptno") );
                System.out.printf("\t第%6d号\n" , rs.getInt("rno") );
                
            }
            
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtils.closeAll(rs, pstmt, null);
        }
        
    }
}

 

07 遍历文件

/**
        ResultSet 结果集的接口
            ResultSetMetaData    getMetaData(); 方法,用来获取表中所有字段
            
            Object getObject(fieldName) 方法,获取指定字段名的字段值
            
        ResultSetMetaData 字段接口
            int getColumnCount();  方法, 获取字段的个数
            String getColumnName( i ); 方法, 获取第i个字段名 
 */
//  遍历任意表
public class JDBCTest12遍历 {
    public static void main(String[] args) throws SQLException {
        String tableName = DBUtils.inputString("请输入表名[ emp 或  dept ]>>> ");
        String sql = "select * from " + tableName ;
        
        Connection con = DBUtils.getConntionOfDB();
        PreparedStatement pstmt = DBUtils.getPreparedStatementOfDB(con, sql);
        ResultSet rs = DBUtils.getResultSetOfDB(pstmt);
        
        ResultSetMetaData metaData = rs.getMetaData();
        int fields = metaData.getColumnCount();
        
        //打印表头
        for (int i = 1; i <=  fields; i++) {
            System.out.print( metaData.getColumnName( i ) + "\t");
        }
        System.out.println("\n-------------------------------------------------------");
        
        //遍历
        while( rs.next() ){
            
            //每个记录的所有字段循环
            for (int i = 1; i <= fields; i++) {
                String fieldName = metaData.getColumnName(i); 
                
                Object fieldValue = rs.getObject(fieldName);
                
                System.out.printf( "%12s" , fieldValue  );
            }
            System.out.println(); //当一条记录获取并显示完毕,则换行 
        }
        
        DBUtils.closeAll(rs, pstmt, con);
    }
}

 

08 建表文件

/**
 * 1、自动创建一个表。 
           
           create table empNew ( 
               empno number(4) primary key, 
               ename   varchar2(10), 
               job varchar2(9), 
               mgr number(4), 
               hiredate Date, 
               sal number(7,2),
               comm number(7,2), 
               deptno number(2) 
           );
           
       晚上的主要任务:
           1) 分页、注册、上传案例的消化。
           
           2) 消化DAO设计模式. 
           
           3) 针对一张表,实现增、删、改、查  (其业务操作均在 DAO类中)
  
 */
public class JDBCTest11创建 {
    public static void main(String[] args)   {
        StringBuilder vs = new StringBuilder();
        vs.append("create table empNew (");
        vs.append("empno number(4) primary key,");
        vs.append("ename varchar2(10),");
        vs.append("job varchar2(9),");
        vs.append("mgr number(4),");
        vs.append("hiredate Date,");
        vs.append("sal number(7,2),");
        vs.append("comm number(7,2),");
        vs.append("deptno number(2)");
        vs.append(")");
        String sql = vs.toString();
        
        
        //创建表
        Connection con = DBUtils.getConntionOfDB();
        PreparedStatement pstmt = DBUtils.getPreparedStatementOfDB(con, sql);
        try{
            pstmt.execute();
            System.out.println("表创建成功!");
        }catch(SQLException e ){
            System.out.println("创建表失败,原因是: " + e.getMessage() );
        }
        DBUtils.closeAll(null, pstmt, con);
    }
}

 

09 批处理文件

/**
         1、什么是批处理?
             *.bat  ====>>> 批处理文件,通过业务的需要,它将多个命令以有序方式存放到一个 后缀为 bat的文件中。
             这种文件就是批处理文件。 目的: 提高处理业务的效率。
             在Oracle中,使用 ed命令来生成 数据库的脚本文件
             ed a1.sql
             
             @
             
         2、在JDBC编程,如何实现批处理?
             SQL> desc  myemp;
             名称              是否为空? 类型
             ----------------- -------- ------------
             EMPNO                      NUMBER(4)
             ENAME                      VARCHAR2(10)
             JOB                        VARCHAR2(9)
             MGR                        NUMBER(4)
             HIREDATE                   DATE
             SAL                        NUMBER(7,2)
             COMM                       NUMBER(7,2)
             DEPTNO                     NUMBER(2)
             
             insert into myemp values (1001,‘AAA‘,‘程序员‘,2002, ‘15-06月-16‘,10000,1000,40),
                 (1001,‘AAA‘,‘程序员‘,2002, ‘15-06月-16‘,10000,1000,40),
                 (1001,‘AAA‘,‘程序员‘,2002, ‘15-06月-16‘,10000,1000,40),
                 (1001,‘AAA‘,‘程序员‘,2002, ‘15-06月-16‘,10000,1000,40),
                 (1001,‘AAA‘,‘程序员‘,2002, ‘15-06月-16‘,10000,1000,40),
                 (1001,‘AAA‘,‘程序员‘,2002, ‘15-06月-16‘,10000,1000,40);
                 
          
 */
public class JDBCTest13批处理 {
    public static void main(String[] args) {
        String sql = "insert into myemp values (?,?,?,?, ?,?,?,?)";
        int[] deptnos = {10, 20, 30, 40};
        Connection con = DBUtils.getConntionOfDB();
        PreparedStatement pstmt = null;
        pstmt = DBUtils.getPreparedStatementOfDB(con, sql); //预处理sql
        try{
            con.setAutoCommit( false ); //关闭自动提交。
            long t1 = System.currentTimeMillis();
            System.out.println("正在大量的添加记录,需要一点时间,请等待...... \n");
            
            for(int i = 1; i <= 6000; i++ ){
                
                pstmt.setInt(1, 1000+i);
                pstmt.setString(2, "A_" + i);
                pstmt.setString(3, "P_" + i);
                pstmt.setInt(4, 1000+i-1);
                pstmt.setDate(5, new java.sql.Date( new Date().getTime()) );
                pstmt.setFloat(6, 8000+i);
                pstmt.setFloat(7, 0);
                
                int loc = (int)(deptnos.length*Math.random());
                pstmt.setInt( 8,  deptnos[loc]);
                
                pstmt.addBatch(); //将当前的sql语句添加到批处理缓冲区中
                
            }
            //int n = pstmt.executeUpdate(); //每个sql语句的执行
            
            //执行批处理语句
            int[] rsn = pstmt.executeBatch();
            
            con.commit(); //手动提交 
            long t2 = new Date().getTime();
            System.out.println("向 myemp 表中添加 一千个员工耗时为: " + (t2-t1) + " 毫秒。");
            con.setAutoCommit(true); //打开自动提交。

        }catch( SQLException e ){
            try {
                con.rollback();//回退
            } catch (SQLException e1) {
                e1.printStackTrace();
            } 
            System.out.println("添加大量记录失败!");
        }
    
        DBUtils.closeAll(null, pstmt, con);
    }
}

 

以上是关于数据库 JDBC基础的主要内容,如果未能解决你的问题,请参考以下文章

JAVA基础:JDBC的使用 附详细代码

JDBC操作数据库之查询数据

面试常用的代码片段

mysql jdbc源码分析片段 和 Tomcat's JDBC Pool

如何在片段中填充列表视图?

JavaJDBC基础使用教程