JDBC学习笔记

-----------------------------JDBC基本原理---------
1. 就是要各个数据库实现这三个接口:
1.connection:创建连接,把用户名和密码给数据库验证;
2.statement:用来向数据库发送SQL语句调用数据;
3.resultset:用来封装从数据库返回的数据;
2. 实现连接,必须有连接数据库的实现类包;可以去官网下载
Oracle, 192.168.0.26, 1521, tarena, jsd1302, jsd1302.
3、结果集的数据不是一次性加载到内存中,是调用的时候才向数据库取,数据 库输出的数据一般都很大;调用出来的数据查看时只能使游标向下读取 ,也 可以 向上 读取,但是向上读取会出现异常。
4、 DAO:用程序封装对数据库的访问。
一般用一个类来封装对一个表的操作比如:serviceDAO
5、SQL注入:是一种黑客小技术,用where ... and ... or'2'='2';只要or后面 的是true那么表里的所有数据都会显示出来;
6、preparedstatement(,)有两个参数,select...from..where ? and ?.问号里 面的东西可以用setxxx()来设定,xxx是?里面的数据类型;用来防止SQL 注入,而且执行效率比较高。因为他只是编译一次,接着传进去参数,如果 是statement是传进去一次就编译一次;
7、对代码进行重构优化,要是有两个类或者很多类中都有相同的方法,或者大 部分相同的代码,可以把这些方法或者代码写在父类中,让这些类继承父类就可以。
8、类service用来封装从数据库里取出来的数据,是和表相对应的,里面的每一 个属性和表里的字段也就是列相对应,再把数据封装成java对象,
9、 标准的DAO,把获得连接的功能封装,把从数据库里面的数值封装成方法返回 值一般都是对象,
10、实体类,是和表之间是一一对应的,把每一个数据封装成对象和DAO封装对 表的操作,关系是依赖关系,DAO要依赖与实体类,DAO类都要继承BASEDAO
11、表的主键尽量不要和业务相关,主键有唯一性,当和其他表有关联的时候,主键的改变是会影响到其他表的关联,最好是使用和业务没有任何关系的当主键,
----------day02-事务,DAO,连接池--------------
1.、事务特性里面的原子性,事务是原子工作单元,对其数据进行更改,要么全部执行要么全部不执行,在jdbc里面所有的事务都是默认commit的,
事务特性ACID:
原子性:(atonmic)事务必须是原子工作单元,对于其数据修改,要么全部执行,要么全都不执行。
一致性:(consistent)事务在完成时,必须使所有的数据都保持一致状态;
隔离性(insulation)由并发事务所作的修改必须与任何其他并发事务所作的修改隔离;
另外事务完成之后,它对于系统的影响是永久性的。
2、连接事务对象的三个方法:开启事务conn.setAutoCommit(false);用来设定是不是要自动提交,默认是自动,是true。Conn.commit(),提交事务。Conn.rollback(),回滚,把没有提交的事务都给删除掉,不会保存下来。 自己手动提交不让他每次都自己提交,这样在出现异常的时候可以把之前写的记录用回滚删除掉,避免污染数据的完整性,所要在完成所有SQL操作后提交要是有异常就回滚;做SQL操作之前把自动提交设置为false。
3、批处理的问题:同一个SQL不同的参数时,利用批处理解决SQL语句的效率问题,就是把参数一批一批的送到数据库里,凡是把预编译的SQL语句时需要批处理时用addBath(),不用Update();addBath()的意思是把要执行的参数数据缓存起来,当参数添加完了就用executeBatch(),把对象命令列表中的所有SQL语句发送到数据库处理;要是数据量过大时缓存会占用大部分内存,会影响性能,所要缓存也要适当,可以用一个变量count来设定缓存的数量,通过增强型for循环来做,当满足时就送去数据库。
一个批处理时被发送到数据库以作为单个单元执行的一组更新语句,这降低了应用程序和数据库之间的网络调用,相比单个SQL语句的处理,处理一个批处理中的多个SQL语句是一种更为有效的方式。
4、连接池的使用:用连接池来管理客户端和数据库的连接,类似于线程池,用程序提前把连接建立好放到连接池中,使用的时候调出来就可以,用完就放到连接池中,连接池是一个集合,一般是用线程的不要自己做,利用第三方包阿帕奇。Org.apache.commons.Dbcp这个包里,用的是basicdatasource()里面放的就是连接。方法有seturl();setDriverClassname();setusernam e();setpassword(); setinitialsize()初始化连接池的数量;setmaxactive()允许最大的同时运行的连接数扩容的数量;setmaxidle()最大允许的空闲连接;getconnection()获取连接,返回值是connection类型,使用完要调用close()方法,不是真正的关掉,是把这个连接还给连接池。
5、做DAO要注意的:连接要封装好,比如继承父类,要用连接池,要防止SQL注入,
6、装配一个对象,就是new一个对象出来并对对象进行必要的初始化,给他一些必要的数据。
7、包装模式:连接对象用完一定要close();这个类就是相当于手机壳Class connectionWrapper implements connection{
 Private connection conn=….这里用成员变量实现真正的连接,相当于实现功能的手机
    Public setAutoCommit(boolean b) {
    Conn.setAutocommit(b);
    }
}
手机壳和手机的里面的所有的按键都是相连着的,也就是说连接的外面有一个类,类里面声明了一个和类一样功能的成员变量,要实现类的方法只要用成员变量里面的方法就可以,唯一让这两个不一样的是close()方法,当运行的时候是关了外面的壳不是里面真正的连接;里面的这个成员变量才是真正的连接.

