JDBC(java dadabase connection)

SQL分类


  • DDL:dadabase definition langnage:数据定义语言:create,alter,drop,truncate;
  • DML:databae manipulation langnage:数据操作语言:insert,update,delete
  • DCL:database controll langnage:数据控制怨言:grant(授权),revoke(回收权限)

     注意:delete和truncate的区别


delete:每次删除一行,并在日志事务系统中记录一项identity,需要提交事务,并可以回滚,如果有相应的触发器会触发触发器来执行,不影响表所占用的extent,高水线(high w2atermark)保持原位置不动。


truncate:只能一次性删除整个表中的所有数据行并保持表结构。因为是ddl语句,操作立即生效不需要提交事务,不能回滚,也不会触发trriger,它通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。这也是为什么delete完后怎增加的数据行会以删除前的数据行开始计数,而truncate是从1开始计数行数。


总之:truncate效率较delete更快,性能更好;如果没有备份切记不要使用truncate和drop删除表


修改表字段:


ddl:


alter table modify/add/drop id int not null


alter table drop index __.


注意:mysql删除约束使用drop,mysql默认唯一约束列为指定索引列




主键约束:逻辑主键用于标示每行记录,自增,id intauto_increament

外键约束:一般是建表时建立外键约束,主表删除使用级联删除从表外键约束


create table A(id int);
create table B(b_id int) 
foreign key (b_id) reference A(id) 
on delete cascade --级联删除



索引:drop/create index column_name_index on table.


优点:查询速度快,相当于书的目录


缺点:系统开销,数据表记录修改后需要数据库系统维护索引;存储索引需要一定的存盘空间。




多表查询:


外连接:full join


左外连接: left join 左表的记录全部查询出来,右表没有匹配到的为null


右外连接:right join 右表的记录全部查询出来,左表没有匹配到的为null




注意:


左连接时on后面的条件对左表没有作用,除非使用where条件进行筛选才能对坐标有限制,但是对右边有筛选作用


例如:


A left B on  A=1 and B=1----会查出所有A的记录


A left B on   B=1  where A=1 ----会查出A=1的记录

右连接时on后面的条件对右表没有作用,除非使用where条件,但是对左边有筛选作用




JDBC基本编程步骤:


Class.forName("com.mysql.jdbc.Driver");//加载驱动
Connection con=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/databae_name","root","root");//建立连接
Preparedstatement pre=con.Preparedstatement("select * from user where id=?"); //进行预编译
ResultSet reult=pre.excute();//得到执行结果
(result.next())
{
System.out.println(result.getInt.....);
}

注意:


其中预编译PreparedStatement相比Statement优势如下:


  1. 预编译的语句,性能更好;
  2. 无需拼装sql语句,编程简单;
  3. 关键能够防止sql注入,安全性高



数据库连接池:


由于频繁的加载数据库驱动和连接数据库会消耗很大的内存,所以建议数据库连接池,预先创建一定的数量的数据库连接,当需要连接直接从池里面获取,使用完后关闭资源并回收连接至连接池中,供下次使用。


常用:区别



DBCP连接池,Apache公司开发的,tomcat里面使用的,但是不能自动清理无用的statement和resultset




C3P0连接池,可以自动清理不再使用的连接,自动清理statement和resultSet资源,hibernate和spring在使用




Druid连接池, 阿里出品,淘宝和支付宝专用数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个 SQL Parser。支持所有JDBC兼容的数据库,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。Druid针对Oracle和MySql做了特别优化,比如Oracle的PS Cache内存占用优化,MySql的ping检测优化。Druid提供了MySql、Oracle、Postgresql、SQL-92的SQL的完整支持,这是一个手写的高性能SQL Parser,支持Visitor模式,使得分析SQL的抽象语法树很方便。简单SQL语句用时10微秒以内,复杂SQL用时30微秒。通过Druid提供的SQL Parser可以在JDBC层拦截SQL做相应处理,比如说分库分表、审计等。Druid防御SQL注入攻击的WallFilter就是通过Druid的SQL Parser分析语义实现的