3.6 使用命名空间区分相同的id
public class IBatisSameSQLMapId {
// Ibatis核心对象,可以进行数据库操作
private static SqlMapClient sqlMapper;
static {
try {
// 读取IBatis的数据库连接配置文件
Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
// 创建Ibatis核心对象
sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
// 关闭文件输入流
reader.close();
} catch (IOException e) {
// Fail fast.
throw new RuntimeException("Something bad happened while building the SqlMapClient instance." + e, e);
}
}
/**
* @param args
*/
public static void main(String[] args) throws Exception {
queryForList();
}
public static void queryForList() throws Exception {
// Ibatis技术框架将sqlMapId和sql绑定在一起,那么如果在多个映射文件中存在相同名称sqlMapId,会出现问题。
// 解决问题的方法:
// 1) 修改映射ID名称,保证不相同。
// 2) 增加命名空间来解决名称相同的问题。类似于java中的包的概念。
// 如果指定命名空间,那么访问SQLID时,必须执行命名空间
// 命名空间如果想要使用,必须让IBatis启用命名空间,需要修改连接配置文件。
String sqlMapId = "user.selectList";
sqlMapper.queryForList(sqlMapId);
}
}
3.6 sql文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="user">
<!--
select标签表示声明查询SQL语句
id属性表示sql语句关联ID,当程序访问这个ID时,等同于访问这个SQL语句。
resultClass属性表示当查询结果有了之后,将结果直接转换为指定类型的对象
-->
<!--
SQL中的##表示SQL语句需要参数,可以代替?号
-->
<!--
查询结果使用反射的方式将所有查询字段的值放置在对象的属性当中,如果查询字段不存在,那么属性值为null
usercode -> setUsercode
usercode setUser_code
user_code -> setUser_code
如果表字段名称和对象属性名称不一致的场合,可以通过别名的方式保持一致,进行数据的封装。
-->
<select id="selectUserByCode" resultClass="com.cjf.ibatis.bean.User">
select
usercode as user_code,
username,
userpswd,
orgtype
from t_user
where usercode = #usercode#
</select>
<!--
resultClass属性表示查询的每一条数据转换成指定类型的对象
如果结果为多条数据,转换后会自动封装为集合对象
-->
<select id="selectUsers" resultClass="com.cjf.ibatis.bean.User">
select * from t_user
</select>
<select id="selectList" resultClass="com.cjf.ibatis.bean.User">
select * from t_user
</select>
</sqlMap>
---------------------
3.7 使用缓存
public class IBatisQueryCache {
// Ibatis核心对象,可以进行数据库操作
private static SqlMapClient sqlMapper;
static {
try {
// 读取IBatis的数据库连接配置文件
Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
// 创建Ibatis核心对象
sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
// 关闭文件输入流
reader.close();
} catch (IOException e) {
// Fail fast.
throw new RuntimeException("Something bad happened while building the SqlMapClient instance." + e, e);
}
}
/**
* @param args
*/
public static void main(String[] args) throws Exception {
queryForList();
}
public static void queryForList() throws Exception {
// Ibatis技术框架查询缓存
// ibatis将查询结果和映射ID关联起来,放置在缓存当中,当下一回再次访问相同的映射ID时,不再访问数据库,而是从缓存中获取
// 提供查询效率。
// 使用缓存的步骤:
// 1) 启用缓存,修改连接配置文件,增加缓存的操作。
// 查询缓存对于修改可能会发生问题。修改操作会导致数据不统一。
String sqlMapId = "userCache.selectUsers";
List<User> userList = sqlMapper.queryForList(sqlMapId);
for ( User u : userList ) {
System.out.println( u.getUsername() );
}
System.out.println( "***************************" );
sqlMapId = "userCUD.updateUser";
User user = new User();
user.setUsercode("1");
user.setUsername("zhangsan");
sqlMapper.update(sqlMapId, user);
System.out.println( "***************************" );
userList = sqlMapper.queryForList(sqlMapId);
for ( User u : userList ) {
System.out.println( u.getUsername() );
}
}
}
3.7 sql文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="userCache">
<!-- 缓存模型,可以将查询结果放置缓存当中
id属性表示模型的引用标示ID
type属性表示缓存的处理方式
LRU : 最近最少使用的对象
MEMOERY : 基于引用的缓存策略,和垃圾回收器有关系。
FIFO :First In First Out 先进先出
OSCACHE : 基于OSCACHE组件的缓存策略。
-->
<cacheModel type="LRU" id="userCache">
<property name="size" value="100"/>
<!-- 当执行某一个操作时,可以将查询结果给清空掉,下一回查询时还是会访问数据库,获取最新的数据 -->
<flushOnExecute statement="userCUD.updateUser"/>
<!-- 当到达指定时间时,缓存的数据自动清除。 -->
<flushInterval hours="2" minutes="30" seconds="30"/>
</cacheModel>
<select id="selectUsers" resultClass="com.cjf.ibatis.bean.User" cacheModel="userCache">
select * from t_user
</select>
</sqlMap>