JDBC(二)

JDBC(二),第1张

文章目录
  • 其他方法
    • 编写工具类
      • 编写资源文件
      • 编写工具类
      • 编写测试类
    • 使用数据库连接池
    • SQL注入
    • preparestatement对象
    • 使用idea来打开数据库

其他方法 编写工具类 编写资源文件

.properties

  • 💥💥放在src文件下
  • (可要可不要,如果报错还是要加入)在src文件中新建一个文件夹,标记为resourse,将properties文件放入其中
Driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/school?useUnicode=true&&characterEncoding=utf8
username=root
password=123456
编写工具类

JDBCUtils.java

import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class JDBCutils {
    private static String driver;
    private static String url;
    private static String username;
    private static String password;

    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");
            //加载驱动
            Class.forName(driver);
            Connection connection = DriverManager.getConnection(url, username, password);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static Connection getConnection(){
        try {
            return  DriverManager.getConnection(url, username, password);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
    public static void release(Connection connection, Statement statement, ResultSet resultSet){
        try {
            if (resultSet != null) {
                resultSet.close();
            }
            if (statement != null) {
                statement.close();
            }
            if (connection != null) {
                connection.close();
            }
        }catch(SQLException e){
            e.printStackTrace();
        }
    }
}
编写测试类
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Testutils {

    public static void main(String[] args) throws SQLException {
        Connection connection=null;
        Statement statement=null;
        ResultSet resultSet=null;
        connection=JDBCutils.getConnection();
        statement=connection.createStatement();
        String sql="SELECT * FROM `student`";
        resultSet = statement.executeQuery(sql);
        while(resultSet.next()){
            System.out.println("学号"+':'+resultSet.getObject("StuID"));
            System.out.println("姓名"+':'+resultSet.getObject("Stuname"));
            System.out.println("性别"+':'+resultSet.getObject("Stusex"));
            System.out.println("年龄"+':'+resultSet.getObject("Stuage"));
            System.out.println("====================");
        }
        JDBCutils.release(connection,statement,resultSet);
    }
}

编写了资源文件,工具类后,就可以只在主文件中写少量代码就可以实现数据库的 *** 纵。

使用数据库连接池
  • 普通的JDBC数据库连接使用DriverManager来获取,
  • 每次向数据库建立连接的时候都要将 Connection加载到内存中,需要很长的时间。
  • 需要数据库连接的时候,就向数据库要求一个,执行完成后再断开连接。这样的方式将会消耗大量的资源和时间。数据库的连接资源并没有得到很好的重复利用。

数据库连接池:

  • 就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。
  • 数据库连接池负责分配 、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接池,而不是重新建立一个。

这里用的是C3P0,是一个开源。

在后面的javaweb中会详细介绍。

需要导入的jar包:

代码实现:

这里并没有用工具类来实现,是为了更加清晰一些。

mport com.mchange.v2.c3p0.ComboPooledDataSource;

import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class TestDataSourse {

    public static void main(String[] args) throws PropertyVetoException, SQLException {

        ComboPooledDataSource comboPooledDataSource=new ComboPooledDataSource();
        comboPooledDataSource.setDriverClass("com.mysql.jdbc.Driver");
        comboPooledDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/school");
        comboPooledDataSource.setUser("root");
        comboPooledDataSource.setPassword("123456");

        Connection connection = comboPooledDataSource.getConnection();

        String sql="insert into student values (?,?,?,?)";
        PreparedStatement preparedStatement=connection.prepareStatement(sql);

        preparedStatement.setInt(1,7);
        preparedStatement.setString(2,"林妹妹");
        preparedStatement.setString(3,"女");
        preparedStatement.setInt(4,200);

        int i = preparedStatement.executeUpdate();
        if(i>0){
            System.out.println("插入成功");
        }
        preparedStatement.close();
        connection.close();
    }
}
SQL注入

SQL存在漏洞,容易被攻击。

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法 *** 作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息

输入过程中要注意的事项

  • SQL中字符串要用 ’ ’ 包裹起来
  • 💥💥在写传入数据时一定要注意。
public class TestBug {

    public static void main(String[] args) {
        //正常登录
        //login("张三",1);
        //非正常登录
        login(" 'or '1=1",1);
        //也可以得到
        //只要为true都可以
    }
    //登录业务
    public static void login(String username,int ID) {
        Connection connection=null;
        Statement statement=null;
        ResultSet resultSet=null;
        try {
            connection = JDBCutils.getConnection();
            statement = connection.createStatement();

            String sql = "SELECT * FROM `student`where `Stuname`='" + username + "' and `StuID`=" + ID;
            resultSet = statement.executeQuery(sql);
            while (resultSet.next()) {
                System.out.println("学号" + ':' + resultSet.getObject("StuID"));
                System.out.println("姓名" + ':' + resultSet.getObject("Stuname"));
                System.out.println("====================");
            }
        }catch(Exception e){
            e.printStackTrace();
        }
        JDBCutils.release(connection,statement,resultSet);
    }

}
preparestatement对象

preparestatement与statement不同:

  • preparestatement可以防止SQL注入,更加安全。
  • preparestatement效率更高
import com.study.Testproperties.utils.JDBCutils;

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

public class TestPrepareStatement {
    public static void main(String[] args) {

        Connection connection=null;
        PreparedStatement preparedStatement=null;
        ResultSet resultSet=null;
        try {
            connection = JDBCutils.getConnection();
            //statement = connection.createStatement();
            //区别
            //参数为预编译SQL,不执行
            String sql="insert into student values (?,?,?,?)";
            preparedStatement=connection.prepareStatement(sql);
            //手动与参数赋值
            preparedStatement.setInt(1,5);
            preparedStatement.setString(2,"shengweiming");
            preparedStatement.setString(3,"男");
            preparedStatement.setInt(4,22);
            int i = preparedStatement.executeUpdate();
            if(i>0){
                System.out.println("插入成功");
            }


        }catch(Exception e){
            e.printStackTrace();
        }
        JDBCutils.release(connection,preparedStatement,resultSet);
    }
}

statement和preparestatement

  • executeUpdate:执行增,删,改
  • executeQuery:执行查询
使用idea来打开数据库

连接database:

选择自己想用的数据库:

  • 查看数据库中的,双击就可以。

修改表中信息:

在idea中打开SQL编辑器:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/920509.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存