JDBC

什么是JDBC

JDBC(Java DataBase Connectivity),即Java数据库连接。简而言之,就是通过Java语言来操作数据库。

我们可以把JDBC理解成是官方定义的一套操作所有关系型数据库的规则,规则即接口。

也就是说,官方定义了一套操作所有关系型数据库的接口,然后让各个数据厂商(Mysql、Oracle等)用实现类去实现这套接口,再把这些实现类打包(数据驱动jar包),并提供数据驱动jar包给我们使用。

我们可以使用这套JDBC接口进行编程,但是真正执行的代码是驱动jar包中的实现类。

为什么?因为JDBC是通过接口来调用方法的,当你导入了驱动jar包(实现类)后,那调用的方法肯定是实现类里面的方法。

在IDEA中连接MySQL数据库

  1. 先在官网下载相应jar包文件(全平台版)mysql-connector-j-8.0.33.zip
  2. 解压zip文件,将其中的jar包复制或剪切 mysql-connector-j-8.0.33.jar
  3. 在项目中建立lib文件夹,导入jar包 ,添加为库后才算导入成功

JDBC编程步骤

MySQL基本语法_McConnel Favel的博客-CSDN博客 表格stu在这篇博客里已创建,现在继续沿用

import java.sql.*;

public class Try {
    public static void main(String[] args){
        Connection con = null;
        Statement stat = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            //第一步:注册驱动
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
            //第二步:获取连接,第一个为你的MySQL数据库中的表格位置,第二个为账号名,第三个为密码
//            String sql = "insert into stu values ('1010','shi',18,'robot','class2');";    //插入操作
//            String sql = "update stu set age = 2 where sex = 'robot';";                     //更新操作
            String sql = "select sid,sname,age,sex,classname from stu;";                  //查看
            //第三步:编写sql语句,语法与sql语句一摸一样,不要忘了分号
            stat = con.createStatement();
            //第四步:获取数据库操作对象(statement专门执行sql语句)
            rs = stat.executeQuery(sql);
            //第五步:执行上面编写的sql语句
            while (rs.next()){
                //re.next()可以使查询光标指向下一行,最初的位置为第一行上面,第一次执行后光标下移到第一行,并返回true,到最后一行无法再下移返回false
//                String sid = rs.getString(1);
//                String sid = rs.getString("sid");
                //上述两行作用一样,第一行表示获取当前行第一列的信息(表格从1开始编号),第二行表示获取当前行”sid“列的信息
                for (int i=1;i<6;i++){
                    String op = rs.getString(i);
                    System.out.print(op+'\t');
                }
                System.out.println();
//                System.out.println(sid);
            }
//            int count = stat.executeUpdate(sql);
//            System.out.println(count);
            //第六步:查询结果(非必须)
        }
        catch (SQLException | ClassNotFoundException e){
            System.out.println("Error "+e);
        }
        finally {
            if (rs != null){
                try{
                    rs.close();
                }
                catch (SQLException e){
                    System.out.println("Error "+e);
                }
            }
            if (stat != null){
                try{
                    stat.close();
                }
                catch (SQLException e){
                    System.out.println("Error "+e);
                }
            }
            if (con != null){
                try{
                    con.close();
                }
                catch (SQLException e){
                    System.out.println("Error"+e);
                }
            }
            //第七步:释放资源,顺序从小到大
        }
    }
}
/*
输出:
1003	Rykony	19	male	class4	
1004	si	20	female	class1	
1005	wu	19	male	class3	
1006	liu	18	male	class4	
1007	qi	19	female	class3	
1008	ba	17	female	class1	
1009	jiu	20	male	class2	
1001	yi	18	female	class2	
1002	er	18	female	class4	
1010	shi	2	robot	class2	
*/

简单用户登录程序

用户信息表 

代码

