A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 664322624 初级黑马   /  2018-5-21 16:30  /  408 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文




学习笔记

Java-Day10-JDBC


【1.1        JDBC的概述】


1.1.1        什么是JDBC


JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序


1.1.2        什么是数据库驱动


        驱动:两个设备(应用)之间通信的桥梁。


1.1.3        为什么学习JDBC


没有JDBC的时候,如果现在要开发一套系统,使用Java连接MySQL数据库,那么这时候Java程序员需要了解MySQL驱动API,如果使用Java连接Oracle数据库,那么这个时候Java程序员需要了解Oracle数据库驱动API。
SUN公司提供一套统一的规范(接口)。然后各个数据库生产商提供这套接口的实现。这套接口规范就是JDBC的规范。




【1.1        JDBC的入门】


1.1.1.2        创建项目,引入jar包


1.1.2.1        JDBC的开发步骤


        第一步:加载驱动
        第二步:获得连接
        第三步:基本操作




1.1.2.2        JDBC的代码实现


import org.junit.Test;


/**
* JDBC的入门程序
* @author jt
*
*/
public class JDBCDemo1 {


        @Test
        /**
         * JDBC的入门
         */
        public void demo1() throws Exception{
                // 1.加载驱动
                Class.forName("com.mysql.jdbc.Driver");
                // 2.获得连接
                Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/web_test3", "root", "abc");
                // 3.基本操作:执行SQL
                // 3.1获得执行SQL语句的对象
                Statement statement = conn.createStatement();
                // 3.2编写SQL语句:
                String sql = "select * from user";
                // 3.3执行SQL:
                ResultSet rs = statement.executeQuery(sql);
                // 3.4遍历结果集:
                while(rs.next()){
                        System.out.print(rs.getInt("id")+" ");
                        System.out.print(rs.getString("username")+" ");
                        System.out.print(rs.getString("password")+" ");
                        System.out.print(rs.getString("nickname")+" ");
                        System.out.print(rs.getInt("age"));
                        System.out.println();
                }
                // 4.释放资源
                rs.close();
                statement.close();
                conn.close();
        }
}




【1.1        JDBC的API详解之DriverManager】


1.1.1        DriverManager:驱动管理类


1.1.1.1        作用一:注册驱动


这个方法可以完成驱动的注册,但是实际开发中一般不会使用这个方法完成驱动的注册!!!
原因:
如果需要注册驱动,就会使用DriverManager.registerDriver(new Driver());,但是查看源代码发现,在代码中有一段静态代码块,静态代码块已经调用了注册驱动的方法。




        如果再手动调用该方法注册驱动,就会导致驱动被注册两次。实际开发中一般会采用:
Class.forName("com.mysql.jdbc.Driver");


1.1.1.2        作用二:获得连接


static Connection getConnection(String url, String user, String password)
          试图建立到给定数据库 URL 的连接。


这个方法就是用来获得与数据库连接的方法:这个方法中有三个参数:
        url                        :与数据库连接的路径
        user                        :与数据库连接的用户名
        password                :与数据库连接的密码




主要关注的是url的写法:
jdbc:mysql://localhost:3306/web_test3




url如果连接的是本机的路径,可以简化为如下格式:
jdbc:mysql:///web_test3




        jdbc                        :连接数据库的协议
        mysql                :是jdbc的子协议
        localhost                :连接的MySQL数据库服务器的主机地址。(连接是本机就可以写成localhost),如果连接不是本机的,就需要写上连接主机的IP地址。
        3306                :MySQL数据库服务器的端口号
        web_test3        :数据库名称




【1.1        JDBC的API详解之Connection】


1.1.1        Connection:与数据库连接对象


1.1.1.1        作用一:创建执行SQL语句的对象


执行SQL语句对象:
        Statement                        :执行SQL
        CallableStatement                :执行数据库中存储过程
        PreparedStatement                :执行SQL.对SQL进行预处理。解决SQL注入漏洞。




1.1.1.2        作用二:管理事务


void setAutoCommit(boolean autoCommit)
          将此连接的自动提交模式设置为给定状态。
