JDBC 及事务复习

JDBC

1.什么是JDBC ?

Java DataBase Connectivity    java数据库连接

JDBC是一套标准,是java与各大数据库厂商共同制定的一套接口,而这套接口由个大数据库厂商进行了实现。

2.JDBC 连接数据库的步骤?

1.导jar包

2.加载数据库驱动(java se项目可省略,java web不可省略) DriverManager

Class.forName("com.mysql.jdbc.Driver");

3.通过驱动管理器获取jdbc的连接对象 Connection

Connection conn = DriverManager.getConnection("jdbc.mysql://localhost:3306/java35");

4.通过连接对象,创建SQL执行对象 Statement

Statement state = conn.createStatement();

5.通过SQL执行对象,执行SQL语句

state.execute(String SQL语句);

6.关闭资源

state.close();

conn.close();

3.为什么使用PreparedStatement不使用Statement?

Statement是PreparedStatement的父类,作为 Statement 的子类, PreparedStatement 继承了 Statement 的所有功能

1 代码可读性、可维护性好

2. 有效禁止SQL注入

①.SQL注入问题

当输入密码使我们的查询语句产生了歧义:比如:1' or '1'='1

原查询语句:    select id from user35 where username='帐号' and password='密码' 

拼接后:    select id from user35 where username='帐号' and password='1' or '1'='1'
②。解决SQL注入问题
	将代码与参数分离:
		先将未拼接参数的sql语句,作为sql指令,先传递给数据库进行预编译;
		再将需要传递的参数,不作为指令传递给数据库

3.提高性能

PreparedStatement 是先编译在传参执行,预编译的语句会被缓存,以后遇到相同的语句就不用缓存直接可以传参;

Statement 每条语句都不一样,因此不存在缓存,每一次都要编译执行。

PreparedStatement 预编译的SQL执行环境

操作流程与Statement基本一致:
	1.如何得到一个PreparedStatement 对象
		PreparedStatement state = conn.PrepareStatement("预编译的sql语句 ")2.预编译的SQL语句如何编写
    	需要填充的位置用?代替
    	select id from user35 where username=? and password=?
    3.参数如何填写
    	state.setxxx(int indedx,xxx value );【 xxx ---指数据类型  】
    	index : sql 语句中的?位置,从一开始
    	value : 填写的参数值
    4.如何执行填充完毕参数的SQL
            -   boolean execute();
            -   int executeUpdate();
            -   ResultSet executeQuery();

4. JDBC连接数据库的工具类

连接池

连接池用于缓存连接!
当需要连接时可以不用再创建连接,可直接从连接池中获取。
当连接池中存在空闲的连接时,会将空闲连接给程序使用。
当连接池中不存在空闲连接时,且连接池未满时,则创建连接提供给程序使用,并在在程序使用完毕后缓存连接。
当连接池中不存在空闲连接时,且连接池已满时,则排队等候空闲连接出现。

	  使用连接池中的连接对象操作数据库时, 操作完毕依然需要释放连接(close()).
      连接池中的连接在设计时, 使用了动态代理设计模式+装饰者设计模式 . 我们调用它的close方法, 代理没有关闭这个连接, 而是将连接重新放入了池中.
1.DBCP连接池
2.德鲁伊连接池

创建连接池对象

