数据层三大框架
来源:互联网 发布:国家文件数据怎么保存 编辑:程序博客网 时间:2024/06/06 08:57
JDBC
使用步骤
1. 设置数据库连接信息,通过DriverManager得到conn。
2. 通过conn得到Statement。
3.在Statement里设置sql信息。
(1)PreparedStatement
预编译,性能优化,安全。
Callable Statement存储过程
String sql = "{callinsert_students(?,?,?,?)}";
(2)CallableStatement调用存储过程
CallableStatement stmt =conn.prepareCall(sql);
stmt.setString(1,"Cas013");
stmt.setString(2,"Sean");
stmt.setInt(3, 50);
stmt.setString(4,"M");
// 在此CallableStatement对象中执行SQL语句,该语句可以是任何种类的SQL语句。
stmt.execute();
4.提交数据库查询,通过 ResultSet获得结果;
5.释放statement,conn。
SQL注入
是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的SQL语句段或命令,从而利用系统的 SQL 引擎完成恶意行为的做法。
事务
事务:数据库管理系统的执行单位。属性:ACID。
A原子性事务有一个资源失败,则必须回滚,
C一致性事务必须保持资源状态的一致性
I隔离性各个事务对同一数据资源进行操作时,必须相互隔离
D持久性事务一旦提交,其结果必须保证是持久的
事务隔离级别:隔离级别是对事务并发控制的等级。
四种隔离级别:
1.Read Uncommitted A不会读到B回滚的数据
2. ReadCommitted大部分主流数据库默认策略,一个事务不会独到另一个事务已修改但没有提交的数据
3. RepeatableRead不会出现A多次读到的数据不一致
4. SerializableRead以串行方式运行。
默认级别满足不了需求时,使用锁来控制。
连接池
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。
DBCP,C3P0
实现:获得datasource发生改变。
DBCP配置
ibatis
优点
1. 简单,代码减少
2. Sql和代码分离
3. 增加可移植性
4. Sql可以优化
使用步骤
1.配置sqlMapClients---->sqlMap---->datasource
<bean id="dataSource_CALS"class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName"value="${cals_driverClassName}"/>
<property name="url"value="${cals_url}"/>
<property name="username"value="${cals_username}"/>
<property name="password"value="${cals_password}"/>
<!-- 连接池启动时的初始值-->
<property name="initialSize"value="${cals_initialSize}"/>
<!-- 连接池的最大值 -->
<property name="maxActive"value="${cals_maxActive}"/>
<!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
<property name="maxIdle"value="${cals_maxIdle}"/>
<!-- 最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
<property name="minIdle"value="${cals_minIdle}"/>
</bean>
<bean id="dataSource_IF"class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"value="${interface_driverClassName}"/>
<property name="url"value="${interface_url}"/>
<property name="username"value="${interface_username}"/>
<property name="password"value="${interface_password}"/>
<!-- 连接池启动时的初始值-->
<property name="initialSize"value="${interface_initialSize}"/>
<!-- 连接池的最大值 -->
<property name="maxActive"value="${interface_maxActive}"/>
<!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
<property name="maxIdle"value="${interface_maxIdle}"/>
<!-- 最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
<property name="minIdle"value="${interface_minIdle}"/>
</bean>
<bean id="calsSqlmap"class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="dataSource"ref="dataSource_CALS"/>
<property name="configLocation">
<value>classpath:ibatis_Cals.xml</value>
</property>
</bean>
<bean id="ifSqlmap"class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="dataSource"ref="dataSource_IF"/>
<property name="configLocations">
<list>
<value>classpath:ibatis_IF.xml</value>
<value>classpath:ibatis_Base.xml</value>
</list>
</property>
</bean>
<bean id="sqlMapClients"class="java.util.HashMap">
<constructor-arg>
<map>
<entrykey="calsSqlmap"value-ref="calsSqlmap"/>
<entrykey="ifSqlmap"value-ref="ifSqlmap"/>
</map>
</constructor-arg>
</bean>
2. 建baseDao,创建getSqlClient()方法,获得SqlMap。
3. 开发dao和配置文件。
publicclass DeployOutDaoextendsBaseDao{
public List<EOSBYSENDSEX> getOneSendSEXData()throws SQLException {
List list = super.getSqlMapClient("calsSqlmap").queryForList(
"calsSqlmap.GetOneSendSEXData",null);
return list ==null ?null :(List<EOSBYSENDSEX>)list;
}
}
<sqlMapnamespace="calsSqlmap">
<typeAlias alias="EOSBYSENDSEX"type="com.jd.MW.WMSR_WMS.model.EOSBYSENDSEX"/>
<select id="GetOneSendSEXData"resultClass="EOSBYSENDSEX">
SELECT * FROM V_EOSBYSENDSEX with (nolock) Where SENDNO IN(
SELECT TOP 5 SENDNO FROM V_EOSBYSENDSEX with (nolock)
WHERE EOSSTATUS=0 and ExpType='SEX'
)
order by sendno,container ASC
</select>
</sqlMap>
动态映射dynamic
<selectid="getUsers"
parameterClass="user"
resultMap="get-user-result">
select
id,
name,
sex
from t_user
<dynamicprepend="WHERE">
<isNotEmptyprepend="AND"property="name">
(name like #name#)
</isNotEmpty>
<isNotEmptyprepend="AND"property="address">
(address like #address#)
</isNotEmpty>
</dynamic>
</select>
<isGreaterThanprepend="AND"property="age"
compareValue="18">
(age=#age#)
</isGreaterThan>
事务
sqlMap.startTransaction();
sqlMap.commitTransaction();
Hibernate
使用步骤
1. 配置数据库信息
2. 配置orm信息
3. 获得SessionFactory
4. 获得session
5. Session.close()
ORM 对象关系映射
一对一一对多多对多组件
数据库操作
查询
hql查询
sql查询
修改
session.save(),session.saveorupdate(),session.delete()
缓存
一级缓存 session级别
session的周期之内,map格式存储。
可使用evict(),flush()方法清理,节约内存。
二级缓存 SessionFactory级别
按照设置对对象的查询进行缓存。常用缓存:oscache,ehcache。
适合缓存的情况:
1. 很少被修改的数据
2. 不会被并发访问的数据
延迟加载
对关联实体的查询进行延迟,用到时才检索数据库。
1. 关联实体是单个实体时(包括一对一、多对一):当 Hibernate加载某个实体时,延迟的关联实体将是一个动态生成代理对象。
2. 关联实体是多个实体时(包括一对多、多对多):此时关联实体将以集合的形式存在,Hibernate将使用 PersistentSet、PersistentList、PersistentMap、PersistentSortedMap、PersistentSortedSet等集合来管理延迟加载的实体。
放弃延迟加载:修改配置
锁
乐观锁,悲观锁
N+1次查询问题
一对多,多对一等关联查询时,对关联实体的查询一条sql就能查到,但Hibernate生成了n+1条sql。
解决方法:
1. 使用延迟加载。
2. 修改抓取策略,fetch=’join’。
- 数据层三大框架
- 数据字典框架
- 通用数据验证框架
- Validation框架验证数据
- Struts2_validation 框架验证数据
- ibatisNet 数据访问框架
- 数据访问框架
- 数据持久层框架
- 主数据治理框架
- 数据挖掘知识框架
- Mina框架数据接收
- 大数据框架
- 数据绑定框架:Databinding
- 大数据工具/框架
- CI框架导出数据
- CI框架导入数据
- 数据挖掘基本知识框架
- HttpClient框架提交数据
- 事物层spring简介
- HDOJ 1222
- 两本云计算书籍光盘及源码分享:走进云计算和云计算的关键技术与应用实例
- 修改CentOS的主机名hostname
- Ant release
- 数据层三大框架
- android开发随笔 RelativeLayout
- 利用ajax判断用户名是否存在
- Spring基础之三:annotation配置注入
- 多重继承和void*的糗事
- UNIX shell 常用命令列表
- 优先级反转及解决办法
- 《云计算周度参考2012》1-12期打包下载
- linux常用命令