博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JDBC入门
阅读量:5219 次
发布时间:2019-06-14

本文共 13441 字,大约阅读时间需要 44 分钟。

一、概述

1、JDBC本质

概念:Java DataBase Connectivity       Java数据库连接,Java语言操作数据库;JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。

二、JDBC快速入门

1、步骤

* 步骤:    1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar        1.在项目下创建libs目录,复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下        2.右键libs目录-->Add As Library    2. 注册驱动    3. 获取数据库连接对象 Connection    4. 定义sql    5. 获取执行sql语句的对象 Statement    6. 执行sql,接受返回结果    7. 处理结果    8. 释放资源

2、代码

package cn.itcast.jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.Statement;public class JdbcDemo1 {    public static void main(String[] args) throws Exception {        //1.导入驱动jar包        //2.注册驱动        Class.forName("com.mysql.jdbc.Driver");        //3.获取数据库连接对象,ceshi:库名; "root", "123456" :用户名/密码        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ceshi", "root", "123456");        //4.定义sq1语句,students :表名        String sql = "update students set age = 23 where studentNo=001";        //5.获取执行sql的对象 Statement        Statement stmt = conn.createStatement();        //6.执行SQL, count是影响的行数        int count = stmt.executeUpdate(sql);        //7.处理结果        System.out.println(count);        stmt.close();        conn.close();    }}

三、详解各个对象

1、DriverManager:驱动管理对象

* 功能:    1. 注册驱动:告诉程序该使用哪一个数据库驱动jar        static void registerDriver(Driver driver) :注册与给定的驱动程序 DriverManager 。         写代码使用:  Class.forName("com.mysql.jdbc.Driver");        通过查看源码发现:在com.mysql.jdbc.Driver类中存在静态代码块         static {                try {                    java.sql.DriverManager.registerDriver(new Driver());                } catch (SQLException E) {                    throw new RuntimeException("Can't register driver!");                }            }        注意:mysql5之后的驱动jar包可以省略注册驱动的步骤。    2. 获取数据库连接:        * 方法:static Connection getConnection(String url, String user, String password)         * 参数:            * url:指定连接的路径                * 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称                * 例子:jdbc:mysql://localhost:3306/db3                * 细节:如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称            * user:用户名            * password:密码

2、Connection:数据库连接对象

1. 功能:    1. 获取执行sql 的对象        * Statement createStatement()        * PreparedStatement prepareStatement(String sql)      2. 管理事务:        * 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务        * 提交事务:commit()         * 回滚事务:rollback()

3、Statement:执行sql的对象

1. 执行sql    1. boolean execute(String sql) :可以执行任意的sql 了解     2. int executeUpdate(String sql) :执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句        * 返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。    3. ResultSet executeQuery(String sql)  :执行DQL(select)语句2. 练习:    insert    update    delete

insert代码:

package cn.itcast.jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.sql.Statement;public class JdbcDemo02 {    public static void main(String[] args) {        Statement stmt = null;        Connection conn = null;        try {            //1.注册驱动            Class.forName("com.mysql.jdbc.Driver");            //2.定义SQL            String sql = "insert into students values(013,'曹操','男','山东',35,'1班',340322199001247654)";            //3.获取connection对象             conn = DriverManager.getConnection("jdbc:mysql:///ceshi", "root", "123456");            //4.获取执行sql的对象,Statement            stmt = conn.createStatement();            //5.执行SQL            int count = stmt.executeUpdate(sql);            //6.处理结果            System.out.println(count);            if(count > 0) {                System.out.println("执行成功!");            } else {                System.out.println("执行失败!");            }        } catch (ClassNotFoundException e) {            e.printStackTrace();        } catch (SQLException e) {            e.printStackTrace();        }finally {            if(stmt != null) {                try {                    stmt.close();                } catch (SQLException e) {                    e.printStackTrace();                }            }            if(conn != null) {                try {                    stmt.close();                } catch (SQLException e) {                    e.printStackTrace();                }            }        }    }}

update代码:

package cn.itcast.jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.sql.Statement;public class JdbcDemo03 {    public static void main(String[] args) {        Connection conn = null;        Statement stmt = null;        try {            //1.注册驱动            Class.forName("com.mysql.jdbc.Driver");            //2.获取连接对象            conn = DriverManager.getConnection("jdbc:mysql:///ceshi", "root", "123456");            //3.定义SQL            String sql = "update students set age = 36 where studentNo = 013";            //4.获取执行SQL对象            stmt = conn.createStatement();            //5.执行SQL            int count = stmt.executeUpdate(sql);            //6.处理结果            System.out.println(count);            if(count >0) {                System.out.println("修改成功");            }else {                System.out.println("修改失败");            }        } catch (ClassNotFoundException e) {            e.printStackTrace();        } catch (SQLException e) {            e.printStackTrace();        }finally {            if(stmt != null) {                try {                    stmt.close();                } catch (SQLException e) {                    e.printStackTrace();                }            }            if(conn != null) {                try {                    conn.close();                } catch (SQLException e) {                    e.printStackTrace();                }            }        }    }}

delete代码:

package cn.itcast.jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.sql.Statement;public class JdbcDemo04 {    public static void main(String[] args) {        Connection conn = null;        Statement stmt = null;        try {            //1.注册驱动            Class.forName("com.mysql.jdbc.Driver");            //2.获取连接对象            conn = DriverManager.getConnection("jdbc:mysql:///ceshi", "root", "123456");            //3.定义SQL            String sql = "DELETE FROM students where studentNo = 013";            //4.获取执行SQL对象            stmt = conn.createStatement();            //5.执行SQL            int count = stmt.executeUpdate(sql);            //6.处理结果            System.out.println(count);            if(count >0) {                System.out.println("修改成功");            }else {                System.out.println("修改失败");            }        } catch (ClassNotFoundException e) {            e.printStackTrace();        } catch (SQLException e) {            e.printStackTrace();        }finally {            if(stmt != null) {                try {                    stmt.close();                } catch (SQLException e) {                    e.printStackTrace();                }            }            if(conn != null) {                try {                    conn.close();                } catch (SQLException e) {                    e.printStackTrace();                }            }        }    }}

4、ResultSet:结果集对象,封装查询结果

基本使用:

package cn.itcast.jdbc;import java.sql.*;public class JdbcDemo05 {    public static void main(String[] args) {        Connection conn = null;        Statement stmt = null;        ResultSet rs = null;        try {            //1.注册驱动            Class.forName("com.mysql.jdbc.Driver");            //2.获取连接对象            conn = DriverManager.getConnection("jdbc:mysql:///ceshi", "root", "123456");            //3.定义SQL            String sql = "SELECT * FROM test";            //4.获取执行SQL对象            stmt = conn.createStatement();            //5.执行SQL            rs = stmt.executeQuery(sql);            //6.处理结果            //6.1让游标向下移动一行            rs.next();            //6.2获取数据            int id = rs.getInt(1);            String name = rs.getString("name");            int age = rs.getInt(3);            System.out.println(id + "--" + name + "--" + age);        } catch (ClassNotFoundException e) {            e.printStackTrace();        } catch (SQLException e) {            e.printStackTrace();        }finally {            if(rs != null) {                try {                    rs.close();                } catch (SQLException e) {                    e.printStackTrace();                }            }            if(stmt != null) {                try {                    stmt.close();                } catch (SQLException e) {                    e.printStackTrace();                }            }            if(conn != null) {                try {                    conn.close();                } catch (SQLException e) {                    e.printStackTrace();                }            }        }    }}

ResultSet:结果集对象,封装查询结果    * boolean next(): 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true    * getXxx(参数):获取数据        * Xxx:代表数据类型   如: int getInt() ,    String getString()        * 参数:            1. int:代表列的编号,从1开始   如: getString(1)            2. String:代表列名称。 如: getDouble("balance")        * 注意:        * 使用步骤:            1. 游标向下移动一行            2. 判断是否有数据            3. 获取数据           //循环判断游标是否是最后一行末尾。            while(rs.next()){                //获取数据                //6.2 获取数据                int id = rs.getInt(1);                String name = rs.getString("name");                double balance = rs.getDouble(3);                System.out.println(id + "---" + name + "---" + balance);            }    * 练习:        * 定义一个方法,查询emp表的数据将其封装为对象,然后装载集合,返回。            1. 定义Emp类            2. 定义方法 public List
findAll(){} 3. 实现方法 select * from emp;

ResultSet遍历:

package cn.itcast.jdbc;import java.sql.*;public class JdbcDemo06 {    public static void main(String[] args) {        Connection conn = null;        Statement stmt = null;        ResultSet rs = null;        try {            //1.注册驱动            Class.forName("com.mysql.jdbc.Driver");            //2.获取连接对象            conn = DriverManager.getConnection("jdbc:mysql:///ceshi", "root", "123456");            //3.定义SQL            String sql = "SELECT * FROM test";            //4.获取执行SQL对象            stmt = conn.createStatement();            //5.执行SQL            rs = stmt.executeQuery(sql);            //6.处理结果            //循环判断游标是否是最后一行未尾            while (rs.next()) {                //获取数据                int id = rs.getInt(1);                String name = rs.getString("name");                int age = rs.getInt(3);                System.out.println(id + "--" + name + "--" + age);            }                    } catch (ClassNotFoundException e) {            e.printStackTrace();        } catch (SQLException e) {            e.printStackTrace();        }finally {            if(rs != null) {                try {                    rs.close();                } catch (SQLException e) {                    e.printStackTrace();                }            }            if(stmt != null) {                try {                    stmt.close();                } catch (SQLException e) {                    e.printStackTrace();                }            }            if(conn != null) {                try {                    conn.close();                } catch (SQLException e) {                    e.printStackTrace();                }            }        }    }}

5、PreparedStatement:执行sql的对象

1. SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题    1. 输入用户随便,输入密码:a' or 'a' = 'a    2. sql:select * from user where username = 'fhdsjkf' and password = 'a' or 'a' = 'a'     2. 解决sql注入问题:使用PreparedStatement对象来解决    3. 预编译的SQL:参数使用?作为占位符    4. 步骤:        1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar        2. 注册驱动        3. 获取数据库连接对象 Connection        4. 定义sql            * 注意:sql的参数使用?作为占位符。 如:select * from user where username = ? and password = ?;        5. 获取执行sql语句的对象 PreparedStatement  Connection.prepareStatement(String sql)         6. 给?赋值:            * 方法: setXxx(参数1,参数2)                * 参数1:?的位置编号 从1 开始                * 参数2:?的值        7. 执行sql,接受返回结果,不需要传递sql语句        8. 处理结果        9. 释放资源    5. 注意:后期都会使用PreparedStatement来完成增删改查的所有操作        1. 可以防止SQL注入        2. 效率更高

/**     * 登录方法,使用PreparedStatement实现     */    public boolean login2(String username ,String password){        if(username == null || password == null){            return false;        }        //连接数据库判断是否登录成功        Connection conn = null;        PreparedStatement pstmt =  null;        ResultSet rs = null;        //1.获取连接        try {            conn =  JDBCUtils.getConnection();            //2.定义sql            String sql = "select * from user where username = ? and password = ?";            //3.获取执行sql的对象            pstmt = conn.prepareStatement(sql);            //给?赋值            pstmt.setString(1,username);            pstmt.setString(2,password);            //4.执行查询,不需要传递sql            rs = pstmt.executeQuery();            //5.判断           /* if(rs.next()){//如果有下一行,则返回true                return true;            }else{                return false;            }*/            return rs.next();//如果有下一行,则返回true        } catch (SQLException e) {            e.printStackTrace();        }finally {            JDBCUtils.close(rs,pstmt,conn);        }        return false;    }}

转载于:https://www.cnblogs.com/weiyiming007/p/11495163.html

你可能感兴趣的文章
cf(数学思维题)
查看>>
hdu1690(最短路floyd)
查看>>
并行编程OpenMP基础及简单示例
查看>>
深度学习的并行问题
查看>>
约数的计算
查看>>
005 Fiddler get请求
查看>>
再生龙软件使用
查看>>
手机开发-安卓手机的更新换代
查看>>
ElasticSearch1.7.1 安装
查看>>
异常记录
查看>>
Laravel 设置语言不生效的问题
查看>>
PHP知识梳理
查看>>
pointer of 2d array and address
查看>>
php 中间件
查看>>
【转】sizeof 总结
查看>>
postgresql 空间函数 随笔
查看>>
Java中Thread与Runnable二三事
查看>>
Record
查看>>
CSS笔记——padding,margin为百分比计算时的参照对象
查看>>
在ubuntu服务器上配置tomcat
查看>>