JDBC原理及常见错误分析

1.JDBC:Java DataBase Connectivity 可以为多种关系型数据库DBMS 提供统一的访问方式,用Java来操作数据库

2.JDBC API 主要功能:

三件事,具体是通过以下类/接口实现:

DriverManager : 管理jdbc驱动

Connection: 连接(通过DriverManager产生)

  • Statement(PreparedStatement) :增删改查 (通过Connection产生 )
  • CallableStatement : 调用数据库中的 存储过程/存储函数 (通过Connection产生 )

Result :返回的结果集 (上面的Statement等产生 )

Connection产生操作数据库的对象:

  • Connection产生Statement对象:createStatement()
  • Connection产生PreparedStatement对象:prepareStatement()
  • Connection产生CallableStatement对象:prepareCall();

Statement操作数据库:

增删改:executeUpdate()

查询:executeQuery();

ResultSet:保存结果集 select * from xxx

next():光标下移,判断是否有下一条数据;true/false

previous(): true/false

getXxx(字段名|位置):获取具体的字段值

PreparedStatement操作数据库:

public interface PreparedStatement extends Statement 

因此

增删改:executeUpdate()

查询:executeQuery();

--此外

赋值操作 setXxx();

PreparedStatement与Statement在使用时的区别:

1.Statement:

sql

executeUpdate(sql)

2.

PreparedStatement:

sql(可能存在占位符?)

在创建PreparedStatement 对象时,将sql预编译 prepareStatement(sql)

executeUpdate()

setXxx()替换占位符?

推荐使用PreparedStatement:原因如下:

1.编码更加简便(避免了字符串的拼接)

String name = "zs" ;
int age = 23 ;

stmt:
String sql =" insert into student(stuno,stuname) values(‘"+name+"‘, "+age+" ) " ;
stmt.executeUpdate(sql);

pstmt:
String sql =" insert into student(stuno,stuname) values(?,?) " ;
pstmt = connection.prepareStatement(sql);//预编译SQL
pstmt.setString(1,name);
pstmt.setInt(2,age);

2.提高性能(因为 有预编译操作,预编译只需要执行一次)

需要重复增加100条数

stmt:
String sql =" insert into student(stuno,stuname) values(‘"+name+"‘, "+age+" ) " ;
for(100)
stmt.executeUpdate(sql);

pstmt:
String sql =" insert into student(stuno,stuname) values(?,?) " ;
pstmt = connection.prepareStatement(sql);//预编译SQL
pstmt.setString(1,name);
pstmt.setInt(2,age);
for( 100){
pstmt.executeUpdate();
}

3.安全(可以有效防止sql注入)

sql注入: 将客户输入的内容 和 开发人员的SQL语句 混为一体

stmt:存在被sql注入的风险

(例如输入 用户名:任意值 ‘ or 1=1 --

密码:任意值)

分析:

select count(*) from login where uname=‘任意值 ‘ or 1=1 --‘ and upwd =‘任意值‘ ;

select count(*) from login where uname=‘任意值 ‘ or 1=1 ;

select count(*) from login ;

select count(*) from login where uname=‘"+name+"‘ and upwd =‘"+pwd+"‘

pstmt:有效防止sql注入

推荐使用pstmt

3.jdbc访问数据库的具体步骤:

  • 导入驱动,加载具体的驱动类
  • 与数据库建立连接
  • 发送sql,执行
  • 处理结果集 (查询)

4.
数据库驱动
驱动jar               具体驱动类                                                                                连接字符串

MySQL               mysql-connector-java-x.jar com.mysql.jdbc.Driver                   jdbc:mysql://localhost:3306/数据库实例名

使用jdbc操作数据库时,如果对数据库进行了更换,只需要替换:驱动、具体驱动类、连接字符串、用户名、密码

5.

测试JDBC基本功能代码

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

public class JDBCDemo {
    private static final String URL = "jdbc:mysql://localhost:3306/mydatabase?serverTimezone=GMT%2B8";
    private static final String USERNAME = "root";
    private static final String PWD = "password";