import java.sql.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class LoginTest {
    public static void main(String[] args) {
        Map<String,String> LoginIn = INIT();
        boolean CanIn = login(LoginIn);
        System.out.println(CanIn?"Success!":"Try again?");
    }
    private static boolean login(Map<String,String> LoginIn) {
        boolean CanIn = false;
        Connection con = null;
        PreparedStatement pre = null;
        ResultSet re = null;
        try{
            Class.forName("com.mysql.cj.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","root");
            String sql = "select * from login where Name=? and Password=?;";
            //一个?表示一个占位符,之后接收的数据会放置在?的位置上
            pre = con.prepareStatement(sql);
            pre.setString(1,LoginIn.get("Name"));
            pre.setString(2,LoginIn.get("Password"));
            //接收输入数据,第一个数字为将内容填在第几个?处,后面为填入的信息
            re = pre.executeQuery();
//            if (re.next()) CanIn = true;
            CanIn = re.next();
            //在数据库中查找是否存在可满足的输入,有就返回true
        }
        catch(ClassNotFoundException | SQLException e){
            System.out.println("Error "+e);
        }
        finally {
            if (re != null){
                try{
                    re.close();
                }
                catch (SQLException e){
                    System.out.println("Error "+e);
                }
            }
            if (pre != null){
                try{
                    pre.close();
                }
                catch (SQLException e){
                    System.out.println("Error "+e);
                }
            }
            if (con != null){
                try{
                    con.close();
                }
                catch (SQLException e){
                    System.out.println("Error "+e);
                }
            }
        }
        return CanIn;
    }
    private static Map<String,String> INIT(){
        Scanner scanner = new Scanner(System.in);
        System.out.print("UserName : ");
        String Name = scanner.nextLine();
        System.out.print("PassWord : ");
        String ps = scanner.nextLine();
        //输入信息
        Map<String,String> LoginIn = new HashMap<>();
        LoginIn.put("Name",Name);
        LoginIn.put("Password",ps);
        return LoginIn;
    }
}

结果 

 可以发现代码中的Statement换成了prepareStatement,这个接口可以减少SQL编译次数,提高效率,同时提高安全性,避免SQL注入现象

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

 Druid优化JDBC

通过上面的代码不难看出来,我们每进行一次语句操作都要注册一次驱动,建立一次连接,这既浪费了时间又浪费了资源。所以我们需要通过连接池预先同数据库建立一些连接,并放在内存中,当应用程序需要建立数据库连接时,可以直接到连接池中申请一个,用完后再放回去,这样极大的提高了数据库连接的性能问题,节省了资源和时间。

Apache Druid是一个实时分析型数据库,旨在对大型数据集进行快速的查询分析("OLAP"查询)。Druid最常被当做数据库来用以支持实时摄取、高性能查询和高稳定运行的应用场景,同时,Druid也通常被用来助力分析型应用的图形化界面,或者当做需要快速聚合的高并发后端API,Druid最适合应用于面向事件类型的数据。

druid-1.2.9.jar druid包1.2.9版本下载

 下载完别忘了导入包

Druid优化后的JDBC代码

import com.alibaba.druid.pool.DruidDataSourceFactory;

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

public class Try {
    public static void main(String[] args){
        Connection con = null;
        Statement stat = null;
        ResultSet rs = null;
        Properties pro = new Properties();
        InputStream is = Try.class.getClassLoader().getResourceAsStream("Druid.properties");
        try {
            pro.load(is);
            DataSource ds = DruidDataSourceFactory.createDataSource(pro);
            con = ds.getConnection();
            //前两步
            String sql = "select sid,sname,age,sex,classname from stu;";                  //查看
            //第三步:编写sql语句,语法与sql语句一摸一样,不要忘了分号
            stat = con.createStatement();
            //第四步:获取数据库操作对象(statement专门执行sql语句)
            rs = stat.executeQuery(sql);
            //第五步:执行上面编写的sql语句
            while (rs.next()){
                for (int i=1;i<6;i++){
                    String op = rs.getString(i);
                    System.out.print(op+'\t');
                }
                System.out.println();
            }
        }
        catch (Exception e){
            System.out.println("Error "+e);
        }
        finally {
            if (rs != null){
                try{
                    rs.close();
                }
                catch (SQLException e){
                    System.out.println("Error "+e);
                }
            }
            if (stat != null){
                try{
                    stat.close();
                }
                catch (SQLException e){
                    System.out.println("Error "+e);
                }
            }
            if (con != null){
                try{
                    con.close();
                }
                catch (SQLException e){
                    System.out.println("Error"+e);
                }
            }
            //第七步:释放资源,顺序从小到大
        }
    }
}
/*
输出:
5月 03, 2023 3:13:41 下午 com.alibaba.druid.pool.DruidDataSource info
信息: {dataSource-1} inited
1003	Rykony	19	male	class4	
1004	si	20	female	class1	
1005	wu	19	male	class3	
1006	liu	18	male	class4	
1007	qi	19	female	class3	
1008	ba	17	female	class1	
1009	jiu	20	male	class2	
1001	yi	18	female	class2	
1002	er	18	female	class4	
1010	shi	2	robot	class2	
*/

Druid.properties文件内容

driverClassName = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/test
username = root
password = root
initialSize = 10
#初始化连接数量
maxActive = 10
#最大连接数
maxWait = 5000
#最大等待时间(毫秒)

 引用文章

Java中JDBC的超详细总结_竹蜻蜓飞行的博客-CSDN博客

JDBC连接Mysql数据库详解 - 知乎 (zhihu.com)

感谢观看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值