Java学习1.21————jdbc(一)

jdbc:
通过Java语言来连接数据库的一门技术。
sun公司提供的一套接口规范
如果想要通过jdbc连接mysql,我们需要获得mysql的实现类,称为驱动,其他数据库同理。

一、jdbc编程六个步骤:
1、注册驱动
Class.forName(“全类名”)
例如:
Class.forName(com.mysql.jdbc.Driver)
此时会抛异常,使用try-catch处理

2、获取数据库连接

使用接口Connection:用于特定数据库的连接
Connection connection = DriverManager.getConnection();

在使用getConnection方法之前,需要指定三个参数:url,user,password
例如:
//url 连接数据库的地址
//jdbc:mysql 协议
//localhost 本地ip地址
//3306 mysql默认端口号
String url = “jdbc:mysql://localhost:3306/数据库名”;

//user 用户名
String user = “root”;

//password
String password = “root”;

此时会抛异常,再次使用try-catch或者第一个try-catch中用父类Exception 来接收异常。

3、获取数据库操作对象
根据连接对象来获取
//connection是上面的连接对象
Statement statement = connection.createStatement();
获得这个数据库对象后才能对数据库增删改查

4、写一个sql语句
String sql = “insert into tb_stu(name,age,address)values(‘张三’,20,‘xxx’)”;

5、执行sql语句

//executeUpdate()是用于增删改的方法,即属于数据操纵语言(DML)的都用executeUpdate()
//executeQuery()是用于查询语句的方法,即DQL

//num 影响记录条数
int num = statement.executeUpdate(sql);
//resultSet是一个结果集
ResultSet resultSet = statement.executeQuery(“select * from xxx”);

6、关闭数据库资源
顺序由下往上
statement.close();
connection.close();
注意:如果程序中间出现问题,则数据库资源无法正常关闭,所以关闭数据库资源的代码需要放到finally语句块中。finally要求该资源在公共区域,所以将两个对象提出来:Connection connection = null;Statement statement = null;
此时close会报错,try-catch。

执行增删改的代码

package com.mysql.jdbc;

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

public class Demo01 {

    public static void main(String[] args) {
        Statement statement = null;
        Connection connection = null;

        try {
        	//1、注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
			//url    连接数据库的地址
			//jdbc:mysql     协议
			//localhost		本地ip地址
			//3306				mysql默认端口号
            String url = "jdbc:mysql://localhost:3306/test_stu?serverTimezone=GMT";

            String user = "root";

            String password = "root";
			//2、获取数据库连接
            connection = DriverManager.getConnection(url,user,password);
			//3、获取数据库操作对象
            statement = connection.createStatement();
			//4、写一个sql语句
            String sql = "insert into tb_stu(name,age,address)values('张三',20,'xxx')";
			//5、执行sql语句
			//num    影响记录条数
			//executeUpdate()是用于增删改的方法,即属于数据操纵语言(DML)的都用executeUpdate()
            int num = statement.executeUpdate(sql);

            if(num == 1){
                System.out.println("添加成功");
            }else{
                System.out.println("失败");
            }


        } catch (Exception e) {
            e.printStackTrace();
        }finally {//6、关闭数据库资源
            try {
                statement.close();

            } catch (SQLException throwables) {

                throwables.printStackTrace();
            }
            try {
                connection.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }

        }

    }
}

执行查询的代码

package com.mysql.jdbc;

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

public class Demo02 {

        public static void main(String[] args) throws Exception {
            Statement statement = null;
            Connection connection = null;

            try {
                Class.forName("com.mysql.cj.jdbc.Driver");
				//后面是时区
                String url = "jdbc:mysql://localhost:3306/test_stu?serverTimezone=GMT";

                String user = "root";

                String password = "root";

                connection = DriverManager.getConnection(url,user,password);

                statement = connection.createStatement();

                //查询语句
                String sql = "select * from tb_stu";
				//executeQuery()是用于查询语句的方法,即DQL
				//resultSet是一个结果集
                ResultSet resultSet = statement.executeQuery(sql);

                while(resultSet.next()){
                    String name = resultSet.getString("name");
                    int age = resultSet.getInt("age");
                    String address = resultSet.getString("address");

                    System.out.println(name+ " "+age+" "+address);
                }


            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                try {
                    statement.close();

                } catch (SQLException throwables) {

                    throwables.printStackTrace();
                }
                try {
                    connection.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }

            }
       }

二、把数据库配置信息写到配置文件中

我们一般不会直接写入配置文件,而是将如url,user,password这样的配置信息放到配置文件中,然后读取的。
后缀是.properties
用类 ResoucesBundle进行读取,方法是getBundle();

三、另一个数据库操作对象,statement会造成sql注入,为防止SQL注入,使用另一个数据库操作对象先做预编译,在做执行。

user和password先不传具体的值,进行预编译,?作为占位符。

代码如下

//获取数据库操作对象
        PreparedStatement preparedStatement =
                connection.prepareStatement("select * from tb_user where  user = ? and password = ? ");

        //给占位符赋值
        preparedStatement.setString(1,"jack");
		//password=123
		//1234' or '1'='1' 是SQL注入
        preparedStatement.setString(2,"1234' or '1'='1'");


        ResultSet resultSet = preparedStatement.executeQuery();

        if(resultSet.next()){
                System.out.println("登录成功");
            }else{
                System.out.println("失败");
            }

前面与上面代码块一样,从获取数据库对象开始不同,password设置的值为123,可当我输入的不是123且使用statement时,却登录成功,这是一个漏洞,所以使用preparStatemnet,不会出现这个漏洞。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值