void rollback()
          取消在当前事务中进行的所有更改,并释放此 Connection 对象当前持有的所有数据库锁。
void commit()
          使所有上一次提交/回滚后进行的更改成为持久更改,并释放此 Connection 对象当前持有的所有数据库锁。


【1.1        JDBC的API详解之Statement】


1.1.1        Statement:执行SQL


1.1.1.1        作用一:执行SQL


        执行SQL的方法
        boolean execute(String sql);
        执行查询,修改,添加,删除的SQL语句。
        ResultSet executeQuery(String sql);
        执行查询(执行select语句)。
        int executeUpate(String sql);
        执行修改,添加,删除的SQL语句。




1.1.1.2        作用二:执行批处理


void addBatch(String sql)
          将给定的 SQL 命令添加到此 Statement 对象的当前命令列表中。


void clearBatch()
          清空此 Statement 对象的当前 SQL 命令列表。


int[] executeBatch()
          将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。


【1.1        JDBC的API详解之ResultSet】


1.1.1        ResultSet:结果集。
通过select语句的查询结果。


1.1.1.1        结果集的遍历


boolean next()
          将光标从当前位置向前移一行


代码实现:
while(xx.next()){
        syso(xx.getIne("xx"))
        syso(xx.getString("xx"))
        ...
}


1.1.1.2        结果集的获取


        结果集获取可以使用结果集中的:
getXXX();方法通常都会有一个重载的方法。
        getXXX(int columnIndex);
        getXXX(String columnName);




【1.1        JDBC的资源释放】


1.1.1        JDBC资源释放


JDBC程序执行结束后,将与数据库进行交互的对象释放掉,通常是ResultSet,Statement,Connection。
这几个对象中尤其是Connection对象是非常稀有的。这个对象一定要做到尽量晚创建,尽早释放掉。




        将资源释放的代码写入到finally的代码块中。
        资源释放的代码应该写的标准:




if(rs !=null){
                                try {
                                        rs.close();
                                } catch (SQLException e) {
                                        e.printStackTrace();
                                }
                                
                                rs = null;
                        }
                        
                        if(statement !=null){
                                try {
                                        statement.close();
                                } catch (SQLException e) {
                                        e.printStackTrace();
                                }
                                
                                statement = null;
                        }
                        
                        
                        if(conn !=null){
                                try {
                                        conn.close();
                                } catch (SQLException e) {
                                        e.printStackTrace();
                                }
                                
                                conn = null;
                        }




【1.1        JDBC的CRUD操作之增-删-改-查操作代码演示】


1.1        JDBC的CRUD操作之保存操作


@Test
        /**
         * 保存操作的代码实现
         */
        public void demo1(){
                Connection conn = null;
                Statement stmt = null;
                try{
                        // 注册驱动:
                        Class.forName("com.mysql.jdbc.Driver");
                        // 获得连接:
                        conn = DriverManager.getConnection("jdbc:mysql:///web_test3", "root", "abc");
                        // 执行操作:
                        // 创建执行SQL语句对象:
                        stmt = conn.createStatement();
                        // 编写SQL语句:
                        String sql = "insert into user values (null,'eee','123','阿黄',21)";
                        // 执行SQL语句:
                        int num = stmt.executeUpdate(sql);
                        if(num > 0){
                                System.out.println("保存用户成功!!!");
                        }
                }catch(Exception e){
                        e.printStackTrace();
                }finally{
                        // 资源释放:
                        if(stmt != null){
                                try {
                                        stmt.close();
                                } catch (SQLException e) {
                                        e.printStackTrace();
                                }
                                
                                stmt = null;
                        }
                        if(conn != null){
                                try {
                                        conn.close();
                                } catch (SQLException e) {
                                        e.printStackTrace();
                                }
                                conn = null;
                        }
                }
        }




1.1        JDBC的CURD操作之修改操作


