• 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);
    }
    }

  • 相关阅读:
    Windows性能计数器应用
    Azure Oracle Linux VNC 配置
    Azure 配置管理系列 Oracle Linux (PART6)
    Azure 配置管理系列 Oracle Linux (PART5)
    Azure 配置管理系列 Oracle Linux (PART4)
    Azure 配置管理系列 Oracle Linux (PART3)
    Azure 配置管理系列 Oracle Linux (PART2)
    vagrant多节点配置
    docker基本操作
    LINUX开启允许对外访问的网络端口命令
  • 原文地址:https://www.cnblogs.com/haizai/p/11260045.html
Copyright © 2020-2023  润新知