zoukankan      html  css  js  c++  java
  • java核心技术第三篇之JDBC第一篇

    01.JDBC_两个重要的概念:
    1).什么是数据库驱动程序:由数据库厂商提供,面向某种特定的编程语言所开发的一套访问本数据库的类库。
    驱动包一般由两种语言组成,前端是:面向某种特定编程语言的语言;后端是:本数据库的语言。
    可以方便开发人员使用自己的语言来访问本公司的数据库软件。

    2).什么是JDBC:是由SUN公司提出一套Java访问数据库的一套标准。它物理上由一组类和接口组成。要求数据库厂商的驱动程序
    必须遵守这套标准流程。也要求我们Java程序员也遵守这套流程。这样就使得我们Java程序员访问各种数据库软件
    所使用的都是同一个流程。
    02.JDBC_四个核心对象:
    1).DriverManager:用来获取连接对象
    2).Connection:一个连接对象,表示我们的程序和数据库之间的一个连接通道。
    3).Statement:SQL执行平台,用于发送SQL语句;
    4).ResultSet : 执行查询后将查询结果封装到ResultSet对象中,它就类似于一个集合。

    JDBC是Java连接不同数据库的类库,它有三个核心功能:
    1. 连接数据库;
    2. 向数据库发送SQL语句;
    3. 操作SQL语句的返回结果。

    A 、 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API。
    B 、 JDBC是Java访问数据库的标准规范,可以为不同的关系型数据库提供统一访问,它由一组用Java语言编写的接口和类组成。
    C 、 JDBC需要连接驱动,驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信。
    D 、 JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库!

    03.Java访问MySQL数据库:
    1).将驱动包复制到项目目录下,添加到构建路径。
    2).开发步骤:
    //1.注册驱动
    Class.forName("com.mysql.jdbc.Driver");
    //2.获取连接对象
    Connection conn = DriverManager.getConnection(
    "jdbc:mysql://127.0.0.1:3306/hei66_day21", "root", "123");
    //3.获取SQL执行平台
    Statement stmt = conn.createStatement();
    //4.发送SQL语句,获取结果集
    String sql = "select * from city";
    ResultSet rs = stmt.executeQuery(sql);
    //5.处理结果集
    while(rs.next()){
    System.out.println(rs.getInt("cid") + " " + rs.getString("cname"));
    }
    //6.释放资源
    rs.close();
    stmt.close();
    conn.close();

    JDBC操作数据库的使用步骤顺序

    1.导入mysql的驱动程序通过DriverManger注册驱动

    2.通过DriverManager获取连接对象Connection

    3.通过Connection获取一个可以向数据库发送sql语句的对象Statement

    4.通过Statement对象执行sql语句(select) 得到一个结果集ResultSet

    5.遍历结果集ResultSet,得到数据表中的数据

    6.释放资源

    04.开发步骤的详细说明:
    1).注册驱动:
    2).获取连接对象:
    getConnection(连接字符串,用户名,密码)
    3).获取SQL执行平台--Statement
    Connection对象的createStatement()
    4).发送SQL语句【重点掌握】:
    Statement的:
    a).public int executeUpdate(String sql):用于发送添加(insert)、修改(update)、删除(delete)语句的。
    b).public ResultSet executeQuery(String sql):用于发送查询(select)语句的。
    5).处理结果集:如果是发送的查询语句,会获取一个ResultSet结果集【重点掌握】
    a).ResultSet-->next():让当前的游标位置下移一位;此方法会返回boolean值
    b).获取某列的值:推荐使用getXxx(String 字段名)
    ResultSet-->getInt(String 字段名)
    getInt(int 字段索引):查询结果中的字段索引,是从1开始

    getString(String 字段名)
    getString(int 字段索引):

    getObject(String 字段名)
    getObject(int 字段索引):
    6).释放资源:
    ResultSet-->close()
    Statement-->close()
    Connection-->close()
    05.JDBC工具类的编写:

    标准版:

    1.5JDBC工具类
    “获得数据库连接”操作,将在以后的增删改查所有功能中都存在,可以封装工具类JDBCUtils。提供获取连接对象的方法,从而达到代码的重复利用。
    该工具类提供方法:public static Connection getConn ()。代码如下:

    public class JdbcUtils {

    private static String driver = "com.mysql.jdbc.Driver";
    private static String url = "jdbc:mysql://localhost:3306/webdb_4";
    private static String user = "root";
    private static String password = "root";

    static{
    try {
    //注册驱动
    Class.forName(driver);
    } catch (Exception e) {
    throw new RuntimeException(e);
    }

    }

    /**
    * 获得连接
    * @return
    * @throws SQLException
    */
    public static Connection getConnection() throws SQLException{
    //获得连接
    Connection conn = DriverManager.getConnection(url, user, password);
    return conn;
    }

    /**
    * 释放资源
    * @param conn
    * @param st
    * @param rs
    */
    public static void closeResource(Connection conn , Statement st , ResultSet rs){

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

    if(st != null){
    try {
    st.close();
    } catch (SQLException e) {
    }
    }

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

    }

    //1.获取Connection对象--简单的代码复用,每次都会创建一个新的Connection对象
    public static Connection getConnection() throws Exception{
    Class.forName("com.mysql.jdbc.Driver");
    Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/hei66_day21","root","123");
    return conn;
    }

    //2.释放所有资源
    public static void closeAll(ResultSet rs,Statement stmt,Connection conn){
    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();
    }
    }
    }
    06.SQL语句的拼接:
    Scanner sc = new Scanner(System.in);
    System.out.println("学员姓名:");
    String stuName = sc.next();
    System.out.println("年龄:");
    int age = sc.nextInt();
    System.out.println("性别:");
    String sex = sc.next();
    System.out.println("身高:");
    double height = sc.nextDouble();
    System.out.println("地址:");
    String address = sc.next();
    System.out.println("电话:");
    String phoneNum = sc.next();

    String sql = "insert into student values(null,'" + stuName + "'," +
    age + ",'" +
    sex + "'," +
    height + ",'" +
    address + "','" +
    phoneNum + "')";
    System.out.println(sql);
    //1.获取连接
    Connection conn = JDBCUtils.getConnection();
    Statement stmt = conn.createStatement();
    int row = stmt.executeUpdate(sql);
    System.out.println("添加影响的行数:" + row);
    JDBCUtils.closeAll(null, stmt, conn);
    07.SQL注入的问题:
    1.什么是SQL注入:用户输入的数据当中包含一些SQL的格式符号,如果我们不做处理,直接封装到SQL语句中,会导致
    SQL语句出错,或者是得到不正确的结果。
    2.解决方案:不使用Statement,改用:PreparedStatement,它是Statement的子接口,表示:预定义的SQL执行平台。
    它能够将SQL语句和用户的数据分开管理,所以即使用户数据中包含SQL的格式符号,也不会解析为SQL的格式,所以
    可以预防SQL注入的问题。
    08.PreparedStatement的使用:
    1).获取PreparedStatement对象:
    ....
    PreparedStatement ps = conn.prepareStatement(String 预处理的SQL语句);
    //填充参数
    ps.setString(1,xxx)
    ps.setInt(2,xxxx)
    //发送SQL语句
    ps.executeUpdate();//注意:这里是无参调用--执行添加、修改、删除
    ps.executeQuery();//无参。执行:查询

    ==============================================================================================================================
    学习目标:
    1.能够理解JDBC的概念:
    1.JDBC是Sun公司提出一套Java连接数据库的标准。它的物理上由一些类和接口组成。
    2.能够使用DriverManager类
    Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/hei66_day21","root","123");
    3.能够使用Connection接口
    获取SQL执行平台:
    1.Statement stmt = conn.createStatement();
    2.PreparedStatement ps = conn.parepareStatement(String 预处理的SQL语句)

    4.能够使用Statement接口
    1.public int executeUpdate(String sql):执行添加,修改,删除语句;
    2.public ResultSet executeQuery(String sql):执行查询。
    5.能够使用ResultSet接口
    ...
    ResultSet rs = stmt.executeQuery("select * from student");
    while(rs.next()){
    rs.getInt(String 字段名称)
    rs.getInt(int 字段索引)

    rs.getString(String 字段名称)
    rs.getString(int 字段索引)
    }
    6.能够描述SQL注入的原理和解决方案:
    1.SQL注入的原理:在用户的数据中包含了SQL的格式符号,我们将数据直接拼接SQL语句,会导致SQL语句错误或者执行结果错误。
    2.解决方案:使用预处理的SQL执行平台:PreparedStatement
    7.能够编写JDBC的工具类
    public class JDBCUtils{
    //1.获取连接对象的方法
    public static Connection getConnection(){
    Class.forName("com.mysql.jdbc.Driver");
    Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/hei65_day21","root","123");
    return conn;
    }
    //2.关闭所有连接的方法
    public static void closeAll(ResultSet rs,Statement stmt,Connection conn) throws Exception{
    if(rs != null){
    rs.close();
    }
    if(stmt != null){
    stmt.close();
    }
    if(conn != null){
    conn.close();
    }
    }
    }
    8.能够使用PreparedStatement编写CURD(增删改查)代码
    //1.添加
    public void save() throws Exception{
    //1.获取Connection对象
    Connection conn = JDBCUtils.getConnection();
    //2.获取预处理的SQL平台
    PreparedStatement ps = conn.prepareStatement("insert into student values(null,?,?,?,?,?,?)");
    //3.填充数据
    ps.setString(1, "汪峰");//第一个?的位置,填充:汪峰
    ps.setInt(2, 22);
    ps.setString(3, "男");
    ps.setDouble(4, 1.80);
    ps.setString(5, "北京");
    ps.setString(6, "00000000");

    //4.执行SQL语句
    int row = ps.executeUpdate();
    System.out.println("添加影响的行数:" + row);
    //释放资源
    JDBCUtils.closeAll(null, ps, conn);

    }

    //2.修改
    public void update() throws Exception{
    //1.获取Connection对象
    Connection conn = JDBCUtils.getConnection();
    //2.获取预处理的SQL平台
    String sql = "update student set stuName = ? , age = ?, sex = ?, height = ?, address = ?, phoneNum = ? where id = ?";
    PreparedStatement ps = conn.prepareStatement(sql);
    //3.填充数据
    ps.setString(1, "撒贝宁");
    ps.setInt(2, 22);
    ps.setString(3, "男");
    ps.setDouble(4, 1.5);
    ps.setString(5, "北京");
    ps.setString(6, "77777777");
    ps.setInt(7, 3);

    //4.执行SQL
    int row = ps.executeUpdate();
    System.out.println("修改影响的行数:" + row);

    //5.释放资源
    JDBCUtils.closeAll(null, ps, conn);
    }

    //3.查询
    public void findById() throws Exception{
    //1.获取Connection
    Connection conn = JDBCUtils.getConnection();
    //2.获取SQL执行平台
    PreparedStatement ps = conn.prepareStatement("select * from student where id = ?");
    //3.填充数据
    ps.setInt(1, 3);
    //4.执行查询
    ResultSet rs = ps.executeQuery();
    if(rs.next()){
    System.out.println(rs.getInt("id") + " " + rs.getString("stuName"));
    }
    //5.释放资源
    JDBCUtils.closeAll(null, ps, conn);
    }

    //4.删除
    @Test
    public void deleteById() throws Exception{
    //1.获取Connection对象
    Connection conn = JDBCUtils.getConnection();
    //2.获取SQL执行平台
    PreparedStatement ps = conn.prepareStatement("delete from student where id = ?");
    ps.setInt(1, 3);
    //3.执行
    int row = ps.executeUpdate();
    System.out.println("删除影响的行数:" + row);
    //4.释放
    JDBCUtils.closeAll(null, ps, conn);

    }

    package cn.baidu.demo02_JDBC开发的增删改查;

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.Statement;

    import org.junit.Test;

    public class Demo {
    //1.添加
    public void save() throws Exception{
    //1.注册驱动
    Class.forName("com.mysql.jdbc.Driver");
    //2.获取连接对象
    Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/hei66_day21","root","123");
    //3.获取SQL执行平台
    String sql = "insert into city values(null,'洛阳',3)";
    Statement stmt = conn.createStatement();
    int row = stmt.executeUpdate(sql);
    System.out.println("添加影响的行数:" + row);
    //4.释放资源
    stmt.close();
    conn.close();
    }
    //2.修改
    public void update() throws Exception{
    //1.注册驱动
    Class.forName("com.mysql.jdbc.Driver");
    //2.获取连接对象
    Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/hei66_day21","root","123");
    //3.获取SQL执行平台
    String sql = "update city set cname = '信阳' where cname = '洛阳'";
    Statement stmt = conn.createStatement();
    int row = stmt.executeUpdate(sql);
    System.out.println("修改影响的行数:" + row);
    //4.释放资源
    stmt.close();
    conn.close();
    }
    //3.删除
    public void delete() throws Exception{
    Class.forName("com.mysql.jdbc.Driver");
    Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/hei66_day21","root","123");
    Statement stmt = conn.createStatement();
    String sql = "delete from city where cid = 7";
    int row = stmt.executeUpdate(sql);
    System.out.println("删除影响的行数:" + row);
    stmt.close();
    conn.close();
    }
    //4.查询所有记录
    @Test
    public void findAll() throws Exception{
    Class.forName("com.mysql.jdbc.Driver");
    Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/hei66_day21","root","123");
    Statement stmt = conn.createStatement();
    String sql = "select * from city";
    ResultSet rs = stmt.executeQuery(sql);
    //遍历
    while(rs.next()){
    System.out.println(rs.getInt("cid") + " " + rs.getString("cname") + " " + rs.getInt("pid"));
    }
    //释放资源
    rs.close();
    stmt.close();
    conn.close();
    }
    }


    package cn.baidu.demo03_自定义工具类的编写;

    import java.io.FileReader;
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.Statement;

    import org.junit.Test;

    public class Demo {
    //1.添加
    public void save() throws Exception{

    //2.获取连接对象
    Connection conn = JDBCUtils.getConnection();
    //3.获取SQL执行平台
    String sql = "insert into city values(null,'洛阳',3)";
    Statement stmt = conn.createStatement();
    int row = stmt.executeUpdate(sql);
    System.out.println("添加影响的行数:" + row);
    //4.释放资源
    JDBCUtils.closeAll(null, stmt, conn);
    }
    //2.修改
    public void update() throws Exception{

    //2.获取连接对象
    Connection conn = JDBCUtils.getConnection();
    //3.获取SQL执行平台
    String sql = "update city set cname = '信阳' where cname = '洛阳'";
    Statement stmt = conn.createStatement();
    int row = stmt.executeUpdate(sql);
    System.out.println("修改影响的行数:" + row);
    //4.释放资源
    /*stmt.close();
    conn.close();*/
    JDBCUtils.closeAll(null, stmt, conn);
    }
    //3.删除
    public void delete() throws Exception{
    Connection conn = JDBCUtils.getConnection();
    Statement stmt = conn.createStatement();
    String sql = "delete from city where cid = 7";
    int row = stmt.executeUpdate(sql);
    System.out.println("删除影响的行数:" + row);
    /*stmt.close();
    conn.close();*/
    JDBCUtils.closeAll(null, stmt, conn);
    }
    //4.查询所有记录
    @Test
    public void findAll() throws Exception{

    Connection conn = JDBCUtils.getConnection();
    Statement stmt = conn.createStatement();
    String sql = "select * from city";
    ResultSet rs = stmt.executeQuery(sql);
    //遍历
    while(rs.next()){
    System.out.println(rs.getInt("cid") + " " + rs.getString("cname") + " " + rs.getInt("pid"));
    }
    //释放资源
    /*
    rs.close();
    stmt.close();
    conn.close();*/
    JDBCUtils.closeAll(rs, stmt, conn);
    }
    }


    package cn.baidu.demo03_自定义工具类的编写;

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;

    public class JDBCUtils {
    //1.获取Connection对象--简单的代码复用,每次都会创建一个新的Connection对象
    public static Connection getConnection() throws Exception{
    Class.forName("com.mysql.jdbc.Driver");
    Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/hei66_day21","root","123");
    return conn;
    }

    //2.释放所有资源
    public static void closeAll(ResultSet rs,Statement stmt,Connection conn){
    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();
    }
    }
    }
    }

    package cn.baidu.demo04_封装SQL语句;

    import java.sql.Connection;
    import java.sql.Statement;
    import java.util.Scanner;

    import org.junit.Test;

    import cn.baidu.demo03_自定义工具类的编写.JDBCUtils;

    public class Demo {
    @Test
    public void save() throws Exception{
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入一个河南的市名:");
    String city = sc.next();

    // String sql = "insert into city values(null,'信阳',3)";
    String sql = "insert into city values(null,'" + city + "',3)";
    System.out.println(sql);
    //获取连接
    Connection conn = JDBCUtils.getConnection();
    Statement stmt = conn.createStatement();
    int row = stmt.executeUpdate(sql);
    System.out.println("添加影响的行数:" + row);
    //释放连接
    JDBCUtils.closeAll(null, stmt, conn);
    }
    public void saveStudent() throws Exception{
    Scanner sc = new Scanner(System.in);
    System.out.println("学员姓名:");
    String stuName = sc.next();
    System.out.println("年龄:");
    int age = sc.nextInt();
    System.out.println("性别:");
    String sex = sc.next();
    System.out.println("身高:");
    double height = sc.nextDouble();
    System.out.println("地址:");
    String address = sc.next();
    System.out.println("电话:");
    String phoneNum = sc.next();

    String sql = "insert into student values(null,'" + stuName + "'," +
    age + ",'" +
    sex + "'," +
    height + ",'" +
    address + "','" +
    phoneNum + "')";
    System.out.println(sql);
    //1.获取连接
    Connection conn = JDBCUtils.getConnection();
    Statement stmt = conn.createStatement();
    int row = stmt.executeUpdate(sql);
    System.out.println("添加影响的行数:" + row);
    JDBCUtils.closeAll(null, stmt, conn);


    }
    }


    package cn.baidu.demo05_关于SQL注入的问题;

    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.Statement;
    import java.util.Scanner;

    import cn.baidu.demo03_自定义工具类的编写.JDBCUtils;

    public class Demo {
    public static void main(String[] args) throws Exception {
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入登录名:");
    String loginName = sc.nextLine();
    System.out.println("请输入密码:");
    String loginPwd = sc.nextLine();

    String sql = "select * from users where loginName = '" + loginName +
    "' and loginPwd = '" + loginPwd + "'";
    System.out.println(sql);
    //1.获取连接对象
    Connection conn = JDBCUtils.getConnection();
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery(sql);
    if(rs.next()){
    System.out.println("欢迎:" + loginName + " 登录系统!");
    }else{
    System.out.println("用户名或密码错误!");
    }
    JDBCUtils.closeAll(rs, stmt, conn);
    }
    }


    package cn.baidu.demo06_使用PreparedStatement防止SQL注入;

    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.util.Scanner;

    import cn.baidu.demo03_自定义工具类的编写.JDBCUtils;

    public class Demo {
    public static void main(String[] args) throws Exception {
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入登录名:");
    String loginName = sc.nextLine();
    System.out.println("请输入密码:");
    String loginPwd = sc.nextLine();

    String sql = "select * from users where loginName = ? and loginPwd = ?";

    //1.获取连接对象
    Connection conn = JDBCUtils.getConnection();
    PreparedStatement ps = conn.prepareStatement(sql);
    //填充数据
    ps.setString(1, loginName);
    ps.setString(2, loginPwd);

    ResultSet rs = ps.executeQuery();
    if(rs.next()){
    System.out.println("欢迎:" + loginName + " 登录系统!");
    }else{
    System.out.println("用户名或密码错误!");
    }
    JDBCUtils.closeAll(rs, ps, conn);
    }
    }

    package cn.baidu.demo06_使用PreparedStatement防止SQL注入;

    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.util.Scanner;

    import cn.baidu.demo03_自定义工具类的编写.JDBCUtils;

    public class Demo {
    public static void main(String[] args) throws Exception {
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入登录名:");
    String loginName = sc.nextLine();
    System.out.println("请输入密码:");
    String loginPwd = sc.nextLine();

    String sql = "select * from users where loginName = ? and loginPwd = ?";

    //1.获取连接对象
    Connection conn = JDBCUtils.getConnection();
    PreparedStatement ps = conn.prepareStatement(sql);
    //填充数据
    ps.setString(1, loginName);
    ps.setString(2, loginPwd);

    ResultSet rs = ps.executeQuery();
    if(rs.next()){
    System.out.println("欢迎:" + loginName + " 登录系统!");
    }else{
    System.out.println("用户名或密码错误!");
    }
    JDBCUtils.closeAll(rs, ps, conn);
    }
    }

  • 相关阅读:
    putty配置
    BroadcastReceiver应用详解 (转)
    linux主设备号和次设备号
    Enable screen lock and HOME key (eclair and older versions)(转)
    C#获取用户桌面等特殊系统路径
    java中Thread与Runnable的区别
    博文索引
    FlinkCDC实践
    关于libxml2.so.2不被Gstreamer链接的解决
    s.length什么意思
  • 原文地址:https://www.cnblogs.com/haizai/p/11260045.html
Copyright © 2011-2022 走看看