【知识】JDBC-学习笔记

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 【知识】JDBC-学习笔记

Java数据库连接(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们通常说的JDBC是面向关系型数据库的。

image.png

JDBC 开发使用到的包:


image.png

JDBC 的核心 API:

image.png


1. 数据库驱动


IDEA建立普通的 Java工程

准备jar包 - mysql-connector-java-5.1.27.jar

导入jar包 -Add as Library


2. 第一个JDBC程序


package JDBCdemo;
import java.sql.*;
public class Demo02 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //  1.加载驱动  固定写法
        Class.forName("com.mysql.jdbc.Driver");
        //  2.用户信息
        String url="jdbc:mysql://localhost:3306/jdbc01?useUnicode=true&characterEncoding=utf8&useSSL=true";
        String usename="root";
        String password="sm1208";
        //  3.连接成功,数据库对象   Connection代表数据库
       Connection connection= DriverManager.getConnection(url,usename,password);
        //  4.执行SQL语句
        Statement statement =connection.createStatement();
        //  5.执行sql语句
        String sql ="SELECT *FROM user";
        ResultSet resultSet =statement.executeQuery(sql);
        while (resultSet.next()){
            System.out.println("id="+resultSet.getObject("id"));
            System.out.println("name="+resultSet.getObject("name"));
        }
        //  6.释放资源
        resultSet.close();
        statement.close();
        connection.close();
    }
}


3. 步骤总结


1.加载驱动

2.连接数据库 DriverManager

3.获取执行sql语句的对象 Statement

4.获取返回的结果集

5.释放资源


4. JDBC中对象解释


Driver Manager 驱动程序管理器


// DriverManager.registerDiver(new com.mysql.jdbc.Driver());
// Class.forName(数据库驱动实现类)
Class.forName("com.mysql.jdbc.Driver"); //固定写法,加载驱动
Connection.connection=DriverManager.getConnection(url,username,password);
//connection代表数据库
//数据库设置自动提交
//事务提交  事务滚回
connection.rollback();
connection.commit();
connection.setAutocommit();


URL


String url="jdbc:mysql://localhost:3306/jdbc01?useUnicode=true&characterEncoding=utf8&useSSL=true";
//协议://主机地址:端口号/数据库名?参数1&参数2&参数3
//mysql
//jdbc:mysql://localhost:3306/数据库名?参数1&参数2&参数3
//oralce
//jdbc:oralce:think@hocalhost:1521:sid
复制代码


Statement 执行SQL的对象



// Statement 执行sql的对象    PrepareStatement执行sql的对象
String sql="SELECT *FROM user"//编写sql语句
  statement.executeQuery(); //查询操作
  statement.execute();    //执行任何sql语句
  statement.executeUpdate();//更新、插入、删除 都是这个,返回一个受影响的行数


ResultSet  查询返回的结果集



// 查询结果集:封装了所有的查询结果
获得指定的数据类型
resultSet.getObject(); //在不知道数据类型的情况下使用
resultSet.getString;
resultSet.getInt;
resultSet.getFloat;
resultSet.getDouble;  


遍历、指针


resultSet.beforeFirst();  //移动到最前面
resultSet.afterlast();    //移动到最后面
resultSet.next();     //移动到下一个数据
resultSet.previous();   //移动到下一行
resultSet.absolute(row);  //移动到指定行


释放资源


resultSet.close();
 statement.close();
 connection.close();
//耗资源 必须关


5. Statement对象


JDBC的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过对这个对象向数据库发送增删改查语句即可


Statement对象的主要方法


executeUpdate方法,用于向数据库发送增、删、改、查的sql语句,executeUpdata执行完毕后,将会返一个整数(即增删改查语句导致数据库几行数据发生了变化。)

executeQuery方法用于向数据发送查询语句,executeQuery方法返回代表查询结果的Eesult对象。


  • Create操作:使用executeUpdate(String sql)方法完成数据库的添加操作,如下
Statement st =conn.createStatement();
String sql ="insert into user(...) value(...)";
int num=st.executeUpdate(sql);
if(num>0){
    System.out.println("插入成功!");
}


  • Delete操作:使用executeUpdate(String sql)方法完成数据库的删除操作,如下


Statement st =conn.createStatement();
String sql ="delete from user where id=? ";
int num=st.executeUpdate(sql);
if(num>0){
    System.out.println("删除成功!");
}


  • Update操作:使用executeUpdate(String sql)方法完成数据库的修改操作,如下


Statement st =conn.createStatement();
String sql ="update user set name="" where name="" ";
int num=st.executeUpdate(sql);
if(num>0){
    System.out.println("修改成功!");
}


  • Read操作:使用executeQuery(String sql)方法完成数据库的c查询操作,如下


Statement st =conn.createStatement();
String sql ="select *from user where id=1 ";
ResultSet rs=st.executeQuery(sql);
whlie(rs.next){
    //根据获取列的数据类型,分别调用rs的相应方法映射到java对象中
  //resultSet.getObject(); 
  //resultSet.getString;
  //resultSet.getInt;
  //resultSet.getFloat;
  //resultSet.getDouble;  
}


