Java JDBC学习

JDBC

什么是JDBC

Java Database Connectivity ,Java连接数据库的规范(标准),可以使用Java语言连接数据库完成CRUD操作。

JDBC核心思想

Java中定义了访问数据库的接口,可以为多种关系型数据库提供统一的访问方式。由数据库厂商提供驱动实现类(Driver数据库驱动)。

JDBC API

在这里插入图片描述

JDBC开发步骤

1.注册驱动

    Class.forName("com.mysql.jdbc.Driver");手动加载字节码文件到JVM中。

2.连接数据库

通过DriverManagergeConectionurl,user,pasword)获取数据库连接对象

DriverManager.getConnection("jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf8","root","123456");

URL(Uniform Resource Locator)统一资源定位符∶由协议、IP、端口、SID(程序实例名称)组成

3.获取发送SQL的对象

通过Connection对象获得Statement对象,用于对数据库进行通用访问。

  Statement statement=connection.createStatement();

4.执行SQL语句

执行SQL语句,并接收执行结果

int result=statement.executeUpdate(sql);//sql是字符串类型的SQL语句

5.释放资源

  statement.close();
  connection.close();

6.示例

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class Demo1 {
    public static void main(String[] args) throws Exception{
        //注册驱动 加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        //获得连接
        Connection connection= DriverManager
                .getConnection("jdbc:mysql://localhost:3306/mydatabase"
                        , "root"
                        ,"123456");
        if (connection!=null){
            System.out.println("连接数据库成功");
        }else {
            System.out.println("连接失败");
        }
        Statement statement=connection.createStatement();
        String sql="insert into student (stuid,stuname,age) values(1001,'java',12)";
        int count=statement.executeUpdate(sql);
        System.out.println(count);
      
    }
}

数据结果

连接数据库成功
1

ResultSet(结果集)

在执行查询SQL后,存放查询到的结果集数据。

1.接受收结果集

ResultSet rs=statement.executeQuery(sql);

2.遍历ResultSet中的元素

他是

3.常见错误

在这里插入图片描述

SQL注入问题

用户输入的数据中有SQL的关键字或语法并且参与了SQL语句的编译,导致SQL语句编译后的条件含义为true,一直得到正确结果,就是SQL注入

如何避免

由于编写的SQL 语句是在用户输入数据,整合后再进行编译。所以为了避免SQL注入的问题,我们要使SQL语句在用户输入数据前就已进行编译成完整的SQL 语句,再进行填充数据。

PreparedStatement

PreparedStatement继承了Statement接口,执行SQL语句的方法无异。

PreparedStatement的应用

作用:

  • 预编译SQL语句,效率高。
  • 安全,避免SQL注入。
  • 可以动态的填充数据,执行多个同构的SQL语句
1.参数标记
PreparedStatement pstmt = conn.prepareStatement('select* from user where username=? and password=?");


注意∶JDBC中的所有参数都由?符号占位,这被称为参数标记。在执行SQL语句之前,必须为每个参数提供值。

2.动态参数绑定
pstmt.setXxx(下标,值) 

注:下标从1开始

在这里插入图片描述
在这里插入图片描述

封装工具类

  • 为了方便使用,在实际JDBC的使用中,存在着大量的重复代码∶例如连接数据库、关闭数据库等这些操作!
  • 我们需要把传统的JDBC代码进行重构,抽取出通用的JDBC工具类!以后连接任何数据库、释放资源都可以使用这个工具类。

1、重用性方案

封装获取连接、释放资源两个方法。

  • 提供public static Connection getConnection()方法。
  • 提供public staticvoid closeAll(Connection conn, Statement sm, ResultSet rs)得方法。

实现

import java.sql.*;

public class DBUtils {
    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");//运行一次后之后不在执行了
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    public static Connection getConnection()  {
        Connection connection=null;
        try {

            connection= DriverManager
                    .getConnection("jdbc:mysql://localhost:3306/mydatabase"
                            , "root"
                            ,"123456");
        } catch (Exception e) {
            e.printStackTrace();
        }

        return connection;
    }
    public static void closeAll(Connection connection, Statement statement, ResultSet resultSet){

            try {
                if(resultSet!=null){
                resultSet.close();
                }
                if (statement!=null){
                    statement.close();
                }
                if(connection!=null){
                    connection.close();
                }

            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
}


Date工具类

现有问题∶数据库存储的数据类型为java.sqL.Date。而我们Java应用层存储日期类型为java.util.Date。当我们用Java应用程序插入带有日期的数据到数据库中时,需要进行转换。

SinpleDateFormat

格式化和解析日期的具体类。允许进行格式化(日期>文本)、解析(文本>日期))和规范化。

转换方法

package com.qf.person;

import java.text.SimpleDateFormat;

public class TestTimes {
    public static void main(String[] args)throws Exception {
        //获得当前系统的日期时间
        System.out.println(new java.util.Date());
        //字符串:自定义日期
        String str="1999-09-09";

        //将字符串转换成Util.Date
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        //parse方法转换为util.Date
        java.util.Date date = sdf.parse(str);
        System.out.println(date);
        //format方法转换为String类型
        String dates = sdf.format(new java.util.Date());
        System.out.println(dates);
        //sql.Date 不支持字符串转换  只支持毫秒值创建
        //通过util.Date拿到指定日期的毫秒值,转换为sql.Date
        java.sql.Date sqlDate =  new java.sql.Date(date.getTime());
        System.out.println(sqlDate);
    }
}

封装

package com.qf.person;

import java.text.ParseException;
import java.text.SimpleDateFormat;

public class DateUtils {
    private static  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    //1.字符串转换为util.Date
    public static java.util.Date strToUtil(String str){
        try {
            java.util.Date date = sdf.parse(str);
            return date;
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
    //2.util.Date转换为sql.Date
    public static java.sql.Date utilToSql(java.util.Date date){
        return new java.sql.Date(date.getTime());
    }
    //3.util.Date转换为字符串形式
    public static String utilToStr(java.util.Date date){
        return sdf.format(date);
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值