数据库JDBC知识概括
JDBC简介
JDBC概述:
- JDBC是sun公司提供的一套独立于数据库的通用SQL数据库存取h额操作的公共接口和规范,用来实现与数据库连接的。因此各大数据库厂商,需要针对这套接口,提供不同的实现类,即不同的的数据库驱动。
JDBC程序编写步骤:
获取数据库连接:
- 获取数据库连接,我们需要四个基本信息:
①数据库连接地址 Url
②连接用户名 User
③连接密码 Password
④数据库驱动 DriverName - 一般我们把这四个基本配置信息写在properties文件中。而不是硬编码写在代码中。这样:
①减少代码与配置信息的耦合度
②当需要重新打包时直接修改配置文件即可,而不用重新编译打包
使用PreparedStatement实现CRUD操作
使用Statement操作数据表的弊端:
- 存在拼串操作,繁琐
- 存在SQL注入问题
PreparedStatement介绍:
- 可以通过调用 Connection 对象的 preparedStatement(String sql)方法获取 PreparedStatement 对象
- PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句
- PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示,调用 PreparedStatement 对象的 setXxx() 方法来设置这些参数. setXxx() 方法有两个参数,第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始),第二个是设置的 SQL 语句中的参数的值
PreparedStatement vs Statement对比:
- 代码的可读性和可维护性。
- PreparedStatement 能最大可能提高性能:
①DBServer会对预编译语句提供性能优化。因为预编译语句有可能被重复调用,所以语句在被DBServer的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行。
②在statement语句中,即使是相同操作但因为数据内容不一样,所以整个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存。这样每执行一次都要对传入的语句编译一次。
③ (语法检查,语义检查,翻译成二进制命令,缓存) - PreparedStatement 可以防止 SQL 注入
JDBC详解
资源释放:
- 释放ResultSet, Statement,Connection。
- 数据库连接(Connection)是非常稀有的资源,用完后必须马上释放,如果Connection不能及时正确的关闭将导致系统宕机。Connection的使用原则是
尽量晚创建,尽量早的释放。
- 可以在finally中关闭,保证及时其他代码出现异常,资源也一定能被关闭。
java 中#{}与${}的区别:
- #{}: 表示一个占位符号,实现向PreparedStatement占位符中设置值(#{}表示一个占位符?),自动进行Java类型到JDBC类型的转换(因此#{}可以有效防止SQL注入).#{}可以接收简单类型或PO属性值,如果parameterType传输的是单个简单类型值,#{}花括号中可以是value或其它名称.
- $ {}: 表示替换SQL字符串,通过${}可将parameterType内容拼接在SQL中而不进行JDBC类型转换,${}可以接收简单类型或PO属性值,如果parameterType传输的是单个简单类型值,${}花括号中只能是value.
为什么#{}能预防SQL注入:
- 其实是因为SQL语句在程序运行前已经进行了预编译,在程序运行时第一次操作数据库之前,SQL语句已经被数据库分析,编译和优化,对应的执行计划也会缓存下来并允许数据库已参数化的形式进行查询,当运行时动态地把参数传给PreprareStatement时,即使参数里有敏感字符如 or '1=1’也数据库会作为一个参数一个字段的属性值来处理而不会作为一个SQL指令,如此,就起到了防止SQL注入的作用了!
- 注意:虽然${}不能防止SQL注入,但有时${}会非常方便(如order by排序,需要将列名通过参数传入SQL,则用ORDER BY${column},使用#{}则无法实现此功能。
JDBC API小结:
- 两种思想:
①面向接口编程的思想
②ORM思想(object relational mapping)
<1>一个数据表对应一个java类
<2>表中的一条记录对应java类的一个对象
<3>表中的一个字段对应java类的一个属性
1、sql是需要结合列名和表的属性名来写。注意起别名。 - 两种技术:
①JDBC结果集的元数据:ResultSetMetaData
<1>获取列数:getColumnCount()
<2>获取列的别名:getColumnLabel()
②通过反射,创建指定类的对象,获取指定的属性并赋值
操作BLOB类型字段:
- MySQL中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据。
- 插入BLOB类型的数据必须使用PreparedStatement,因为BLOB类型的数据无法使用字符串拼接写的。
- MySQL的四种BLOB类型(除了在存储的最大信息量上