数据层三大框架

来源:互联网 发布:国家文件数据怎么保存 编辑:程序博客网 时间: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.释放statementconn

 

SQL注入

    是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的SQL语句段或命令,从而利用系统的 SQL 引擎完成恶意行为的做法

事务

事务:数据库管理系统的执行单位。属性:ACID

A原子性事务有一个资源失败,则必须回滚,

C一致性事务必须保持资源状态的一致性

I隔离性各个事务对同一数据资源进行操作时,必须相互隔离

D持久性事务一旦提交,其结果必须保证是持久的

 

事务隔离级别:隔离级别是对事务并发控制的等级。

四种隔离级别:

1.Read Uncommitted A不会读到B回滚的数据

2. ReadCommitted大部分主流数据库默认策略,一个事务不会独到另一个事务已修改但没有提交的数据

3. RepeatableRead不会出现A多次读到的数据不一致

4. SerializableRead以串行方式运行。

 

默认级别满足不了需求时,使用锁来控制。

连接池

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。

DBCPC3P0

实现:获得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级别

按照设置对对象的查询进行缓存。常用缓存:oscacheehcache

适合缓存的情况:

1.      很少被修改的数据

2.      不会被并发访问的数据

延迟加载

对关联实体的查询进行延迟,用到时才检索数据库。

1.      关联实体是单个实体时(包括一对一、多对一):当 Hibernate加载某个实体时,延迟的关联实体将是一个动态生成代理对象。

2.      关联实体是多个实体时(包括一对多、多对多):此时关联实体将以集合的形式存在,Hibernate将使用 PersistentSetPersistentListPersistentMapPersistentSortedMapPersistentSortedSet等集合来管理延迟加载的实体。

 

放弃延迟加载:修改配置

乐观锁,悲观锁

N+1次查询问题

一对多,多对一等关联查询时,对关联实体的查询一条sql就能查到,但Hibernate生成了n+1sql

解决方法:

1.      使用延迟加载。

2.      修改抓取策略,fetch=’join’

原创粉丝点击