零基础入门JDBC-Java数据库连接

数据库实现了数据的持久化,但我们最终要在程序里处理数据啊,那java代码中怎么去访问数据库读写数据呢?这就要用到sun公司设定的一套数据库标准了,这套标准就是JDBC(Java Database Connectivity)。但它只是规范,不做具体实现。于是数据库厂商又根据JDBC标准,实现自家的驱动Driver。如:mysql驱动com.mysql.cj.jdbc.Driver,Oracle的驱动oracle.jdbc.OracleDriver。有了这套解决方案,java就可以访问数据库中的数据了。

如有问题可以观看视频:

https://www.bilibili.com/video/BV1Bt41137iB

Java中提倡面向接口开发,而最经典的接口设计莫过于JDBC数据库接口。

Connection链接、Statement语句、PreparedStatement预处理语句、CallableStatement存储过程、ResultSet结果集。

调用方式有三种:

Statement语句、PreparedStatement预处理语句、CallableStatement存储过程,推荐使用第二种PreparedStatement,防止SQL注入,其也是预编译性能高。

使用步骤

导入jar包(丰富的工具类)

获取和数据库的连接(用户名、密码)

通过程序执行SQL

通过程序处理结果

idea 创建项目并导入jar包

创建stage2 Java工程

创建lib目录,拷贝驱动objbc6-11.1.0.7.0到lib目录下

项目引用这个外部jar包

入门案例

SQL注入

SQL注入的解决方案

JDBC常见问题

Class.forName这句话有用没?

Class.forName可以指定class类路径进行动态创建对象实例,可JDBC这句话没有返回对象啊,那写这句有什么作用呢?看看java.sql.Driver.class的源码就找到真相了,原来它用了静态代码块创建对象。

写了创建了,那不写呢?怎么不写也能执行呢?

Java提供了SPI机制,用户可以自行配置类,JDBC高版本驱动就都引入了这个支持。如果用户使用了Class.forName方式就自己指定了驱动,如果未写这句话,则Java自动去META-INF/services/java.sql.Driver文件中找启动类。

驱动版本

不同版本的mysql需要不同版本的驱动

Mysql5.0x mysql-connector-java-5.1.32.jar

Mysql8.0x mysql-connector-java-8.0.21.jar

Driver变成了: com.mysql.cj.jdbc.Driver,中间多了cj

url必须加时区参数: serverTimezone=Asia/Shanghai

中文乱码

url增加参数:characterEncoding=utf8防止中文乱码

SQL注入

利用sql中'单撇是字符串的结束符,or只要一个条件成立其它就不用再判断,而恶意造成sql查询失效,本应该只展示一条数据,结果全部展现。

注入后形成的SQL:

大家试想如果是一个财务表,本你只能看自己的信息,结果你看了所有人的信息。结果新员工比你工资高,你说气人不。

PreparedStatement 语句

SQL注入解决方案:

Statement对象换为PreparedStatement对象

PS后的结果:

利用转义字符,屏蔽了SQL中的恶意字符。不仅解决了sql注入问题,使系统变的安全,PreparedStatement还有个极大的好处,它是预编译的语句,其主干部分mysql进行预编译后缓存,下次这部分就无需在解析,只把条件拼入,这样执行效率远高于statement每次都要编译sql语句。

常见错误

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

错误原因:

1)jar没有导入,没有builder path

2)Class.forName("com.mysql.jdbc.Driver"); 字符串拼写错误

Unknown database mydb;

错误原因:

数据库名称拼写错误

Access denied for user ‘root123’@‘localhost’ (using password: YES)

错误原因:

数据库用户名或者密码错误

Table ‘py-school-db.mydb’ doesn’t exist

错误原因:

表不存在,也可能表名写错了

你可能感兴趣的:(零基础入门JDBC-Java数据库连接)