@Test
        /**
         * 修改操作的代码实现
         */
        public void demo2(){
                Connection conn = null;
                Statement stmt  = null;
                try{
                        // 注册驱动:
                        Class.forName("com.mysql.jdbc.Driver");
                        // 获得连接
                        conn = DriverManager.getConnection("jdbc:mysql:///web_test3", "root", "abc");
                        // 执行操作:
                        // 创建执行SQL语句的对象:
                        stmt = conn.createStatement();
                        // 编写SQL语句:
                        String sql = "update user set password='abc',nickname='旺财' where id = 5";
                        // 执行SQL语句:
                        int num = stmt.executeUpdate(sql);
                        if(num > 0){
                                System.out.println("修改用户成功!!!");
                        }
                }catch(Exception e){
                        e.printStackTrace();
                }finally{
                        // 资源释放:
                        if(stmt != null){
                                try {
                                        stmt.close();
                                } catch (SQLException e) {
                                        e.printStackTrace();
                                }
                                
                                stmt = null;
                        }
                        if(conn != null){
                                try {
                                        conn.close();
                                } catch (SQLException e) {
                                        e.printStackTrace();
                                }
                                conn = null;
                        }
                }
        }




1.1        JDBC的CRUD操作之删除操作


@Test
        /**
         * 删除操作的代码实现
         */
        public void demo3(){
                Connection conn = null;
                Statement stmt = null;
                try{
                        // 注册驱动:
                        Class.forName("com.mysql.jdbc.Driver");
                        // 获得连接:
                        conn = DriverManager.getConnection("jdbc:mysql:///web_test3", "root", "abc");
                        // 创建执行SQL语句对象:
                        stmt = conn.createStatement();
                        // 编写SQL:
                        String sql = "delete from user where id = 5";
                        // 执行SQL:
                        int num = stmt.executeUpdate(sql);
                        if(num > 0){
                                System.out.println("删除用户成功!!!");
                        }
                }catch(Exception e){
                        e.printStackTrace();
                }finally{
                        // 资源释放:
                        if(stmt != null){
                                try {
                                        stmt.close();
                                } catch (SQLException e) {
                                        e.printStackTrace();
                                }
                                
                                stmt = null;
                        }
                        if(conn != null){
                                try {
                                        conn.close();
                                } catch (SQLException e) {
                                        e.printStackTrace();
                                }
                                conn = null;
                        }
                }
        }




1.1        JDBC的CRUD操作之查询操作


1.1.1        查询多条记录


@Test
        /**
         * 查询多条记录
         */
        public void demo4(){
                Connection conn = null;
                Statement stmt = null;
                ResultSet rs = null;
                try{
                        // 注册驱动
                        Class.forName("com.mysql.jdbc.Driver");
                        // 获得连接
                        conn = DriverManager.getConnection("jdbc:mysql:///web_test3", "root", "abc");
                        // 执行操作
                        // 创建执行SQL语句的对象:
                        stmt = conn.createStatement();
                        // 编写SQL:
                        String sql = "select * from user";
                        // 执行SQL:
                        rs = stmt.executeQuery(sql);
                        // 遍历结果集:
                        while(rs.next()){
                                System.out.println(rs.getInt("id")+" "+rs.getString("username")+" "+rs.getString("password"));
                        }
                }catch(Exception e){
                        e.printStackTrace();
                }finally{
                        // 资源释放:
                        if(rs != null){
                                try {
                                        rs.close();
                                } catch (SQLException e) {
                                        e.printStackTrace();
                                }
                                
                                rs = null;
                        }
                        if(stmt != null){
                                try {
                                        stmt.close();
                                } catch (SQLException e) {
                                        e.printStackTrace();
                                }
                                
                                stmt = null;
                        }
                        if(conn != null){
                                try {
                                        conn.close();
                                } catch (SQLException e) {
                                        e.printStackTrace();
                                }
                                conn = null;
                        }
                }
        }




1.1.2        查询一条记录


