JDBC学习笔记

本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/blog/5/5-125.html

1.加载驱动:加载实现数据库接口的实现类
 String driver = "com.mysql.jdbc.Driver";
 Class.forName(driver);
2.实例化数据库连接对象:(需要数据库账户密码)
  connection = DriverManager.getConnection(URL, username, password);
3.获取操纵数据库的statement对象:
  Statement statement = connection.createStatement();
4.使用statement对象进行数据库操纵
5.按照顺序关闭ResultSet,Statement,Connection对象,断掉与数据库的连接
6.面向接口编程
7.封装成JdbcUtils处理jdbc相应的基本操作;
8.PrepareStatement可以进行sql语句的预编译和防止SQL注入漏洞。
9.一定记得用完之后关闭数据库连接,该资源极其珍贵。
10.数据库分页:主要完成查询总条数的获取,再根据要查询的页码在数据库中查询到相应的部分内容回传到浏览器,limit ?,?进行分页查询,具体参考常用相关组件和CustomerSystem项目。主要在于浏览器中当前页码数的维护工作。
11.大文本操作:(大文本要用流操作,防止占用过多内存)
设置值:
  PreparedStatement.setCharacterStream(index, reader, length);
  //注意length长度须设置,并且设置为int型
获取值:
  reader = resultSet. getCharacterStream(i);
  reader = resultSet.getClob(i).getCharacterStream();
  string s = resultSet.getString(i);
12.大数据操作:(大数据要用流操作,防止占用过多内存)
设置值:PreparedStatement. setBinaryStream(i, inputStream, length);
获取值:
  InputStream in  = resultSet.getBinaryStream(i);
  InputStream in  = resultSet.getBlob(i).getBinaryStream();
13.批处理:
Statement:优点:可以调用不同的sql语句批处理;
缺点:相同的sql语句要写多次,没有预编译
 PreparedStatement:
优点:执行相同sql语句但是参数不同只需要写一次sql语句
缺点:只能应用在SQL语句相同,但参数不同的批处理中
14.获取自动生成的主键:
设置statement执行获取主键:
connection.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
 获取主键结果集:rs = statement.getGeneratedKeys();
15.调用存储过程:
获取存储过程Statement:
  connection.prepareCall("{call demoSp(?,?)}");
 输入参数:
  statement.setString(1, "xxxx");
 输出参数:
  statement.registerOutParameter(2, Types.VARCHAR);//数据类型Types
 执行:
  statement.execute();
 得到执行结果:
  statement.getString(2);
16.事务操作:
开启事务:connection.setAutoCommit(false);
提交事务:connection.commit();
回滚事务:connection.rollback();没提交的情况下会自动回滚到事务开始阶段,该代码用户手动回滚
回滚点:Savepoint
设置回滚点:sp = connection.setSavepoint();
回滚到回滚点:connection.rollback(sp);
回滚点之前的sql要记得提交:connection.commit();
17.事务基础知识:
基本特征:原子性(A)
          一致性(C):事务前后的整体状态是一致的
          隔离性(I):并发线程安全问题
          持久性(D):commit之后保证一定保存了
难题:隔离性!!!--脏读、不可重复读、虚读
脏读:A事务修改但未提交,B事务读,A事务再回滚,则B读取的数据是脏数据;
不可重复读:A事务查询,B事务修改,A事务第二次查询得到的结果和之前的不一致;
虚读:A事务查询,B事务添加一个数据,之后A在查询得到的结果集多了一条;
隔离性解决方案:
 
隔离级别越高性能越差,根据具体情况进行选择。
注:此处设置的隔离级别是设置当前事务的隔离级别,和别的事务的隔离级别没关系,且对应该隔离级别的该事务就会有对应可能出现的隔离性问题。
注:查询程序可设置Read committed;
    统计程序要设置Serializable