5.1 提取工具类


package utils;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class JdbcUtils {
    private static String driver = null;
    private static String url = null;
    private static String username = null;
    private static String password = null;
    static {
        try {
            InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
            Properties properties = new Properties();
            properties.load(in);
            driver = properties.getProperty("driver");
            url = properties.getProperty("url");
            username = properties.getProperty("username");
            password = properties.getProperty("password");
            // 1、驱动只用加载一次
            Class.forName(driver);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    // 获取连接
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url, username, password);
    }
    // 释放资源
    public static void release(Connection conn, Statement st, ResultSet rs) throws SQLException {
        if (rs != null) {
            rs.close();
        }
        if (st != null) {
            st.close();
        }
        if (conn != null) {
            conn.close();
        }
    }
}


5.2 编写增删改的方法



package JDBCdemo.Demo03;
import utils.JdbcUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class TextInsert {
    public static void main(String[] args) throws SQLException {
        Connection conn=null;
        Statement st=null;
        ResultSet rs=null;
        try{
            conn = JdbcUtils.getConnection();
            // 获取数据库连接
            st=conn.createStatement();
            // 获取 SQL的执行对象
            String sql="INSERT INTO user(id,name) VALUES ('3','jumper')";
            int i=st.executeUpdate(sql);
            if(i>0){
                System.out.println("插入成功!");
            }
            // 执行SQL语句
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.release(conn,st,rs);
        }
    }
}



package JDBCdemo.Demo03;
        import utils.JdbcUtils;
        import java.sql.Connection;
        import java.sql.ResultSet;
        import java.sql.SQLException;
        import java.sql.Statement;
public class TextDelete  {
    public static void main(String[] args) throws SQLException {
        Connection conn=null;
        Statement st=null;
        ResultSet rs=null;
        try{
            conn = JdbcUtils.getConnection();
            // 获取数据库连接
            st=conn.createStatement();
            // 获取 SQL的执行对象
            String sql="DELETE from `user` WHERE id = 2";
            int i = st.executeUpdate(sql);
            if(i>0) System.out.println("删除成功");
            // 执行SQL语句
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.release(conn,st,rs);
        }
    }
}



package JDBCdemo.Demo03;
        import utils.JdbcUtils;
        import java.sql.Connection;
        import java.sql.ResultSet;
        import java.sql.SQLException;
        import java.sql.Statement;
public class TextUpdate {
    public static void main(String[] args) throws SQLException {
        Connection conn=null;
        Statement st=null;
        ResultSet rs=null;
        try{
            conn = JdbcUtils.getConnection();
            // 获取数据库连接
            st=conn.createStatement();
            // 获取 SQL的执行对象
            String sql="UPDATE `user` SET `name`='孙不坚' WHERE id=3  ";
            int i = st.executeUpdate(sql);
            if(i>0) System.out.println("修改成功");
            // 执行SQL语句
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.release(conn,st,rs);
        }
    }
}
package JDBCdemo.Demo03;
import utils.JdbcUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class TextRead {
    public static void main(String[] args) throws SQLException {
        Connection conn=null;
        Statement st=null;
        ResultSet rs=null;
        try{
            conn = JdbcUtils.getConnection();
            // 获取数据库连接
            st=conn.createStatement();
            // 获取 SQL的执行对象
            String sql="select * from user ";
            // 查询获取返回集合
            ResultSet query = st.executeQuery(sql);
            // 遍历
            while (query.next()){
                System.out.println(query.getObject("id"));
                System.out.println(query.getObject("name"));
            }
            // 执行SQL语句
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.release(conn,st,rs);
        }
    }
}


6 SQL注入问题


所谓SQL注入(sql inject),就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。


使用Statement的话,sql 存在漏洞。