@Test
        /**
         * 查询一条记录
         */
        public void demo5(){
                Connection conn = null;
                Statement stmt = null;
                ResultSet rs = null;
                try{
                        // 注册驱动
                        Class.forName("com.mysql.jdbc.Driver");
                        // 获得连接
                        conn = DriverManager.getConnection("jdbc:mysql:///web_test3", "root", "abc");
                        // 执行SQL
                        // 创建执行SQL语句对象:
                        stmt = conn.createStatement();
                        // 编写SQL:
                        String sql = "select * from user where id = 4";
                        rs = stmt.executeQuery(sql);
                        // 判断就可以:
                        if(rs.next()){
                                System.out.println(rs.getInt("id")+" "+rs.getString("username")+" "+rs.getString("password"));
                        }
                }catch(Exception e){
                        e.printStackTrace();
                }finally{
                        // 资源释放:
                        if(rs != null){
                                try {
                                        rs.close();
                                } catch (SQLException e) {
                                        e.printStackTrace();
                                }
                                
                                rs = null;
                        }
                        if(stmt != null){
                                try {
                                        stmt.close();
                                } catch (SQLException e) {
                                        e.printStackTrace();
                                }
                                
                                stmt = null;
                        }
                        if(conn != null){
                                try {
                                        conn.close();
                                } catch (SQLException e) {
                                        e.printStackTrace();
                                }
                                conn = null;
                        }
                }
        }




【1.1        JDBC的工具类的抽取】


1.1.1        抽取一个JDBC的工具类
因为传统JDBC的开发,注册驱动,获得连接,释放资源这些代码都是重复编写的。所以可以将重复的代码提取到一个类中来完成。


/**
* JDBC的工具类
* @author jt
*
*/
public class JDBCUtils {
        private static final String driverClassName;
        private static final String url;
        private static final String username;
        private static final String password;
        
        static{
                driverClassName="com.mysql.jdbc.Driver";
                url="jdbc:mysql:///web_test3";
                username="root";
                password="abc";
        }


        /**
         * 注册驱动的方法
         */
        public static void loadDriver(){
                try {
                        Class.forName(driverClassName);
                } catch (ClassNotFoundException e) {
                        e.printStackTrace();
                }
        }
        
        /**
         * 获得连接的方法
         */
        public static Connection getConnection(){
                Connection conn = null;
                try{
                        // 将驱动一并注册:
                        loadDriver();
                        // 获得连接
                        conn = DriverManager.getConnection(url,username, password);
                }catch(Exception e){
                        e.printStackTrace();
                }
                return conn;
        }
        
        /**
         * 释放资源的方法
         */
        public static void release(Statement stmt,Connection conn){
                if(stmt != null){
                        try {
                                stmt.close();
                        } catch (SQLException e) {
                                e.printStackTrace();
                        }
                        
                        stmt = null;
                }
                if(conn != null){
                        try {
                                conn.close();
                        } catch (SQLException e) {
                                e.printStackTrace();
                        }
                        conn = null;
                }
        }
        
        public static void release(ResultSet rs,Statement stmt,Connection conn){
                // 资源释放:
                if(rs != null){
                        try {
                                rs.close();
                        } catch (SQLException e) {
                                e.printStackTrace();
                        }
                        
                        rs = null;
                }
                if(stmt != null){
                        try {
                                stmt.close();
                        } catch (SQLException e) {
                                e.printStackTrace();
                        }
                        
                        stmt = null;
                }
                if(conn != null){
                        try {
                                conn.close();
                        } catch (SQLException e) {
                                e.printStackTrace();
                        }
                        conn = null;
                }
        }
}




1.1.2        测试工具类


        @Test
        /**
         * 查询操作:使用工具类
         */
        public void demo1(){
                Connection conn = null;
                Statement stmt = null;
                ResultSet rs = null;
                try{
                        // 获得连接:
                        conn = JDBCUtils.getConnection();
                        // 创建执行SQL语句的对象:
                        stmt = conn.createStatement();
                        // 编写SQL:
                        String sql = "select * from user";
                        // 执行查询:
                        rs = stmt.executeQuery(sql);
                        // 遍历结果集:
                        while(rs.next()){
                                System.out.println(rs.getInt("id")+" "+rs.getString("username")+" "+rs.getString("password"));
                        }
                }catch(Exception e){
                        e.printStackTrace();
                }finally{
                        // 释放资源:
                        JDBCUtils.release(rs, stmt, conn);
                }
        }




【1.1        JDBC的配置信息提取到配置文件】


1.1.1        配置文件


        属性文件
        格式:扩展名是.properties
        内容:key=value
        XML文件