static {
			//	获取配置文件的输入流
        InputStream is = DBCPUtil.class.getClassLoader().getResourceAsStream("dbcp.properties");
     		 //	创建Properties对象
      Properties ppt = new Properties();
        try {
      	 	 //	将流指向的文件中的键值对 加载到ppt中
            ppt.load(is);
            //	通过连接池的工厂类, 创建连接池对象
            data = DruidDataSourceFactory.createDataSource(ppt);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

获取数据库连接的静态方法

 public static Connection getConnection() {
        try {
            return data.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }
    }

释放资源的静态方法(Connection PreparedStatement

​ Connection PreparedStatement ResultSet

public static void close(Connection conn,Statement state,ResultSet result) {
            if(result != null) {
                try {
                    result.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(state != null) {
                try {
                    state.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
    }

5.什么是DAO DAO如何进行设计

什么是DAO?
1:Data Access Objects :数据访问对象:
2:DAO指位于业务逻辑和持久化数据之间实现对持久化数据的访
   问,也就是将数据库操作都封装起来,对外提供相应的接口
3:[采用面向接口,有利于代码的,低耦合高类聚原则]
DAO的优势?
1:隔离业务逻辑代码和数据访问代码
2:隔离不同数据库实现
DAO的组成?
**1:DAO接口   把对数据库的所有操作定义为抽象方法
2:DAO实现类 不同数据库给出的DAO接口定义方法的具体实现
3:实体类    用于存放和传输对象数据
4:数据库连接和关闭工具
             避免了数据库连接和关闭代码的重复

6.使用JDBC结合DAO完成对银行账户的增删改查

1.bean类
2.数据库连接类,装有获取连接和关闭连接
3.DAO类,写有访问数据库的方法
4.DAO类的实现类,写有sql语句

7. JDBC 中如何完成事务控制 如银行转账

connection 中三个方法与事务有关:
	- con.setAutoCommiit(true)  自动提交 【boolean 类参数】
	  con.setAutoCommit(false)  手动提交,就是开启事务
	- con.rollback();           回滚事务
    - con.commit();             提交事务
    - Connextion.setTransactionIsolation()设置事务隔离级别

dao设计注意问题

1.参数
2.返回值
3.方法

连接池设计

jdbc批处理

一:Statement.addBatch(SQL),可以发送不同的SQL语句

执行SQL语句的方法:executeBatch()

清除批处理命令的方法:clearBatch()
二:PreParedStatement.addBatch(),只能发送相同的SQL语句适合做批量插入、批量更新。

执行SQL语句的方法:executeBatch()

清除批处理命令的方法:clearBatch()

什么是元数据 如何获取元数据?

元数据(MetaData),即定义数据的数据.
JDBC来处理数据库的接口主要有三个,即:
   Connection : 由Connection对象的getMetaData()方法获取的是DatabaseMetaData对象。
   PreparedStatement : 由PreparedStatement对象的getParameterMetaData ()方法获取的是ParameterMetaData对象。
   ResultSet : 由ResultSet对象的getMetaData()方法获取的是ResultSetMetaData对象。
   

一、DatabaseMetaData(数据库元数据)

getDatabaseProductName:获取数据库的产品名称
   getDatabaseProductVersion:获取数据库的版本号
   getUserName:获取数据库的用户名
   getURL:获取数据库连接的URL
   getDriverName:获取数据库的驱动名称
   driverVersion:获取数据库的驱动版本号
   isReadOnly:查看数据库是否只允许读操作
   supportsTransactions:查看数据库是否支持事务

二、ParameterMetaData(参数元数据)

 ParameterMetaData是由PreparedStatement对象通过getParameterMetaData方法获取而来,主要是针对PreparedStatement对象和其预编译的SQL命令语句提供一些信息,比如像”insert into account(id,name,money) values(?,?,?)”这样的预编译SQL语句,ParameterMetaData能提供占位符参数的个数,获取指定位置占位符的SQL类型等等.
 以下有一些关于ParameterMetaData的常用方法:
    getParameterCount:获取预编译SQL语句中占位符参数的个数
三、ResultSetMetaData(结果集元数据)

 ResultSetMetaData是由ResultSet对象通过getMetaData方法获取而来,主要是针对由数据库执行的SQL脚本命令获取的结果集对象ResultSet中提供的一些信息,比如结果集中的列数、指定列的名称、指定列的SQL类型等等,可以说这个是对于框架来说非常重要的一个对象。
 以下有一些关于ResultSetMetaData的常用方法:
    getColumnCount:获取结果集中列项目的个数
    getColumnType:获取指定列的SQL类型对应于Java中Types类的字段
    getColumnTypeName:获取指定列的SQL类型
    getClassName:获取指定列SQL类型对应于Java中的类型(包名加类名)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值