package JDBCdemo.Demo03;
import JDBCdemo.Demo03.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class SQLinject {
    public static void main(String[] args) throws SQLException {
        login("'' or 1=1","'' or 1=1");
    }
    public static  void login(String username,String password) throws SQLException {
        Connection conn=null;
        Statement st=null;
        ResultSet rs=null;
        try {
            //SELECT * FROM `users` WHERE `NAME`='' or 1=1 AND `PASSWORD`='' or 1=1 ;
            //获取连接
            conn = JdbcUtils.getConnection();
            //获取sql对象
            st= conn.createStatement();
            //sql
            String sql="SELECT * FROM `user` ";
            //查询获取返回集合
            ResultSet query = st.executeQuery(sql);
            //遍历
            while (query.next()){
                System.out.println(query.getObject("id"));
                System.out.println(query.getObject("name"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.release(conn,st,rs);
        }
    }
}


7 PreparedStatement对象


PreparedStatement可以防止SQL注入,更安全


7.1 编写增删改的方法


package JDBCdemo.Demo04;
import JDBCdemo.utils.JdbcUtils;
        import java.sql.Connection;
        import java.sql.PreparedStatement;
        import java.sql.SQLException;
public class TextInsert {
    public static void main(String[] args) throws SQLException {
        Connection conn=null;
        PreparedStatement st=null;
        try {
            conn = JdbcUtils.getConnection();
            //获取数据库链接
            String sql="INSERT INTO user(`name`,`id`) VALUES (?,?)";
            st= conn.prepareStatement(sql);
            st.setObject(1,"孙孙孙");
            st.setObject(2,"5");
            int i = st.executeUpdate();
            if(i>0) System.out.println("插入成功");
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            JdbcUtils.release(conn,st,null);
        }
    }
}
package JDBCdemo.Demo04;
        import JDBCdemo.utils.JdbcUtils;
        import java.sql.Connection;
        import java.sql.PreparedStatement;
        import java.sql.SQLException;
public class TextDelete  {
    public static void main(String[] args) throws SQLException {
        Connection conn=null;
        PreparedStatement st=null;
        try {
            conn = JdbcUtils.getConnection(); //获取数据库链接
            String sql="DELETE from user WHERE id=?";
            st= conn.prepareStatement(sql);
            st.setObject(1,1);
            int i = st.executeUpdate();
            if(i>0) System.out.println("删除成功");
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            JdbcUtils.release(conn,st,null);
        }
    }
}
package JDBCdemo.Demo04;
        import JDBCdemo.utils.JdbcUtils;
        import java.sql.Connection;
        import java.sql.PreparedStatement;
        import java.sql.SQLException;
public class TextUpdate {
    public static void main(String[] args) throws SQLException {
        Connection conn=null;
        PreparedStatement st=null;
        try {
            conn = JdbcUtils.getConnection(); //获取数据库链接
            String sql="update `user` set `name` =?, WHERE id=?";
            st= conn.prepareStatement(sql);
            st.setObject(1,"铭铭铭");
            st.setObject(2,"1");
            int i = st.executeUpdate();
            if(i>0) System.out.println("更新成功");
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            JdbcUtils.release(conn,st,null);
        }
    }
}
package JDBCdemo.Demo04;
        import JDBCdemo.utils.JdbcUtils;
        import java.sql.Connection;
        import java.sql.PreparedStatement;
        import java.sql.ResultSet;
        import java.sql.SQLException;
public class TextRead {
    public static void main(String[] args) throws SQLException {
        Connection conn=null;
        PreparedStatement st=null;
        ResultSet rs=null;
        try {
            //获取连接
            conn = JdbcUtils.getConnection();
            //sql
            String sql="SELECT * from user WHERE id<?";
            //预编译sql
            st= conn.prepareStatement(sql);
            //设置参数
            st.setObject(1,3);
            //执行sql
            rs=st.executeQuery();
            //遍历结果
            while (rs.next()){
                System.out.println(rs.getObject("NAME"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JdbcUtils.release(conn,st,rs);
        }
    }
}


7.2 防止sql注入


package JDBCdemo.Demo04;
import JDBCdemo.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.PreparedStatement;
public class SQLinject  {
    public static void main(String[] args) throws SQLException {
        login("孙不坚","123456");
    }
    public static  void login(String username,String password) throws SQLException {
        Connection conn=null;
        PreparedStatement st=null;
        ResultSet rs=null;
        try {
            //SELECT * FROM `users` WHERE `NAME`='' or 1=1 AND `PASSWORD`='' or 1=1 ;
            //获取连接
            conn = JdbcUtils.getConnection();
            //获取sql对象
            //PreparedStatement 防止sql注入的本质,把传递进来的参数当做字符
            // 假设其中存在转义字符,比如说' 会被忽略掉
            String sql="SELECT * FROM `user` WHERE `name`=? AND `id`= ?";
            st= conn.prepareStatement(sql);
            st.setObject(1,username);
            st.setObject(2,password);
            rs=st.executeQuery();
            //sql
            //查询获取返回集合
            //遍历
            while (rs.next()){
                System.out.println("登陆成功");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.release(conn,st,rs);
        }
    }
}


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
SQL druid Java
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
59 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
|
4月前
|
SQL Java 关系型数据库
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(上)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
141 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(上)
|
4月前
|
SQL 关系型数据库 MySQL
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)(下)
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)
39 6
|
4月前
|
存储 关系型数据库 MySQL
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)(上)
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)
50 4
|
4月前
|
SQL 关系型数据库 MySQL
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)(中)
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)
31 3
|
XML Java 数据库连接
java202304java学习笔记第六十五天-ssm-声明式控制-基于xml的声明式配置-原始jdbc操作1
java202304java学习笔记第六十五天-ssm-声明式控制-基于xml的声明式配置-原始jdbc操作1
65 0
|
SQL druid Java
[Java]JDBC学习笔记(尚硅谷康师傅JDBC)(四)
[Java]JDBC学习笔记(尚硅谷康师傅JDBC)(四)
|
SQL 存储 Java
[Java]JDBC学习笔记(尚硅谷康师傅JDBC) (二)
[Java]JDBC学习笔记(尚硅谷康师傅JDBC)(二)
|
7月前
|
Java 关系型数据库 MySQL
JDBC学习笔记
JDBC学习笔记
下一篇
无影云桌面