1.1.2        提取信息到配置文件


        定义一个配置文件


driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///web_test3
username=xxx
password=xxx


1.1.3        在工具类中解析属性文件


        获取到具体内容为常量赋值


【1.1        JDBC的CRUD操作之PreparedStatement的增-删-改-查操作】


1.1.1        保存操作代码实现


@Test
        /**
         * 保存操作
         */
        public void demo1(){
                Connection conn = null;
                PreparedStatement pstmt = null;
                try{
                        // 获得连接:
                        conn = JDBCUtils.getConnection();
                        // 编写SQL语句:
                        String sql = "insert into user values (null,?,?,?,?)";
                        // 预编译SQL:
                        pstmt = conn.prepareStatement(sql);
                        // 设置参数:
                        pstmt.setString(1, "eee");
                        pstmt.setString(2, "abc");
                        pstmt.setString(3, "旺财");
                        pstmt.setInt(4, 32);
                        // 执行SQL
                        int num = pstmt.executeUpdate();
                        if(num > 0){
                                System.out.println("保存成功!");
                        }
                }catch(Exception e){
                        e.printStackTrace();
                }finally{
                        JDBCUtils.release(pstmt, conn);
                }
        }




1.1.1        修改操作代码实现


@Test
        /**
         * 修改操作
         */
        public void demo2(){
                Connection conn = null;
                PreparedStatement pstmt = null;
                try{
                        // 获得连接:
                        conn = JDBCUtils.getConnection();
                        // 编写SQL语句:
                        String sql = "update user set username = ?,password =?,nickname=?,age = ? where id = ?";
                        // 预编译SQL:
                        pstmt = conn.prepareStatement(sql);
                        // 设置参数:
                        pstmt.setString(1, "abc");
                        pstmt.setString(2, "1234");
                        pstmt.setString(3, "旺旺");
                        pstmt.setInt(4, 23);
                        pstmt.setInt(5, 6);
                        // 执行SQL:
                        int num = pstmt.executeUpdate();
                        if(num > 0){
                                System.out.println("修改成功!");
                        }
                }catch(Exception e){
                        e.printStackTrace();
                }finally{
                        JDBCUtils.release(pstmt, conn);
                }
        }




1.1.1        删除操作的代码实现


@Test
        /**
         * 删除操作
         */
        public void demo3(){
                Connection conn = null;
                PreparedStatement pstmt  = null;
                try{
                        // 获得连接:
                        conn = JDBCUtils.getConnection();
                        // 编写SQL语句:
                        String sql = "delete from user where id = ?";
                        // 预编译SQL
                        pstmt = conn.prepareStatement(sql);
                        // 设置参数:
                        pstmt.setInt(1, 4);
                        // 执行SQL:
                        int num = pstmt.executeUpdate();
                        if(num > 0){
                                System.out.println("删除成功!");
                        }
                }catch(Exception e){
                        e.printStackTrace();
                }finally{
                        JDBCUtils.release(pstmt, conn);
                }
        }




1.1.1        查询操作代码实现


@Test
        /**
         * 查询操作
         */
        public void demo4(){
                Connection conn = null;
                PreparedStatement pstmt = null;
                ResultSet rs = null;
                try{
                        // 获得连接:
                        conn = JDBCUtils.getConnection();
                        // 编写SQL:
                        String sql = "select * from user";
                        // 预编译SQL:
                        pstmt = conn.prepareStatement(sql);
                        // 设置参数:
                        // 执行SQL:
                        rs = pstmt.executeQuery();
                        // 遍历结果集:
                        while(rs.next()){
                                System.out.println(rs.getInt("id")+" "+rs.getString("username")+" "+rs.getString("password")+" "+rs.getString("nickname"));
                        }
                }catch(Exception e){
                        e.printStackTrace();
                }finally{
                        JDBCUtils.release(rs, pstmt, conn);
                }
        }




【1.1        JDBC的批处理操作】


1.1.1        什么是批处理


之前进行JDBC的操作的时候,都是一条SQL语句执行。现在如果使用批处理,可以将一批SQL一起执行。




0 个回复

您需要登录后才可以回帖 登录 | 加入黑马