    public static void update() throws ClassNotFoundException, SQLException {// 增删改
        // a. 导入驱动,加载具体的驱动类
        Class.forName("com.mysql.cj.jdbc.Driver");
        // b.与数据库建立连接
        Connection connection = DriverManager.getConnection(URL, USERNAME, PWD);
        // c.发送sql,执行增删改查
        Statement stmt = connection.createStatement();
        //增加  String sql = "insert into student values(2,‘李四‘,21)";
        //修改  String sql = "update student set name=‘张三‘  where id=1";
        //删除
        String sql = "delete from student where id=1";
        int count = stmt.executeUpdate(sql);
        if (count > 0) {
            System.out.println("操作成功!");
        }
        stmt.close();
        connection.close();

    }
    public static void query() throws ClassNotFoundException, SQLException {// 增删改
        // a. 导入驱动,加载具体的驱动类
        Class.forName("com.mysql.cj.jdbc.Driver");
        // b.与数据库建立连接
        Connection connection = DriverManager.getConnection(URL, USERNAME, PWD);
        // c.发送sql,执行增删改[查]
        Statement stmt = connection.createStatement();
        char stuname=‘a‘;
        //模糊查询
        String sql = "select id,name,age from student where name like ‘%"+stuname+"%‘";
        ResultSet rs=stmt.executeQuery(sql);
        //int count = stmt.executeUpdate(sql);
        while (rs.next()) {
            int id=rs.getInt("id");
            String name=rs.getString("name");
            int age=rs.getInt("age");
            System.out.println(id+"--"+name+"--"+age);

        }
        rs.close();
        stmt.close();
        connection.close();

    }
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
//        update();
        query();
    }
}

错误记录:

Exception in thread "main" java.sql.SQLException: The server time zone value ‘?й???????‘ is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:76)
    at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:835)
    at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:455)
    at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:240)
    at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:199)
    at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:677)
    at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:228)
    at JDBCDemo.query(JDBCDemo.java:35)
    at JDBCDemo.main(JDBCDemo.java:57)

解决办法

在连接数据库的URL结尾添加 ?serverTimezone=GMT%2B8 即可

原文地址:https://www.cnblogs.com/deepend/p/12249997.html

时间: 2024-08-29 19:01:21

JDBC原理及常见错误分析的相关文章

Atitit.angular.js 使用最佳实践 原理与常见问题解决与列表显示案例 attilax总结

Atitit.angular.js 使用最佳实践 原理与常见问题解决与列表显示案例 attilax总结 1. 本文范围 1 2. Angular的优点 1 2.1. 双向数据绑定 1 2.2. dsl化 2 2.3. 依赖注入 2 2.4. 指令 2 3. 手动绑定数据spa方式以及与ajax 与dwr的集成 2 4. 格式化数据 2 4.1. 多字段组合格式化 3 4.2. 输出html 4 5. 输出作为函数参数调用 4 6. 加载完成事件 5 7. 常见错误 5 7.1. Atitit.a

IOS常见错误分析解决(一直更新) 你值得收藏-综合贴

-来自收藏总结 综合了好多的常见错误 1:clang failed with exit code 254 一:检测代码中 是否 有 NSLog 打印了 返回 void 的值. 2:Verify exit code of build task with internal identifier 'CopyPNGFile 123.png' 一:将出错的png,用PhotoShop重新转换一次,  如果PhotoShop打不开,改后缀为Jpg 试试. 转换时,请使用 :存储为Web或设备所使用的格式格式

java篇之JDBC原理和使用方法

