数据库 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);
    }
}
时间: 2024-10-16 18:02:54

数据库 JDBC基础的相关文章

Java应用程序连接数据库--JDBC基础

Java应用程序连接数据库--JDBC基础 Java应用程序连接数据库–JDBC基础 <!-- MySQL驱动,连接数据库用,由数据库厂商提供 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.25</version> </dependency> &

JDBC 基础知识总结

1.  何谓JDBC  --- Java Database Connectivity. 由Sun 公司提供的访问数据库的一组java类和接口,用来对数据库进行链接.发送SQL语句.处理返回结果,为开发人员提供了统一的访问数据库入口API,使得开发人员可以不用绑定到特定数据库访问API. 2. 应用程序,JDBC API,JDBC 驱动程序,数据库之间的层次关系如下图: 3. 4.  JDBC 有四种驱动: 4.1  JDBC-ODBC 桥链接:   把对JDBC接口的访问翻译成对应的ODBC的访

jdbc基础 (五) 连接池与数据源 DBCP以及C3P0的使用

一.连接池的概念和使用 在实际应用开发中,特别是在WEB应用系统中,如果JSP.Servlet或EJB使用JDBC直接访问数据库中的数据,每一次数据访问请求都必须经历建立数据库连接.打开数据库.存取数据和关闭数据库连接等步骤,而连接并打开数据库是一件既消耗资源又费时的工作,如果频繁发生这种数据库操作,系统的性能必然会急剧下降,甚至会导致系统崩溃.数据库连接池技术是解决这个问题最常用的方法. 数据库连接池的主要操作如下: (1)建立数据库连接池对象. (2)按照事先指定的参数创建初始数量的数据库连

jdbc基础 (四) 批处理

批处理,就是字面上的意思,一次性处理一批sql语句. 直接看例子吧: 1 package com.cream.ice.jdbc; 2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; 6 import java.sql.Statement; 7 8 import org.junit.Test; 9 10 /** 11 * 12 * 假设已经存在表test:

jdbc基础 (三) 大文本、二进制数据处理

LOB (Large Objects)   分为:CLOB和BLOB,即大文本和大二进制数据 CLOB:用于存储大文本 BLOB:用于存储二进制数据,例如图像.声音.二进制文件 在mysql中,只有BLOB,没有CLOB,mysql存储大文本用TEXT TEXT  分为:TINYTEXT.TEXT.MEDIUMTEXT和LONGTEXT BLOB 分为:TINYBLOB.BLOB.MEDIUMBLOB和LONGBLOB 取值范围如下图: 下面来看具体的代码实现: 1 package com.cr

JDBC 基础

JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成. JDBC 编程基本步骤  一.装载驱动程序 String DriveName="net.sourceforge.jtds.jdbc.Driver" Class.forName(DriveName) 在使用JDBC之前必须引入 相应的驱动jar包,不同的数据库产品会有各自的jar包.

JDBC基础教程

本文实例讲述了JDBC基础知识与技巧.分享给大家供大家参考.具体分析如下: 1.什么是JDBC? 通俗来讲JDBC技术就是通过java程序来发送SQL语句到数据库,数据库收到SQL语句后执行,把结果返回给java程序管理. 2.使用JDBC要有什么条件呢? A)目标数据库主机的地址 B)数据库软件在该主机上所占用的端口号 C)登陆数据库用的用户名 D)该用户名的密码 E)连接数据库 3.JDBC技术的原理 我们知道,数据库是有各种类型的,不同的厂商生产的数据库标格和规范是不同的,这时候,如果我们

《C#语言和数据库技术基础》单词必备

<C#语言和数据库技术基础> 第一章1..NET Framework   框架2.sharp            尖锐3.application      应用程序4.developer        开发者5.network          网络6.build            建造,建筑7.console          控制台8.debug            调试9.namespace        命名空间10.project         项目11.solution 

.NET基础拾遗(6)ADO.NET与数据库开发基础

一.ADO.NET和数据库程序基础 1.1 安身立命之基本:SQL SQL语句时操作关系型数据库的基础,在开发数据访问层.调试系统等工作中十分常用,掌握SQL对于每一个程序员(无论是.NET.Java还是C++等)都非常重要.这里挑选了一个常见的面试题目,来热热身. 常见场景:通过SQL实现单表行列转换 行列转换时数据库系统中经常遇到的一个需求,在数据库设计时,为了适合数据的累积存储,往往采用直接记录的方式,而在展示数据时,则希望整理所有记录并且转置显示.下图是一个行列转换的示意图: ①好了,废