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>
<entry key="calsSqlmap"value-ref="calsSqlmap"/>
<entry key="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’。