一.JDBC基础
1.跨平台性。面向接口编程。
2.SUN提供的JDBC可以完成以下三个基本工作:建立与数据库的连接;执行SQL语句;获得SQL语句的执行结果。
3.数据库驱动程序是JDBC程序和数据库之间的转换层,数据库驱动程序负责将JDBC调用映射成特定的数据库调用。
二.SQL语法
1.mysql默认以分号作为每条命令的结束符。
2.InnnoDB提供事务安全的存储机制。InnoDB通过建立行级锁来保证事物完整性,并以Oracle风格的共享锁来处理Select语句。
3.语句基础:
DML,数据操作语言,insert,update,delete
DDL,数据定义语言,create,alter,drop,truncate
DCL,数据控制语言,grant,revoke
事务控制语句:commit,rollback,savepoint
不区分大小写。
4.MySQL常见命令:
show databases;
drop database 数据库名;
use 数据库名;
show tables;
desc 表名
5.数据库对象
6.约束
•大部分数据库支持下面五类完整性约束:
–NOT NULL:非空约束,指定某列不能为空。
–UNIQUE:唯一约束,指定某列或者几列组合不能重复。
–PRIMARY KEY:主键,指定该列的值可以唯一地表示该条记录。
–FOREIGN KEY:外键,指定该行记录从属于主表中的一条记录,主要用于保证参照完整性。
–CHECK:检查,指定一个布尔表达式,用于指定对应列的值必须满足该表达式。
7.索引:是存放在模式中的一个数据库对象,虽然索引总是从属于数据库,但它也和数据表一样,属于数据库对象,创建索引唯一的作用就是加速对表的查询,索引通过使用快速路径的访问方法来快速定位数据,从而减少了磁盘的I/O。
•创建索引有两种方式:
–自动:当在表上定义主键约束、唯一约束和外键约束时,系统会为该数据列自动创建对应的索引。
–手动:用户可以手动创建索引来加速查询。
•删除索引也有两种方式:
–自动:数据表被删除时,该表上的索引自动被删除。
–手动:用户可以手动删除指定数据表上的指定索引。
8.视图:视图看上去非常像一个数据表,但它不是数据表,因为它并不能存储数据,视图只是一个或多个数据表中数据的逻辑显示。
好处:可以限制对数据的访问;可以使复杂的查询变的简单;提供了数据的独立性;提供了对相同数据的不同显示。
9.特殊比较运算符
10.子查询就是指在查询语句中嵌套另一个查询语句,子查询可以支持多层嵌套。对于一个普通查询语句而言,子查询可以出现在两个位置:
---出现在from语句后当成数据表,这种用法也被称为行内视图,因为该子查询的实质就是一个临时试图;
---出现在where条件后作为过渡条件的值。
注意点:
–子查询要用括号括起来。
–子查询当成数据表时,可以为该子查询起别名,尤其是要作为前缀来限定数据列时,必须给子查询起别名。
–子查询当过滤条件时,将子查询放在比较运算符的右边,这样可以增强查询的可读性。
–子查询当过滤条件时,单行子查询使用单行运算符,多行子查询使用多行运算符。
三.JDBC
1.JDBC常用接口和类
•DriverManager
•Connection
•Statement
•PreparedStatement
•ResultSet
2.JDBC编程步骤:
•(1)加载数据库驱动。
•(2)通过DriverManager获取数据库连接。
•(3)通过Connection对象创建Statement对象。
•(4)使用Statement执行SQL语句。所有Statement都有如下三个方法来执行SQL语句。
•(5)操作结果集。如果执行的SQL语句是查询语句,执行结果将返回一个ResultSet对象,该对象里保存了SQL语句查询的结果。程序可以通过操作该ResultSet对象来取出查询结果。
3.JDBC执行SQL语句的方式
•使用executeUpdate执行DDL和DML语句
•使用execute方法执行SQL语句
•使用executeQuery方法执行查询语句
4.PreparedStatement
•JDBC提供了PreparedStatement接口,它是Statement接口的子接口,它可以预编译SQL语句,预编译后的SQL语句被存储在PreparedStatement对象中。然后可以使用该对象多次高效地执行该语句。简而言之,使用PreparedStatement比使用Statement的效率要高。
•使用PreparedStatement比使用Statement多了如下三个好处:
–PreparedStatement预编译SQL语句,性能更好。
–PreparedStatment无需“拼接”SQL语句,编程更简单。
–PreparedStatement可以防止SQL注入,安全性更好。
5.CallableStatement
•调用存储过程使用CallableStatement,可以通过Connection的prepareCall方法来创建CallableStatement对象,创建该对象时需要传入调用存储过程的SQL语句,调用存储过程的SQL语句总是这种格式:{call 过程名(?,?,?...)},其中的问号作为存储过程参数的占位符。
•存储过程的参数既有传入参数,也有传出参数。所谓传入参数就是Java程序必须为这些参数传入值,那么可以通过CallableStatement的setXxx方法为传入参数设置值;所谓传出参数就是Java程序可以通过该参数获取存储过程里的值,那么CallableStatement需要调用registerOutParameter方法来注册该参数
6.处理Blob类型数据
•所以将Blob数据插入数据库需要使用PreparedStatement,该对象有一个方法:setBinaryStream(int parameterIndex, InputStream x),该方法可以为指定参数传入二进制输入流,从而可以实现将Blob数据保存到数据库的功能。
•当我们需要从ResultSet里取出Blob数据时,可以调用ResultSet的getBlob(int columnIndex)方法,该方法将返回一个Blob对象,Blob对象提供了getBinaryStream方法来获取该Blob数据的输入流,也可使用Blob对象提供的getBytes方法直接取出该Blob对象封装的二进制数据。
7.使用ResultSetMetaData
•ResultSet里包含一个getMetaData()方法,该方法返回该ResultSet对应的ResultSetMetaData对象。一旦获得了ResultSetMetaData对象,就可通过ResultSetMetaData提供的大量的方法来返回ResultSet的描述信息,常用的方法有如下三个:
–int getColumnCount():返回该ResultSet的列数量。
–String getColumnName(int column):返回指定索引的列名。
–int getColumnType(int column):返回指定索引的列类型。
8.事务
•事务是由一步或几步数据库操作序列组成的逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行。程序和事务是两个不同的概念。一般而言:一段程序中可能包含多个事务。
•事务具备四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、和持续性(Durability)。这四个特性也简称为ACID性。
–原子性(Atomicity)
–一致性(Consistency)
–隔离性(Isolation)
–持续性(Durability)
9.批量更新
•JDBC还提供了一个批量更新的功能,使用批量更新时,多条SQL语句将会被作为一批操作被同时收集、并同时提交。
•批量更新必须得到底层数据库的支持,可以通过调用DatabaseMetaData的supportsBatchUpdates方法来查看底层数据库是否支持批量更新。
•使用批量更新也需要先创建一个Statement对象,然后利用该对象addBatch方法将多条SQL语句同时收集起来,最后调用Statement对象的executeBatch同时执行这些SQL语句。
10.DatabaseMetaData
•JDBC提供了DatabaseMetaData来封装数据库连接对应数据库的信息,通过Connection提供的getMetaData()方法就可以获取到数据库对应的DatabaseMetaData对象。
•许多DatabaseMetaData方法以 ResultSet 对象的形式返回查询的信息,使用ResultSet的常规方法(例如getString 和 getInt)即可从这些ResultSet对象中获取数据。如果查询的信息不可用,则将返回一个空ResultSet对象。
•很多DatabaseMetaData方法都需要传入一个xxxPattern的模式字符串,这里的xxxPattern不是正则表达式,而是SQL里的模式字符串,即用百分号(%)代表任意多个字符,使用下划线(_)代表一个字符。通常情况下,如果把该模式字符串参数值设置为null,即表明该参数不作为过滤条件。
11.数据库连接池
•数据库连接池的解决方案是:当应用程序启动时,系统主动建立足够的数据库连接,并将这些连接组成一个连接池。每次应用程序请求数据库连接时,无需重新打开连接,而是从池中取出已有的连接使用,使用完后,不再关闭数据库连接,而是直接将该连接归还给连接池。通过使用连接池,将大大提高程序运行效率。
•数据库连接池的常用参数有如下:
–数据库的初始连接数。
–连接池的最大连接数。
–连接池的最小连接数。
连接池的每次增加的容量
12.两种常见的开源数据源
•DBCP是Apache软件基金组织下的开源连接池实现,该连接池依赖该组织下的另一个开源系统:common-pool。
•相比之下,C3P0数据源性能更胜一筹,Hibernate就推荐使用该连接池。C3P0连接池不仅可自动清理不再使用的Connection,还可以自动清理Statement和ResultSet。C3P0连接池需要版本为1.3以上的JRE,推荐使用1.4以上的JRE。