JDBC学过但又属于很容易忘记的那种,每次要用到,都要看下连接模式.每次找又很费时间,总之好麻烦呀呀呀,所以写篇博客,总结下原理和常用接口,要是又忘了可以直接来博客上看,嘿嘿. 一.什么是JDBC 1.JDBC全称是 Java DataBase Connectivity,可以为多种关系型数据库DBMS提供统一的访问方式,主要目的是用Java来操作数据库. 2.JDBC API主要负责三个功能:(1)与数据库建立连接(2)发送SQL语句给数据库(3)数据库将结果返回 具体过程大致是这样子的: 3.

简述JDBC原理 + 在JAVA中异常是什么 + throws 与 throw 区别 + 简单解释以下JAVA中的多态

JDBC原理: 加:加载驱动 链:创建连接 预:创建预编译 执:执行SQL语句(查询需要处理结果级) 释:关闭链接: DBC中定义了一些接口:  1.驱动管理:  DriverManager  2.连接接口  Connection  DatabasemetaData  3.语句对象接口  Statement  PreparedStatement  CallableStatement  4.结果集接口  ResultSet  ResultSetMetaData JDBC只定义接口,具体实现由各个数

MySQL崩溃恢复过程常见错误分析

最近在和一个同事争论MySQL崩溃恢复中的一些常见错误时出现了一些分歧,他认为一些参数的设置会导致MySQL出现崩溃后恢复不起来的问题,但对此,我却不认同,虽然一些参数的设定会导致数据丢失,但应该不会引起数据库崩溃之后无法恢复的情况,因此,就想整理出MySQL崩溃恢复的过程来加深学习! 图一 mysql WAL过程 在正常情况下,数据写入会先写入redo_buffer_pool,然后在写入redo_log_file,这中间如果由于参数设置不当,可能会发生丢失,但不影响主机的崩溃恢复,但有以下两种

JDBC原理

JDBC是什么: Java Database Connectivity:Java访问数据库的解决方案 JDBC是Java应用程序访问数据库的里程碑式解决方案.Java研发者希望用相同的方式访问不同的数据库,以实现与具体数据库无关的Java操作界面. JDBC定义了一套标准接口,即访问数据库的通用API,不同的数据库厂商根据各自数据库的特点去实现这些接口. JDBC只定义接口,具体实现由各个数据库厂商负责. 程序员使用时只需要调用接口,实际调用的是底层数据库厂商的实现部分. 图-2 通过JDBC访

P2P的原理和常见的实现方式(为libjingle开路)

为了项目的后期IM应用,最近在研究libjingle,中间看了也收集了很多资料,感慨网上很多资料要么太过于纠结协议(如STUN.ICE等)实现细节,要么中间有很多纰漏.最后去伪存真,归纳总结了一下,希望对以后的同行有些许帮助.? ?如果有什么需要讨论或者指正的,欢迎留言或者邮件[email protected] ? ? ? ? ? ? ? ? ? ? ? ? ? ? P2P实现的原理 首先先介绍一些基本概念: ???NAT(Network Address Translators),网络地址转换:

JDBC 5中常见数据的连接获取

JDBC在开发中很少直接使用(持久化层有许多杰出的框架,如:Hibernate.mybatis...),但这又是Java程序员必须清楚的基础知识,下面是一些知识的基类,方便以后复习时使用. Java对数据库的操作主要以下几步 1)加载驱动,获取数据库连接 2)开启事务 3)创建语句 4)批量执行操作或执行查询获取结果集,处理结果 5)提交事务 6)关闭连接 第一步:加载驱动类,获取数据库连接,条件是要有对应的第三方jar包 1).Sqlserver ,需要 sqljdbc4.jar try {

ELK常见错误分析(转)

ELK 常见错误处理 ELK 这里就不介绍了,如何安装请参考博客之前的文章.在这里感谢ttlsa团队,同时,我很荣幸能加入到ttlsa团队中,分享点滴,凉白开说发文章有红包,期待这篇群主能给多少红包.哈哈. 好了,不闲扯,下面总结下ELK使用过程中遇到的常见问题以及解决方案. 1. Kibana No Default Index Pattern Warning 当访问kibana页面时,出现下面的信息: Warning No default index pattern. You must sel