- 浏览: 501553 次
- 性别:
-
文章分类
- 全部博客 (369)
- Java (48)
- Struts (1)
- Spring (4)
- Hibernate (7)
- WebServices (2)
- XML (3)
- web服务器 (12)
- PHP (16)
- FLEX (13)
- Flash (7)
- JavaScript (35)
- Ajax (4)
- Jquery (18)
- EXTJS (7)
- CSS (7)
- HTML (7)
- JSON (5)
- 好玩的 (1)
- 其他 (21)
- Oracle (35)
- mysql (12)
- Linux (12)
- JDBC (2)
- EJB3 (1)
- AOP (1)
- 正则表达式 (6)
- JSF (1)
- 设计模式 (1)
- RBAC (1)
- PowerDesigner (1)
- windows (1)
- 电脑工具软件 (3)
- SEO (3)
- maven (13)
- cms (9)
- JSP (5)
- jpbm (1)
- eclipse (8)
- sql (4)
- android (3)
- 浏览器 (5)
- 国外IT网站 (1)
- 文摘 (1)
- 文档 (31)
- doc命令 (1)
- webgl (1)
- html5 (1)
- ant (1)
- mongodb (0)
- 操作系统 (1)
- Dreamweaver (1)
- hadoop (2)
- xpath (1)
- nutch (1)
- window (1)
- xm (2)
- excel (1)
- httpclient (0)
- YII (2)
- CXF (1)
- Quartz (1)
- jsoup (2)
- wifi (2)
- logback (1)
- 硬件 (1)
- 工具 (3)
- freemark (1)
- ide (2)
- mail (1)
- log (1)
- ueditor (1)
- 链接 (1)
- reaver (2)
- js (1)
- .net (1)
- chrome (1)
- git (1)
- Docker (1)
- unicode (1)
- 多线程 (1)
- 并发 (1)
- Nashorn (3)
- Angular (1)
- curl (1)
- Cygwin (1)
- nashron (1)
- Babel (1)
- React Native (1)
- sip (1)
- openmeetings (1)
- IDEA (0)
- CAS (1)
最新评论
-
沉醉音乐的咖啡:
使用 preventDefault() 函数来阻止对表单的提交。 -
PhoenixHorse:
原表的索引啥的不就失效了吗
oracle修改表精度 -
yupengcc:
资料带走 3Q
RBAC模型 -
Java路:
...
JSON-LIB快速入门(转) -
damoqiongqiu:
utf-8下,E文字符占1个字节,中文字符占3个字节。如果一个 ...
AS3:截取定长度的字符串
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;
}
}
发表评论
-
javaweb 读取 classes 下的文件
2016-05-20 11:26 939http://www.cnblogs.com/hxling/a ... -
itext pdf
2015-08-19 23:17 620itext pdf 简单版 <script src= ... -
正则解析分红
2015-05-23 15:51 688// 表达式对象 Pattern p = Patte ... -
maven中指定main方法并且导入关联jar包,拷贝依赖包
2015-03-05 10:21 706<build> <plugins& ... -
nashorn shell
2015-02-05 18:21 685java8 doc http://docs.oracle.co ... -
java jvm 多线程 并发相关
2015-01-28 09:36 594Doug Lea并发编程文章全部译文 http://ifeve ... -
char <-->unicode
2015-01-06 15:20 653http://daoshud1.iteye.com/blog/ ... -
java gc
2014-12-10 14:10 0Java垃圾回收精粹 — Part1Java垃圾回收精粹 ... -
分页test
2014-12-01 09:20 600/** * * @author lan * ... -
java 正则模板
2014-10-08 10:44 522import java.util.HashMap; im ... -
java mail 带图片附件
2014-09-24 11:54 481package t; import java.uti ... -
“||”.split(“\\|”).length return 0 and 3
2014-08-26 10:00 626“||”.split(“\\|”) [] “| ... -
JRebel config
2014-08-03 17:43 2321http://zeroturnaround.com/sof ... -
java反编译
2014-07-25 18:01 639http://jd.benow.ca/ -
mvn tomcat7:run config
2014-07-24 16:37 816<project xmlns="http: ... -
Eclipse 编写应用程序设置代理
2014-07-17 10:18 883java -Dhttp.proxyHost=proxyho ... -
happens-before
2014-06-03 12:16 756内存一致性属性 Java Language Speci ... -
java.util.concurrent 的结构
2014-06-03 00:14 618... -
深入理解Java:注解(Annotation)自定义注解入门
2014-04-21 14:27 747要深入学习注解,我们就必须能定义自己的注解,并使用注解,在 ... -
test
2014-03-16 13:35 0http://hi.baidu.com/tag/data/fe ...
相关推荐
在Java编程中,MySQL数据库是常用的后端存储系统,它为开发者提供...理解这些基本概念和操作,对于进行Java后端开发至关重要。通过熟练掌握这些技能,开发者能够有效地与MySQL数据库进行交互,实现复杂的数据管理需求。
【参考资料与学习资源】 学习Struts和Hibernate的开发者可以通过官方文档、在线教程、书籍和社区论坛获取更多资料。Apache Struts官网和Hibernate官网提供了详细的API文档和示例代码,这些资源对于深入理解和实践这...
"浅谈Acegi配置 - Spring - Java - JavaEye论坛.mht"很可能深入讨论了Acegi的配置细节,包括如何设置安全性过滤器链,配置不同的访问控制策略,以及如何处理异常情况。在Acegi中,配置是非常关键的,因为它定义了...
浅谈JDBC的概念理解与学习 JDBC(Java Database Connectivity)是Java中用来对数据库进行统一访问、管理的一种机制。通过JDBC,开发人员可以使用标准Java API来连接不同的数据库管理系统。 - **JDBC驱动模型**:...
总的来说,解决MySQL中文乱码问题的核心是理解字符集的概念,包括客户端、服务器、数据库、表、列等多个层面的字符集设置,并确保它们之间的协调一致性。在遇到问题时,检查并调整这些设置通常能有效解决乱码问题。...
在IT行业中,自动采集程序和数据入库是两个关键的技术领域,尤其在大数据处理、网站...通过深入学习和理解这些概念,开发者可以构建高效且可靠的系统,从互联网海洋中抽取有价值的信息,并将其转化为可分析的数据资产。
#### 浅谈Unix和Linux下的int 在Unix和Linux环境下,`int`类型的实现细节可能因编译器和平台而异。理解整型的范围、溢出处理和类型转换规则,对于编写健壮和高效的系统级程序至关重要。 #### C++串口编程实例 C++...