JDBC是一种数据库链接,它是一种可执行SQL语句的Java API。程序能够经过JDBC API链接到关系型数据库,并使用结构化查询语言来完成对数据库的查询,更新。经过使用JDBC,就可使用同一种API访问不一样的数据库系统,开发人员面向JDBC API编写应用程序,而后根据不一样的数据库,安装不一样数据库的驱动程序便可。数据库驱动程序是JDBC程序和数据库之间的转换层,数据库驱动程序负责将JDBC调用映射成特定的数据库调用。当须要链接某个特定的数据库时,必须有相应的数据库驱动程序。JDBC驱动的常见类型:直接与数据库实例交互。这种驱动是智能的,它知道数据库使用的底层协议。这种驱动避开了本地代码,减小了应用开发的复杂性,也减小了产生冲突和出错的可能性。java
程序可使用JDBC API以统一的方式来链接不一样的数据库,而后经过Statement对象来执行标准的SQL语句,并能够得到SQL语句访问数据库的结果。经过使用JDBC,java程序能够很是方便的操做各类主流数据库,因为java语言的跨平台性,可使得JDBC编写的程序不只能够实现跨数据库,还能够垮平台,具备很好的移植性。node
SQL是一种结构化查询语言,是操做和检索关系数据库的标准语言。DML指数据库操做语言,主要由insert 、update 和delete三个关键字完成。DDL是指数据定义语言,操做数据库对象的语句,主要由create、alter、drop和Truncate四个关键字完成,最基本的数据库对象是数据表,数据表表示存储数据的逻辑单元。DCL指数据控制语言,主要由grant和revoke两个关键字完成,DCL语句为数据库用户受权,或收回指定用户权限。mysql
Mysql数据库通常的约束类型:not null;UNIQUE约束(当创建惟一约束时,Mysql在惟一约束所在列或列组合上创建对应的惟一索引)。Primary key:主键约束至关于非空约束和惟一约束的结合,每个表中最多容许有一个主键,但这个主键约束可由多个数据列组合而成。sql
FOREIGN KEY约束:主要用于保证一个或者两个数据表之间的参照完整性,外键是构建于一个表的两个字段或者两个表的两个字段之间的参照关系。当主表的记录被从表记录参照时,主表记录不容许被删除。必须先把从表里全部参照该记录的全部记录所有删除后,才能够删除主表的记录。创建外键约束时,Mysql也会为该列创建索引。外建约束一般用于定义两个实体之间的一对一和一对多的关系。若是要使MySql中的外键约束生效,则应该使用表级约束语法。若是须要显示地指定外键约束的名字,则可使用constraint来指定名字。数据库
若是想定义删除主表记录时,从表记录也会随之删除,则须要创建外键约束后添加 on delete cascade 或添加on delete set null,第一种是指删除主表记录时,参照主表记录的从表记录所有级联删除。第二种是指定当删除主表记录时,把参照该主表记录的从表记录设为null编程
值得指出的是,外键约束不只能够参照其余表,并且能够参照自身,这种参照自身的状况一般被称为自关联。并发
索引:索引是存放在模式(schema)中的一个数据库对象,虽然索引老是从属于数据表,但它也和数据表同样属于数据库对象。建立索引的惟一做用就是加快对表的查询,索引经过使用快速路径访问方法来快速定位数据,从而减小磁盘的I/O;oracle
建立索引的方法:函数
(1) 自动:当在表上定义主键约束,惟一约束和外检约束时,自动建立索引;工具
(2 Create index…语句来建立索引。Create index index_name on
Table_name(column);
(3)Drop index来删除索引;
数据库维护索引须要必定的系统开销,所以建立索引的时候要特别注意,通常对须要常常查询的表字段建立索引。
注意:delete from语句能够一次删除多行,采用where子句来限定。
Select 查询时,后面不只能够是数据列,也能够是表达式,还能够是变量,常量等。对于Mysql而言,若是算术表达式中出现null,将会致使整个算术表达式的返回值为null;所以可使用以下方法,将为null的记录设为0,来进行算术运算:
Select avg(ifnull(java_teacher,0)) fromstudent_table;
注意:
若是须要对分组进行过滤,则应该使用having子句。Having子句和where有些区别:
不能在where子句中过滤组,where子句仅用于过滤行。过滤组必须用having子句;
不能在where子句中使用函数,having子句才可使用函数。
以下语句:
Select* from student_table group by java_teacher having count(*)>2;
外链接: 所谓外链接就是在链接条件的列名后增长括号包起来的外链接符,当外链接符出如今左边时称为左外链接,java培训,出如今右边时称为右外链接。外链接就是在外链接符所在的表中增长一个“万能行”,这行记录的全部数据都是null,并且该行能够与另外一个表中不知足条件的记录进行匹配,经过这种方式就能够把另外一个表中的全部记录选出来,无论这些记录是否知足链接条件。
所谓自链接就是把一个表当成两个表来用,这就须要为一个表起两个别名,并且查询中用的全部数据列都要加表别名前缀,由于两个表的数据列彻底同样。
左,右,全外链接:这三种分别使用left join,right join和full join,这三种外链接的链接条件同样经过on 子句来指定,既能够是等值链接条件,也能够是非等值链接条件。Sql99左外链接将会把左边表中全部不知足链接条件的记录所有列出,右外链接会把右边不知足链接条件的记录所有列出。全外链接会把两个表中全部不知足链接条件的记录所有列出。
JDBC的典型用法
DriverManager:用于管理JDBC的驱动服务类,经过使用该类来获取Connection 对象。Connection :表明数据库链接对象,每一个Connection表明一个物理连结会话。Statement:用于执行SQL语句的工具接口。该对象能够执行DDL和DML语句。PreparedStatement :预编译的Statement对象。该方法返回预编译的Statement对象,即将SQL语句提交到数据库进行预编译。它容许数据库预编译SQL语句,之后每次改变SQL命定的参数,避免数据库每次都要编译SQL语句,所以性能更好。相对statement而言,它执行SQL语句时,无需再传入sql语句,只要为预编译的SQL语句传入参数便可。ResultSet:结果集对象。
JDBC编程的通常步骤:
(1) 加载数据库驱动
Class.forName(driverClass)
Class.forName(“com.mysql.jdbc.Driver”);//加载mysql的驱动代码:
Class.forName(“oracle.jdbc.driver.oracleDriver”);//加载oracle的驱动代码
(2) 经过DriverManager获取数据库链接。
DriverManager.getConnection(String url,String user,String pass);//MySql的URL写法以下:jdbc:mysql://hostname:port/databasename;
使用PreparedStatement相对于Statement来讲,除了能提升执行效率外,还有一个优点,当SQL语句中要使用参数时,无需拼接sql字符串,使用PreparedStatement则只须要使用问号占位符来替代这些参数便可,下降了编程的复杂度,另外还有一个好处---用于防止SQL注入,基本上北京java培训机构里面都会讲这个东西。
好比以下validate()方法使用PreparedStatement来执行验证:
Private Boolean validate(String username,String userpass){
try{
Connection conn=DriverManager.getConnection(url,user,pass);
PreparedStatement pstmt=conn.prepareStatement(
“select * from jdbc_test where jdbc_name=?and jdbc_desc=?”))
{
psmt.setString(1,username);
psmt.setString(2,password);
try(
ResultSet rs=pstmt.executeUpdate())
{
if(rs.next()){
return true;
}
}
Catch(Exceptione){
e.printStackTrace();
}
Returnfalse;
}
Blob:是二进制长对象的意思,一般用于存储大文件。典型的Blob内容是一张图片或者声音文件。
可使用CachedRowSet实现分页。
Mysql中的事物处理:
事物是由一步或几步数据库操做序列所组成的逻辑执行单元,这些系列操做要么所有执行,要么所有放弃,通常而言,一段程序中可能包含多个事务。对于任何数据库而言,事物都是很是重要的,事务是保证底层数据完整的主要手段,没有事物支持的数据库应用,那将很是脆弱。
事物具有四个特性:
原子性:事物是程序中最小的执行单元,不可再分。
一致性:事物执行的结果,必须使数据库从一个一致性状态,变到另外一个一致性状态。
隔离性:各个事物的执行互不干扰,任意一个事物的内部操做对其它并发的事务都是隔离的。
持续性:指事务一旦提交,对数据所作的任何改变都要记录到永久存储器中。一般就是保存进物理数据库中;
这几个特性简称为ACID性。
Mysql默认关闭事务(即打开自动提交),为了开启Mysql事务,能够显示调用以下命定:set AUTOCOMMIT={0|1} ,0为关闭自动提交。自动提交和开启事务正好相反,若是开启自动提交就是关闭事务,关闭自动提交就是开启事务。
提交,不论是显示提交仍是隐示提交,都会结束当前事务;回滚,不论是显示回滚仍是隐式回滚,都会结束当前事务。
能够调用Connection提供的setAutoCommit()方法来关闭自动提交,开启事务。如:conn.setAutoCommit(false);
若是全部的sql语句都执行成功,程序能够调用conn.commit()语法来提交事务。若是任意一条sql语句执行失败,则经过 conn.rollback()方法来回滚事务。
大部分时候,只须要对指定的数据表进行插入(C),查询(R),修改(U),删除(D)等CRUD操做。在sql里的模式字符串,用百分号(%)表示任意多个字符,使用下划线(_)表明一个字符。
使用链接池管理链接:
数据库的链接的创建和关闭是很消耗系统资源的操做,频繁的打开关闭链接将致使系统性能低下。数据库链接池的解决方案是:当应用程序启动时,系统自动创建足够的数据库链接,并将这些链接组成一个链接池,每次应用程序请求数据库链接时,无须从新打开链接,而是从链接池中取出已有的链接使用,使用完后再也不关闭数据库链接,而是直接将链接归还给链接池,这样能够极大的提升程序的运行效率。
在多个链接池程序里,相比之下,C3P0的性能更好,它不只能够自动清理再也不使用的Connection,还能够自动清理Statement和ResultSet对象。
(1)C3P0链接池的操做实例以下:
publicclass C3P0Test{
public static void main(String[] args) {
Connection conn=null;
PreparedStatement pstm=null;
ResultSet rs=null;
ComboPooledDataSource cpds=new ComboPooledDataSource();
try{
conn=cpds.getConnection();
pstm=conn.prepareStatement("select * from account wherename=?");
pstm.setString(1, "a");
rs=pstm.executeQuery();
rs.next();
System.out.println(rs.getDouble("money"));
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.close(conn, pstm,rs);
}
}
}
(2)JDBC还提供了一个批量更新的功能,使用批量更新时,多条sql语句将被做为一批操做被同时收集,并同时提交。以下实例:
public class StatementBatchTest {
publicstaticvoid main(String[] args) {
Connection conn=null;
Statement stat=null;
ResultSet rs=null;
try{
conn=JDBCUtils.getConnection();
stat=conn.createStatement();
stat.addBatch("create databasedb_batch");
stat.addBatch("use db_batch");
stat.addBatch("create table tb_batch"+"(id int primary key auto_increment, name varchar(20))");
stat.addBatch("insert into tb_batchvalues(null,'a')");
stat.addBatch("insert into tb_batchvalues(null,'b')");
stat.addBatch("insert into tb_batchvalues(null,'c')");
stat.addBatch("insert into tb_batchvalues(null,'d')");
stat.executeBatch();
System.out.println("执行成功");
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.close(conn, stat,rs);
}
}
}
(3)在preparedStatement中进行批量更新的例子以下:
publicclass PreparedStatementBatch {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
// conn =JDBCUtils.getConnection();
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql:///db_batch","root", "root");
ps = conn.prepareStatement("insert into tb_batch values(null, ?)");
for(int i=0; i<10000; i++){
ps.setString(1, "name"+i);
ps.addBatch();
}
ps.executeBatch();
System.out.println("执行成功~!");
} catch (Exception e) {
e.printStackTrace();
}finally{
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
rs = null;
}
}
if(ps != null){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
ps = null;
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
conn = null;
}
}
}
}
}
(4)翻页是JDBC中的经常使用技术,本代码中利用执行计划处理分页,数据库的链接和关闭用已经另一个类DBUtil实现,代码以下:
public class PageDemo {
public static void main(String[] args) {
PageDemo demo = new PageDemo();
demo.printPage(5, 3);
}
public void printPage(int pageSize,int page){
int begin = (page - 1)*pageSize + 1;
int end = page*pageSize ;
String query = "select * from dept";
String sql = "select * from (select a.*, rownum rn from ("+query+")a where rownum<= ?) where rn>= ?";
System.out.println(sql);
Connection conn = null;
try {
conn = DBUtil.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, end);
ps.setInt(2, begin);
ResultSet rs = ps.executeQuery();
while(rs.next()){
System.out.println(rs.getString("dname"));
}
rs.close();
ps.close();
}catch(Exception e){
e.printStackTrace();
}finally{
DBUtil.close(conn);
}
}
}