目录
-
连接池
-
分类
-
UNPOOLED
- 不使用连接池
- 就是简简单单的注册驱动 获取链接 返回链接 的操作
-
POOLED
- 获取连接时的过程分析
- 变量
- poolMaximumActiveConnections : 活动池最大容量
- poolMaximumIdleConnections : 空闲池最大容量
- idleConnections : 空闲连接池, 是一个list集合
- activeConnections : 活动连接池, 是一个list集合
- 过程(伪代码)
- if (idleConnections.size() > 0 ) { 还有空闲的连接可以使用, 返回空闲连接 }
- else { 无空闲连接可供使用
- if ( activeConnections.size() < poolMaximumActiveConnections){ 活动池还有空间, 再创建一个新的连接并返回 }
- else { 活动池没有多余空间来创建新的连接
- if ( 最老的连接已经过期 ){ 释放最老的连接, 创建一个新的连接并返回 }
- else { 线程等待 }
- }
- }
- 变量
- 获取连接时的过程分析
-
JNDI
- 采用服务器提供的JNDI技术实现, 不同的服务器拿到的DataSource是不一样的
- 如果不是web或者maven的war工程, 是不能使用的
-
-
-
事务
-
自动提交事务
- 设置方法: 在方法openSession中传入参数true即可
- 不推荐设置自动提交事务
-
-
动态sql
-
概念
- 可以根据传入参数的不同来动态改变sql语句
-
条件查询
-
<!--动态sql 条件查询--> <select id="findByCondition" resultType="user" parameterType="user" select * from user <where> <if test="username != null and username != ''"> and username like #{username} </if> </where> </select>
-
-
foreach
-
<!--动态sql foreach--> <select id="findByIds" resultType="user" parameterType="list"> select * from user <where> <if test="list != null and list.size() > 0"> <foreach collection="list" open="and id in(" close=")" item="id" separator=","> #{id} </foreach> </if> </where> </select>
-
-
-
多表查询
-
表间关系
- 一对一
- 一对多
- 多对一
- 多对多
-
一对一
- 两种方法
-
修改映射配置文件
- 在从表的实体类中添加主表的对象引用, 并添加get/set方法
- 在映射配置文件中添加如下代码
-
<resultMap id="mapAccountUser" type="account"> <id property="id" column="aid"></id> <result property="uid" column="uid"></result> <result property="money" column="money"></result> <association property="user" column="uid" javaType="user"> <id property="id" column="id"></id> <result property="username" column="username"></result> <result property="birthday" column="birthday"></result> <result property="sex" column="sex"></result> <result property="address" column="address"></result> </association> </resultMap> <!--多表查询--> <select id="findAllAccountUser" resultMap="mapAccountUser"> select a.ID aid ,a.UID,a.MONEY, u.* from user u, account a where u.id=a.UID </select>
-
- resultMap中, 必须指明全部的属性映射关系, 否则查询结果无法正常封装
- (此方法不常用) 再创建一个新的类, 继承其中一个表的实体类, 并在类中添加想要封装的数据库表的字段即可
-
- 两种方法
-
一对多
- 在主表的实体类中添加从表的对象集合, 并添加get/set方法
- 修改配置文件, 代码如下
-
<resultMap id="mapUser" type="user"> <!--必须先配置主键的对应关系--> <id property="id" column="id"></id> <!--配置剩余非主键的对应关系--> <result property="username" column="username"></result> <result property="birthday" column="birthday"></result> <result property="sex" column="sex"></result> <result property="address" column="address"></result> <collection property="accounts" ofType="account"> <id property="id" column="aid"></id> <result property="uid" column="uid"></result> <result property="money" column="money"></result> </collection> <collection property="roles" ofType="role"> <id property="id" column="rid"></id> <result property="roleDesc" column="ROLE_DESC"></result> <result property="roleName" column="ROLE_NAME"></result> </collection> </resultMap> <!--一对多--> <select id="findAllUserAccount" resultMap="mapUser"> select u.*,a.id aid,a.UID,a.MONEY from user u left outer join account a on u.id = a.UID </select>
-
-
多对多
- sql语句如下
-
<!--多对多--> <select id="findAllUserRole" resultMap="mapUser"> select u.*,r.id rid,r.ROLE_DESC,r.ROLE_NAME from user u left outer join user_role ur on u.id = ur.UID left outer join role r on ur.RID = r.ID </select>
-
- sql语句如下
-
-
JNDI
-
概念
- Java Naming and Directory Interface (java命名与文件接口)
- SUN公司开发
- 用于模仿windows注册表功能
-