`
lan13217
  • 浏览: 498067 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

浅谈JDBC的概念理解与学习

    博客分类:
  • Java
阅读更多

JDBC的概念:工厂一般使用单例模式

工厂-->生产产品(Dao这个产品)


类加载器,不光可以load.class,还可以load其他的文件


事务概念与处理

1.原子性:不能拆分,组成事事务处理的语句形成一个逻辑处理单元,不能只执行其中的一部分

2.一致性:事务做完之后,保定数据的完整性约束

3.隔离性:一个事务处理对另一个事务处理的影响

4.持续性:事务处理的结果能被永久保存下来

步骤:打开事务connection.setAutoCommit(false);

提交事务:connection.commit();

回滚事务:connection.rollback();

jdbc缺省是自动提交的,客户端连接也是自动提交的,要想打开事务,要把自动提交关掉

保存点:savePoint

Savepointsp=null

sp=conn.setSavepoint();

conn.rollback(sp);

-----------------------------------

JDBC的概念:跨多个数据库的事务JTA

JTA容器weblogic,websphere

分成两阶段提交。

用到JNDI服务器

javax.transaction.UserTransactiontx=

(UserTransaction)ctx.lookup("jndiName");

tx.begin();

//connection1connection2(可能来自不同的数据库)

tx.commit(); //tx.rollback();

---------------------------------

事务的隔离级别:

connction.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

隔离级别

读未提交(Readuncommitted)可能出现脏读,不可重复读,幻读

读已提交 (Readcommitted)可能出现不可重复读,幻读

可重复读(Repeatableread)可能出现幻读(幻影数据,执行插入一条数据,在另一个客户端有可能看到)

可串行化(Serializable)

隔离级别各个数据库的实现是不一样的。

--------------------------------------------------


关于存储过程(两层架构的时候用的很多)

三层架构的系统很少使用了。略过不看了先。

---------------------------------------------------

其他几个有用的API

jdbc3.0 规范提供的方法

插一条记录,它能把主键返回来

PreparedStatement.getGeneratedKeys();

PreparedStatementps=connection.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);

ps.executeUpdate();

ResultSetrs=st.getGeneratedKeys();

rs.getInt(1);

批量处理:可以大幅提升大量增删改的速度(并非绝对),与具体数据库有关,也不一定能提高性能

PreparedStatement.addBatch();

PreparedStatement.executeBatch();


-------------------------------------------------------------

可滚动结果集与分页特性

Statementst=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);

ResultSet.TYPE_SCROLL_SENSITIVE--对数据库敏感的,就是说,数据库中记录发生了变化,结果集会觉察到(但某些数据库不一定遵循这一规范,mysql就不遵循)

ResultSet.CONCUR_UPDATABLE--可更新的,就是说,改变结果集中的内容可以影响到数据库里

ResultSet.CONCUR_READ_ONLY--只读的,

可滚动的结果集

Statementst=connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);

ResultSetrs=st.executeQuery(sql);

rs.beforeFirst();

rs.afterLast();

rs.first();

rs.isFirst();

rs.last();

rs.isLast();

rs.absolute(9);

rs.moveToInsertRow();


conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);

rs.updateString("colname","newvalue");

rs.updateRow();


mysql 分页例如:

selectid,name,money,birthdayfromuserlimit150,10;

从 user表中第150条记录开始,取10条记录


---------------------------------------------------------

jdbc元数据信息数据库元数据信息、参数元数据信息

DatabaseMetaDatameta=connection.getMetaData();

通过DatabaseMetaData可以获得数据库相关的信息,如:

数据库版本,数据库名,数据库厂商信息,是否支持事务,是否支持某种事务隔离级别,

是否支持滚动结果集等。

ParameterMetaDatapmd=preparedStatement.getParameterMetaData();

通过ParameterMetaData可以获得参数信息.

ParameterMetaDatapmd=ps.getParameterMetaData();

intcount=pmd.getParameterCount();

System.out.println("count="+count);

for(inti=1; i<=count; i++)

{

ps.setObject(i,params[i-1]);

}

ResultSetrs=ps.executeQuery();

--------------------------------------------------

dataSource 代理模式:

组合优先于继承

拦截Connection.close()方法

动态代理

调用处理器

----------------------------------------------------

数据源和连接池

DataSource用来取代DriverManger来获取Connection

通过 DataSource获得Connection速度很快

通过DataSource获得的Connection都是已经被包裹过的(不是驱动原来的连接),

他的close方法已经被修改

一般DataSource内部会用一个连接池来缓存 Connection,这样可以大幅度提高

数据库的访问速度;

连接池可以理解成一个能够存放Connection的 Connection

我们的程序只和DataSource打交道,不会直接访问连接池。


------------------------------------------

DBCP的应用

1.加载三个.jar

2.写dbcpconfig.properties配置文件

3.创建DataSource数据源


使用DBCP必须用的三个包

commons-dbcp-1.2.2\commons-dbcp-1.2.1.jar,

spring-framework-2.5.6\lib\jakarta-commons\commons-pool.jar,commons-collection-3.1.jar

dbcpconfig.properties

driverClassName=com.mysql.jdbc.Driver

url=jdbc:mysql://localhost:3306/jdbc

username=root

password=root

#初始化连接

initialSize=10

#最大连接数量

maxActive=50

# 最大空闲连接

maxIdle=20

#最小空闲连接

minIdle=5

#超时等待时间以毫秒为单位

maxWait=60000

#JDBC驱动建立连接时附带的连接属性格式必须为这样:属性名=property

#注注意user与password两个属性会被明确地传递。因此这里不需要包含他们

connectionProperties=useUnicode=true; characterEncoding=utf-8

#指定由连接池所创建的连接的自动提交auto-commit状态

defaultAutoCommit=true

#driverdefault 指定由连接池所创建的连接的只读read-only状态

#如果没有设置该值,则setReadOnly方法不被调用。

defaultReadOnly=

#driverdefault 指定由连接池所创建的连接的事务级别TransactionIsolation

#可用值为下列之一:这依赖于数据库

#NONE,READ_UNCOMMITED,READ_COMMITTED

defaultTransactionIsolation=READ_COMMITTED



----------------------------------------------------

创建数据源

Propertiesprop=newProperties();

prop.setProperty("driverClassName","com.mysql.jdbc.Driver");

prop.setProperty("url","jdbc:mysql://localhost:3306/jdbc");

prop.setProperty("username","root");

prop.setProperty("password","root");

#dbcp使用这个方法创建数据源,需要一个Property参数,参数中的键值对就为.properties文件中的配置

#可以直接load进来,省的写了

Propertiesprop=newProperties();

InputStreamis=JdbcUtil.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");

prop.load(is);

DataSourcemyDataSource=BasicDataSourceFactory.createDataSource(prop);

-------------------------------------------------------------------------

模板模式对查询抽象,采用继承的方式(对查询来说,不够灵活,查询的列一变化,就得修改超类)

策略模式(采用接口的方式传递一个接口的参数,通过匿名类为各种需求实现)

-----------------------------------------------------------------------

使用JdbcTemplate工具类,在spring框架中提供了一个JdbcTemplate工具类,这个类对JDBCAPI进行了很好的封装

这个类就像我们自己对JDBC进行封装一样。只是代码列健壮,功能更强大而已。

我们以后在实际项目中可以使用JdbcTemplate类来完全替代直接使用JDBCAPI这与直接使用jdbcapi没有太大性能区别

使用 JdbcTemplate工具类需要额外从spring开发包中导入spring.jar和commons-logging.jar

关于 jdbcTemplate查询,更新相关使用方法见练习

如果想获取connection,自由进行操作,可以使用

jdbc.execute(newConnectionCallback()
{

publicObjectdoInConnection(Connectionconn)throwsSQLException,
DataAccessException
{}
}); //拿到了Connction随你怎么用了

-------------------------------------------------------------------
Spring 的NameParameterJdbcTemplate
NameParameterJdbcTemplate内部包含了一个 JdbcTemplate,所以JdbcTemplate能做的事情它都能做
NameParameterJdbcTemplate相对于 JdbcTemplate主要增加了参数可以命名的功能

publicObjectqueryForObject(Stringsql,MapparamMap,RowMapperrowMapper)
publicObjectqueryForObject(Stringsql,SqlParameterSourceparamSource,RowMapperrowMapper




SqlParameterSource 的两个主要实现MapSqlParameterSource和BeanPropertyParameterSource


SimpleJdbcTemplate 内部包含了一个NamedParameterJdbcTemplate,所以NamedParameterJdbcTemplate

能做的事情SimpleJdbcTemplate都能干,SimpleJdbcTemplate相对于 NamedParameterJdbcTemplate主要

增加了JDK5.0的泛型技术和可变长度参数支持

simpleJdbcTemplate 中有些方法不全,比如拿到主键的方法就没有,可以获取到NamedParameterJdbcTemplate

调用它里面的方法

getNamedParameterJdbcOperations() 返回的是NamedParameterJdbcOperations其实现就是NamedParameterJdbcTemplate这个类

getJdbcOperations() 返回的是JdbcOperation其实现就是JdbcTemplate

++++++++++++++++++++++++++++++++++++++++++++++++++

Map 参数源:采用键值对方式传参(参数别名可任意,如:m,:n)

staticUserfindUser(Useruser)
{
NamedParameterJdbcTemplatenamed=newNamedParameterJdbcTemplate(dataSource);
Stringsql="selectid,name,money,birthdayfromuserwheremoney>:mandid<:n";
Mapmap=newHashMap();
map.put("m",user.getMoney());
map.put("n",user.getId());
Objectu=named.queryForObject(sql,map,newBeanPropertyRowMapper(User.class)); //这个方法当查询对象多于一个或为null时会抛异常
return(User)u;
}



Bean属性参数源使用方法(参数别名要与bean类的属性对应,如:money,:id)(通过&号也可以命名别名,不建议使用)

staticUserfindUser(Useruser)
{
NamedParameterJdbcTemplatenamed=newNamedParameterJdbcTemplate(dataSource);
Stringsql="selectid,name,money,birthdayfromuserwheremoney>:moneyandid<:id";
SqlParameterSourceps=newBeanPropertySqlParameterSource(user);

Objectu=named.queryForObject(sql,ps,newBeanPropertyRowMapper(User.class)); //这个方法当查询对象多于一个或为null时会抛异常
return(User)u;
} //保存数据获得主键
publicintupdate(Stringsql,SqlParameterSourceparamSource,KeyHoldergeneratedKeyHolder)staticvoidaddUser(Useruser)

{

NameParameterJdbcTemplatenamed=newNameParameterJdbcTemplate(dataSource);

Stringsql="insertintouser(name,birthday,money)values(:name,:birthday,:money";

SqlParameterSourceps=newBeanPropertySqlParameterSource(user);

KeyHolderkeyHolder=newGeneratedKeyHolder();

named.update(sql,ps,keyHolder);

intid=keyHolder.getKey().intValue(); user.setId(id); //如果不是整型的主键呢,使用Mapmap=keyHolder.getKeys(); }




JDBC 的概念:使用泛型技术与可变长度的参数(JDK1.5版本以上)

//泛型技术(JDK1.5以上版本可使用)
//使用泛型技术与可变长度的参数(JDK1.5版本以上)
staticUserfindUserSimple(Stringname)
{
SimpleJdbcTemplatesimple=newSimpleJdbcTemplate(JdbcUtil.getDataSource());

Stringsql="selectid,name,money,birthdayfromuserwheremoney>:moneyandid<:id";

//用这个泛型,返回结果就不用向下转型了
//publicTqueryForObject(Stringsql,ParameterizedRowMapperrm,Object...args)throwsDataAccessException
Useru=simple.queryForObject(sql,
ParameterizedBeanPropertyRowMapper.newInstance(
User.class),name); //这个行映射器的参数是可变长的Object...
returnu;
}


-----------------------------------------------------------------------------------------------------------------------
// 代码

importjava.util.HashMap;
importjava.util.Map;

importorg.springframework.jdbc.core.BeanPropertyRowMapper;
importorg.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
importorg.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
importorg.springframework.jdbc.core.namedparam.SqlParameterSource;

importcom.feihu.domain.User;
importcom.feihu.jdbc.JdbcUtil;

publicclassSimpleJdbcTemplate
{
privatestaticNamedParameterJdbcTemplatenamed=newNamedParameterJdbcTemplate(
JdbcUtil.getDataSource());

///参数命名方法查询NamedParameterJdbcTemplate
//两种参数传递方法 BeanPropertySqlParameterSource(user)、MapSqlParameterSource

//bean 属性参数源
staticUserfindUser(Useruser)
{
//Bean属性参数源使用方法(参数别名要与bean 类的属性对应,如:money,:id)(通过&号也可以命名别名,不建议使用)

Stringsql="selectid,name,money,birthdayfromuserwheremoney>:moneyandid<:id";
SqlParameterSourceps=newBeanPropertySqlParameterSource(user);

Objectu=named.queryForObject(sql,ps,newBeanPropertyRowMapper(
User.class)); //这个方法当查询对象多于一个或为null时会抛异常
return(User)u;
}

//Map参数源
staticUserfindUser2(Useruser)
{
Stringsql="selectid,name,money,birthdayfromuserwheremoney>:mandid<:n";
Mapmap=newHashMap();
map.put("m",user.getMoney());
map.put("n",user.getId());
Objectu=named.queryForObject(sql,map,newBeanPropertyRowMapper(
User.class)); //这个方法当查询对象多于一个或为null时会抛异常
return(User)u;
}

//泛型技术(JDK1.5 以上版本可使用)
//使用泛型技术与可变长度的参数(JDK1.5版本以上)
staticUserfindUserSimple(Stringname)
{
SimpleJdbcTemplatesimple=newSimpleJdbcTemplate(JdbcUtil.getDataSource());

Stringsql="selectid,name,money,birthdayfromuserwheremoney>:moneyandid<:id";

//用这个泛型,返回结果就不用向下转型了
//publicTqueryForObject(Stringsql,ParameterizedRowMapperrm,Object...args)throwsDataAccessException
Useru=simple.queryForObject(sql,
ParameterizedBeanPropertyRowMapper.newInstance(
User.class),name); //这个行映射器的参数是可变长的Object...
returnu;
}
}
分享到:
评论

相关推荐

    JDBC学习笔记--JDBC学习笔记

    JDBC学习笔记 JDBC(Java DataBase Connectivity)是一种Java程序语言访问数据库的标准接口。它使得Java程序可以连接到各种不同的数据库管理系统,例如Oracle、SQL Server、MySQL、DB2、Sybase等。 JDBC的概念 ...

    jdbc学习手册 jdbc

    ### JDBC学习手册精要 #### 一、JDBC概述 JDBC(Java DataBase Connectivity),即Java数据库连接,是由Sun ...通过理解这些概念和API,开发者可以更好地使用JDBC进行数据库操作,提高应用程序的性能和安全性。

    JDBC学习资料

    详解JDBC,如何与数据库交互数据。 1 What is JDBC? 2 The most important hiberarchy of JDBC interface. 3 The type of JDBC. 4 The step of developping a JDBC app. 5 How to handle resultset? 6 Statement ****...

    浅谈Java通过JDBC连接Oracle数据库技术.pdf

    浅谈Java通过JDBC连接Oracle数据库技术.pdf

    spring-jdbc.rar源码 学习分析用

    首先,我们需要理解Spring JDBC的核心概念——JdbcTemplate。JdbcTemplate是Spring提供的一个抽象层,它简化了数据库访问,通过预编译SQL语句、异常转换等功能,避免了手动处理JDBC的繁琐步骤。在源码中,我们可以...

    jdbc学习手册

    Java Database Connectivity(JDBC)是Java编程语言中用于与各种数据库进行交互的一种标准接口。它由Sun Microsystems(现已被Oracle收购)...JDBC学习手册通常会涵盖这些主题,并提供示例代码来帮助读者理解和实践。

    jdbc学习笔记完美版

    JDBC的学习笔记涵盖了从基本概念到实际操作的各个方面,对于初学者来说是一份很好的参考资料。通过学习JDBC,开发者能够有效地在Java应用程序中集成数据库功能,实现数据的增删改查以及与存储过程的交互。理解和掌握...

    非常好的JDBC学习文档

    本学习文档将带你深入理解JDBC的核心概念,提升你在数据库操作方面的技能。 首先,了解**JDBC驱动类型**是非常基础的。JDBC驱动分为四种类型:Type 1、Type 2、Type 3和Type 4。Type 1是纯Java驱动,依赖于ODBC桥;...

    JDBC 学习笔记 JDBC 学习笔记

    **JDBC学习笔记** 在Java开发中,JDBC(Java Database Connectivity)是连接数据库的关键技术。它是Java API,允许Java程序与各种类型的数据库进行交互。本笔记将深入探讨JDBC的核心概念、工作原理以及实际应用。 ...

    JDBC 学习资料(word)

    学习 JDBC 时,不仅要理解这些基本概念,还需要实际操作数据库,编写 SQL 语句,练习使用 PreparedStatement、ResultSet 等对象,掌握事务处理和异常处理,以及如何优化数据库操作。通过实践,你可以更好地掌握 JDBC...

    达内jdbc学习笔记

    本笔记主要涵盖了达内在教授JDBC技术时的重点内容,旨在帮助学习者掌握如何使用Java进行数据库操作。 首先,我们来了解一下**数据库连接的基本概念**。在JDBC中,与数据库建立连接的过程通常包括以下步骤: 1. **...

    本人理解hibernate 与 JDBC 的最本质区别

    标题中的“本人理解hibernate 与 JDBC 的最本质区别”揭示了我们即将探讨的核心主题:Hibernate 和 JDBC 在处理数据库操作时的不同之处。 Hibernate 是一个对象关系映射(ORM)框架,而 JDBC(Java Database ...

    java(jdbc)学习

    JDBC与应用程序的关系体现在以下几点: 1. **标准化接口**:JDBC提供了一个标准化的接口,使得Java开发者无需了解特定数据库的底层细节,就能够进行数据库操作,提高了代码的通用性和可移植性。 2. **数据库驱动**...

    JDBC 基本概念与应用

    JDBC(Java Database Connectivity)是Java编程语言中用于与各种数据库进行交互的一种标准接口。它由一组Java类和接口组成,允许...理解并熟练掌握JDBC的基本概念和使用方法,是成为一名合格的Java数据库开发者的基础。

    jdbc jdbc jdbc

    综上所述,JDBC是Java与数据库交互的基础,理解并熟练掌握JDBC原理和实践,对于任何Java开发者来说都是至关重要的,无论是进行简单的数据操作,还是构建复杂的数据库应用。通过深入学习和实践,可以更好地应对各种...

    详细标准的jdbc学习资料

    本篇将深入讲解JDBC的基本概念、核心组件以及如何进行数据库操作。 一、JDBC基础 1. JDBC驱动:JDBC驱动是连接Java应用程序和数据库之间的桥梁。有四种类型的JDBC驱动,分别是:JDBC-ODBC桥接驱动、网络协议驱动、...

    JDBC笔记_JDBC学习笔记_

    在本篇JDBC学习笔记中,我们将深入探讨JDBC的基础知识、核心概念以及实际应用。 一、JDBC基础 1. JDBC驱动程序:JDBC驱动是连接Java应用程序和数据库之间的桥梁。根据实现方式,JDBC驱动分为四种类型:类型1(JDBC...

    学习资料JDBC PPT

    JDBC PPT 关于基本的JDBC 连接数据库 代码

    JDBC API教程与参考手册(第三版)前言+目录+第一,二章

    本书作为《JDBC API教程与参考手册》的第三版,主要针对Java开发者深入理解和掌握JDBC技术而编写。随着Java技术的发展以及数据库操作的需求变化,新版不仅更新了API版本,还加入了更多实践案例和技术细节。 - **...

Global site tag (gtag.js) - Google Analytics