18.JDBC设置隔离级别:
connection.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
在开启事务之前设置隔离级别;
19.数据库连接池:
数据库连接的创建代价很大,因此实现创建多个数据库连接形成集合,需要的时候从中进行申请,用完之后再重新返回集合中,并且连接池要控制好连接状态,最大连接数,空闲连接数等参数,并发控制等。
  A、 Dbcp连接池:需要pool、dbcp、colletions三个commons的包,版本要对应;
  B、 Dbcp使用步骤:
    // 加载配置文件
    InputStream is = JDBCUtil_DBCP.class.getClassLoader()
       .getResourceAsStream("dbcpconfig.properties");
    properties.load(is);
    // DataSource工厂
    factory = new BasicDataSourceFactory();
    // 工厂通过配置文件生成DataSource对象
    ds = factory.createDataSource(properties);
  C、 从连接池申请数据库连接:(在jdbcutils中创建连接池)
    ds.getConnection();
  D、 C3P0连接池:
    导入c3p0的jar包
    加入c3p0-config.xml配置文件
    创建连接池:
    cpds = new ComboPooledDataSource("myConfig");
     获取连接对象: cpds.getConnection();
  E、 Tomcat服务器自带连接池:
    Tomcat创建一个数据库连接池放到JNDI容器中,再通过JNDI容器获取数据库连接池。(其实是DBCP连接池)
    附:JNDI详解教程:
    http://www.cnblogs.com/xing901022/p/4568803.html
    a. 配置Tomcat的Context(此之后Tomcat服务器就创建好了连接池并放入了JNDI容器中)
     附:可以配置context.xml的位置,详见:http://localhost:8080/docs/config/context.html
     配置详情:
      <Context>
        <Resource name="jdbc/EmployeeDB"
            auth="Container"
            type="javax.sql.DataSource"
            username="root"
            password=""
            driverClassName="com.mysql.jdbc.Driver"
            url="jdbc:mysql://localhost:3306/customersystem"
            maxActive="8"
            maxIdle="4"/>
      </Context>
    b. 从JNDI容器中获取连接池对象:
      初始化 jndi:
      Context initCtx = new InitialContext();
      得到jndi容器:
      Context envCtx = (Context) initCtx.lookup("java:comp/env");
      从容器中检索连接池:
      DataSource ds = (DataSource) envCtx.lookup("jdbc/EmployeeDB");
      获取连接:
      conn = ds.getConnection();
      注:该种方式要把数据库的驱动放到tomcat的lib下,防止找不到数据库驱动。
20.JDBC框架相关:
 获取数据库元数据:(数据库基本信息)
DatabaseMetaData metaData = connection.getMetaData();
获取Statement的参数元数据:(PreparedStatement的sql语句参数详细信息)
ParameterMetaData parameterMetaData = st.getParameterMetaData();
ResultSet结果集元数据:(获取结果集的相关详细信息)
ResultSetMetaData resultSetMetaData = rs.getMetaData();
框架设计思路:抽取相同部分代码,再用模版设计模式,接口回调控制主控逻辑,由子类具体实现各个模块的具体过程。保证主流程的统一性和各模块的多样性。
21.Oracle大数据存储处理:(不建议使用dbutils)
 
 
样例:
  写入:
 
   读取:
 

 

本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/blog/5/5-125.html

一、概述: JDBC从物理结构上说就是Java语言访问数据库的一套接口集合。从本质上来说就是调用者(程序员)和实现者(数据库厂商)之间的协议。JDBC的实现由数据库厂商以驱动程序的形式提供。JDBC API 使得开发人员可以使用纯Java的方式来连接数据库,并进行操作。 ODBC:基于C语言的数据库访问接口。 JDBC也就是Java版的ODBC。 JDBC的特性:高度的一致性、简单性(常用的接口只有4、5个)。 1.在JDBC中包括了两个包:java.sql和javax.sql。 ① java.sql 基本功能。这个包中的类和接口主要针对基本的数据库编程服务,如生成连接、执行语句以及准备语句和运行批处理查询等。同时也有一些高级的处理,比如批处理更新、事务隔离和可滚动结果集等。 ② javax.sql 扩展功能。它主要为数据库方面的高级操作提供了接口和类。如为连接管理、分布式事务和旧有的连接提供了更好的抽象,它引入了容器管理的连接池、分布式事务和行集等。 注:除了标出的Class,其它均为接口。 API 说明 java.sql.Connection 与特定数据库的连接(会话)。能够通过getMetaData方法获得数据库提供的信息、所支持的SQL语法、存储过程和此连接的功能等信息。代表了数据库。 java.sql.Driver 每个驱动程序类必需实现的接口,同时,每个数据库驱动程序都应该提供一个实现Driver接口的类。 java.sql.DriverManager (Class) 管理一组JDBC驱动程序的基本服务。作为初始化的一部分,此接口会尝试加载在”jdbc.drivers”系统属性中引用的驱动程序。只是一个辅助类,是工具。 java.sql.Statement 用于执行静态SQL语句并返回其生成结果的对象。 java.sql.PreparedStatement 继承Statement接口,表示预编译的SQL语句的对象,SQL语句被预编译并且存储在PreparedStatement对象中。然后可以使用此对象高效地多次执行该语句。 java.sql.CallableStatement 用来访问数据库中的存储过程。它提供了一些方法来指定语句所使用的输入/输出参数。 java.sql.ResultSet 指的是查询返回的数据库结果集。 java.sql.ResultSetMetaData 可用于获取关于ResultSet对象中列的类型和属性信息的对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值