8、单例的意思是:实例化对象只能是一个必须是静态的,而且在静态块里初始化,不能在构造方法中初始化,构造方法是用来初始化成员变量的,构造方法在创建对象的时候调用,静态块只在加载的时候调用一次,之后就不会调用了,类只要已进入方法区就静态块就马上运行不管有没有创建对象,比如:两个类都继承了一个类,要是同是new出了这两个对象,那么就有两个父类被初始化,是不合理的,所以要用单例去解决,
9、方言问题:如果把DAO用到其他的数据库中去的话不是只要修改了配置文件就可以使用的,有些SQL语句不能一块用的,因为他们的语法会不一样,这样运行就会出错,这个也就是数据库的方言问题;
10、面向接口的编程:不同的方式去实现同一个问题的时就可以规定一种规范。也就是面向接口的编程,也就是代理编程,同过定义接口的方法,然后再去用自己的方式实现接口的方法就可以,先定义好接口再用类去实现,接口中定义需要用到的方法,这些方法基本上都是public的方法,需要实现功能的时候只要根据自己的方式去实现接口中的方法就可以,接口中的方法异常是要保留的。比如要去实现和oralce的连接只要创建一个类继承连接类然后实现接口就可以。
回调模式要用接口,如果有好几个模块,模块中有实现类和接口,一般两个模块之间要互相调用数据时,尽量调用模块中的接口尽少的使用是实现类,这样的话就要用到工厂模式,用工厂模式用来封装对象的创建。工厂中的方法的返回值是new出的接口。一个接口有若干个实现类。工厂返回的一定是接口类型的。
   使用的时候是:接口类+变量=工厂类.方法();这样的形式去调用。要弄成单例模式就要设成静态的成员变量new出这个接口,这样静态方法返回的就是这个接口,
11、两个线程同时访问数据库是对数据库同一个数据操作的方法之间有线程安全问题,不是在单例模式的问题,解决这个问题是数据库管的,java是不管的,线程安全是对java中的同一个数据(同一个变量,同一个方法)进行操作时产生的安全问题,所以对数据库的这个问题是不成立的。当有多个线程同时对数据库操作时可以用一个线程来创建缓冲队列来管理这些线程,
12、BO使用DAO,model包含了bo和DAO。DAO里面不仅要封装数据还要封装对数据的操做方法。DAO工厂的目的是把DAO创建的对象封装起来,当你要用DAO的对象时只要调用DAO就可以,返回的是DAO的一个接口对象。
13、“假”分页:
一次性把数据全部读取出来放在缓存中,根据用户要看的页数和每页记录数,计算把哪些数据输出显示。只访问数据库一次,第一次取数比较慢,以后每页都从缓存中取,比较快,比较适合小数据量,如果数据量大,对内存压力比较大。一次性将数据库读入结果集,每次查看指定的页时,要求结果集的指针能够跳到指定的行,即指针能够跳到整个结果集的任意位置。


JDBC原理
 JDBC( Java DataBase Connectivity,java数据库连接 )是一种用于执行SQL语句的Java API , 可以为多种关系数据库提供统一访问 , 它由一组用Java语言编写的类和接口组成。
 JDBC API是SUN公司提出的访问数据库的接口标准。有了JDBC API , 就不必为访问不同的数据库编写不同的程序 , 程序员可以使用相同的一套API访问不同的数据库 , 同时 , 将Java语言和JDBC结合起来使程序员不必为不同的平台编写不同的应用程序 , 只须写一遍程序就可以让它在任何平台上运行 , 这也是Java语言“编写一次 , 处处运行”的优势。
 简单地说 , JDBC 可做三件事:与数据库建立连接、发送操作数据库的语句、返回处理结果。
JDBC编程步骤
Load the Driver
Class.forName()|class.forName().newInstance()|new DriverName();
实例化时自动向DrvierManager注册。(提供jar包)。

 例如:Class.forName("oracle.jdbc.OracleDriver");
Connect to the DataBase
  String url = "jdbc:oracle:thin:@172.16.0.212:1521:orcl";
  String userName = "jsd1302";
  String password = "jsd1302";
  Connection conn = DriverManager.getConnection(url,userName,password);
Execute the SQL
  Connection.CreateStatement();
  Statement.executeQuery(sql);(注意:sql语句中不能要分号)
  Statement.executeUpdate();
Retrieve the result data
 循环取得结果 while(rs.next());
Show the result data
 将数据库中的各种类型转换为java中的类型(getxxx)方法。
 例如,获得ID:
  String id=rs.getString(1);
  String id1 = rs.getString("id");
Close
  Close the resultSet/the statement/the Connection.
  (注意:关闭的时候一定要写在try..catch..finally块中。原因在于如果在加载驱动实例、建立连接、或者执行语句时发生异常,同时没有写在finally块,关闭的语句是不会执行的,这样会造成对数据库链接的浪费,最终发生“慢性”异常。)
  详细案例见TestJDBC.java
PreparedStatement
 
 
  好处:1、执行效率高。 2 、防止SQL注入。 3、相比较Statement,使用PreparedStatement声明SQL语句较为简便.
Select与DMLinsert/update/delete)的相同点
 1) 获得连接( Connection )的方式相同
 2) 数据库连接状态对象( Statement / PreparedStatement ) 两种都可以。需要多次执行的sql语句 , 使用PreparedStatement性能更好。
 3) 如果使用PreparedStatement , sql语句在生成语句对象的时候传递 ,
 并绑定占位符( 问号 )和数据的关系 stmt = conn.prepareStatement(sql); stmt.setString(1, password); stmt.setInt(2, id); stmt.executeQuery() 或 executeUpdate(); //参数不写sql
 4) 如果使用Statement , sql语句在执行时传递
 stmt = conn.createStatement(); stmt.executeQuery(sql) 或 executeUpdate(sql)
 5) PreparedStatement和Statement对象 , sql语句的传递时机不同。
JDBC中的事务
 JDBC默认事务是自动提交的 , 也就是每个DML操作完成后都自动提交。
 可以改为手动提交:conn.setAutoCommit(false) ; conn.commit();
  conn.rockback();
批处理
 
Dao(data access object)
DAO用于封装对数据库的访问,其中的方法实现对数据表的CRUD。
编写DAO时需要使用连接池技术(BasicDataSource)。
一般通过工厂模式获取DAO对象(DAO接口定义方法,通过具体的实现类来实现,使用DAOFactory获取DAO对象);一般情况下DAO对象都是单例的。
DAO通常还需要封装并提供对事务的操作:
  1) 一个DAO方法一个事务,一个DAO方法用一个连接。
  2) 由调用DAO的模块来控制事务,一次调用过程一个连接(ThreadLocal)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值