`
lzh166
  • 浏览: 298047 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

myBatis应用

阅读更多

最近项目中使用myBatis(iBatis),所以目前对所遇的一些问题及有些模糊的地方在这里标注一下。

首先mybaits是一个“半自动化”的ORM框架。

需要使用的jar包:mybatis-3.0.2.jar(mybatis核心包),mybatis-spring-1.0.0.jar(与spring结合jar包)这些jar可以去官网下载。

 

配置文件:

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<settings>
		<!-- 对在此配置文件下的所有cache进行全局性开/关设置 true|false true -->
		<setting name="cacheEnabled" value="true"/>
		<!-- 全局性设置懒加载。如果设为‘关',则所有相关联的都会被初始化加载。 -->
		<setting name="lazyLoadingEnabled" value="false"/>
		<!-- 当设置为‘开’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。 -->
		<setting name="aggressiveLazyLoading" value="true"/>
		<!-- 允许和不允许单条语句返回多个数据集(取决于驱动需求) -->
		<setting name="multipleResultSetsEnabled" value="true"/>
		<!-- 使用列标签代替列名称。不用的驱动器有不同的作法。 -->
		<setting name="useColumnLabel" value="true"/>
		<!-- 允许JDBC生成主键。需要驱动器支持.如果设为了true,这个设置将强制使用被生成的主键,
		有一些驱动器不兼容不过仍然可以执行。 -->
		<setting name="useGeneratedKeys" value="true"/>
		<!-- 指定MyBatis是否并且如何来自动映射数据表字段与对象的属性。PARTIAL将只自动映射简单的,NONE没有嵌套的结果。
		FULL将自动映射所有复杂的结果。  -->
		<setting name="autoMappingBehavior" value="PARTIAL"/>
		<!-- 配置和设定执行器,SIMPLE执行器执行其它语句。REUSE执行器可能重复使用preparedstatements语句,BATCH执行器可以重复执行语句和批量更新。 -->
		<setting name="defaultExecutorType" value="SIMPLE"/>
		<!-- 设置一个时限,以决定让驱动器等待数据库回应的多长时间为超时. 正整数 -->
		<setting name="defaultStatementTimeout" value="25000"/>
	</settings>
	
	<!-- 类型别名 -->
	<typeAliases>
		<typeAlias type="com.igit.storage.client.model.ClientRelation" alias="ClientRelation"/>
	</typeAliases>
	
	<!-- 分页查询拦截器 
	<plugins>
		<plugin interceptor="com.igit.storage.util.DiclectStatementHandlerInterceptor"></plugin>
		<plugin interceptor="com.igit.storage.util.DiclectResultSetHandlerInterceptor"></plugin>
	</plugins>
	-->
	<!-- 加载映射文件 -->
	<mappers>
		<mapper resource="com/igit/storage/client/model/ClientRelation.xml"/>
	</mappers>
</configuration> 

 

映射文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC 
 "-//mybatis.org//DTD Mapper 3.0//EN" 
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 定义命名空间 --> 
<mapper namespace="com.igit.storage.client.model.ClientRelation">
 <resultMap type="ClientRelation" id="relationResult"><!-- 对象应用关联查询 -->
  <association property="client" column="clientId" javaType="Client" select="com.igit.storage.client.model.Client.selectById">
  </association>
 </resultMap>
 <insert id="insert" parameterType="ClientRelation" useGeneratedKeys="true" keyProperty="id">
   insert into S_ClientRelation(relation,clientId)
    values(#{relation},#{client.clientId})
 </insert>
 
 <delete id="delete" parameterType="long" flushCache="true">
   delete from S_ClientRelation where relation=#{value}
 </delete>
 <!-- flushCache="true" 清空缓存 -->
 <delete id="remove"  parameterType="long" flushCache="true">
   delete from S_ClientRelation where id=#{id}
 </delete>
 <!-- 批量删除多个,参数是数组  key为array  map-->
 <delete id="removeMore"  parameterType="map" flushCache="true">
   delete from S_ClientRelation 
   where id in 
   <foreach collection="array" index="index" item="ids" open="(" separator="," close=")">
   #{ids}
   </foreach>
 </delete>
 <select id="selectById" resultMap="relationResult" parameterType="long">
   select * from S_ClientRelation where id=#{value}
 </select>
 
 <select id="selectByRelation" resultMap="relationResult" parameterType="long">
   select * from S_ClientRelation where relation=#{value}
 </select>
 
 <select id="selectByPage" resultMap="relationResult">
  select * from S_ClientRelation 
 </select>
 
 <select id="selectByCount" resultType="long">
  select count(*) from S_ClientRelation 
 </select>
 
 <select id="selectMaxRelation" resultType="long">
  select max(relation) from s_clientRelation
 </select>
</mapper>

 

 

修改application.xml文件

 

<!-- 因为Hibernate的TransactionManager可以向下兼容JdbcTransactionManager,所以 mybatis事务处理仍和hibernate共用-->
 <bean id="transactionManager"
  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory">
   <ref local="sessionFactory" />
  </property>
 </bean>
 <!-- 用注解来实现事务管理 -->   
 <tx:annotation-driven transaction-manager="transactionManager"/> 
 
 <tx:advice id="txAdvice" transaction-manager="transactionManager">
  <tx:attributes>
   <tx:method name="*" />
  </tx:attributes>
 </tx:advice>

 

<!-- mybatis  sqlSessionFactory 注入datasource和配置文件-->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
	    <property name="configLocation" value="classpath:mybatisconfig.xml" />  
	    <property name="dataSource" ref="dataSource" />  
	</bean>
	<!-- 定义mybatis操作模板类似hibernateTemplate -->
	<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
		<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
	</bean>

 

代码实现

package com.igit.storage.client.service.imp;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.RowBounds;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.util.Assert;
import org.springside.core.dao.Page;

import com.igit.exception.BusinessException;
import com.igit.storage.client.model.Client;
import com.igit.storage.client.model.ClientRelation;
import com.igit.storage.client.service.ClientRelationService;

public class ClientRelationServiceImp implements ClientRelationService {
	
	private SqlSessionTemplate sqlSessionTemplate;
	/**
	 * 新增关联客户
	 */
	public void addRelationByClients(Long relation, List<Client> clients) {
		//判断该关联id是否存在
		if(!isValidRelation(relation)){
			throw new BusinessException("该关联关系不存在!");
		}
		//新增关联客户
		for(Client client : clients){
			ClientRelation cr = new ClientRelation();
			cr.setRelation(relation);
			cr.setClient(client);
			Assert.notNull(client, "客户不能为Null");
			sqlSessionTemplate.insert(ClientRelation.class.getName()+".insert", cr);
		}
	}
	/**
	 * 取消关联客户
	 */
	public void cancelRelation(Long relation) {
		sqlSessionTemplate.delete(ClientRelation.class.getName()+".delete", relation);
	}

	/**
	 * 创建关联客户
	 */
	public void createRelation(List<Client> clients) {
		// 客户是否可以创建关联
		if(clients.size()<=1){
			throw new BusinessException("无法创建关联,关联客户不能低于2个!");
		}
		ClientRelation cr = new ClientRelation();
		cr.setRelation(getMaxRelation());
		//创建关联客户
		for(Client client : clients){
			cr.setClient(client);
			Assert.notNull(client, "客户不能为Null");
			sqlSessionTemplate.insert(ClientRelation.class.getName()+".insert", cr);
		}

	}
	/**
	 * 获取最大关联ID
	 * @return
	 */
	private Long getMaxRelation(){
		Long relation = 1L;
		Long maxRelation = (Long) sqlSessionTemplate.selectOne(ClientRelation.class.getName()+".selectMaxRelation");
		if(maxRelation==null){
			return relation;
		}
		return maxRelation+1;
	}

	/**
	 * 分页获取关联客户
	 */
	public Page getClientRelationByPage(int startIndex, int pageSize) {
		List<ClientRelation> list = sqlSessionTemplate.selectList(ClientRelation.class.getName()+".selectByPage", new RowBounds(startIndex,pageSize));
		Long totalCount = (Long) sqlSessionTemplate.selectOne(ClientRelation.class.getName()+".selectByCount");
		return new Page(list,totalCount,pageSize,startIndex);
	}

	/**
	 *  获取没有关联的客户列表
	 */
	public Page getNoRelationClients(int startIndex,int pageSize) {
		List<Client> list = sqlSessionTemplate.selectList(Client.class.getName()+".selectSingleClient", new RowBounds(startIndex,pageSize));
		Long totalCount = (Long) sqlSessionTemplate.selectOne(Client.class.getName()+".selectSingleCount");
		return new Page(list,totalCount,pageSize,startIndex);
	}

	/**
	 * 删除关联客户
	 */
	public void removeRelationByClients(Long relation, List<Client> clients) {
		//1.该客户是否可以从关联中移除
		List<ClientRelation> list = getRelationClients(relation);
		if((list.size()-clients.size())<=1){
			throw new BusinessException("不允许删除,关联客户至少存在2个!");
		}
		//2.移除客户
		for(Client c : clients){
			Map<String,Long> params = new HashMap<String,Long>();
			params.put("relation", relation);
			params.put("clientId", c.getClientId());
			sqlSessionTemplate.delete(ClientRelation.class.getName()+".remove", params);
		}
	}

	
	private boolean isValidRelation(Long relation) {
		List<ClientRelation> list = getRelationClients(relation);
		if(list.size()<=1){
			return false;
		}
		return true;
	}

	private List<ClientRelation> getRelationClients(Long relation) {
		List<ClientRelation> list = sqlSessionTemplate.selectList(ClientRelation.class.getName()+".selectByRelation", relation);
		return list;
	}

	public SqlSessionTemplate getSqlSessionTemplate() {
		return sqlSessionTemplate;
	}

	public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
		this.sqlSessionTemplate = sqlSessionTemplate;
	}
}

  

 

单元测试请看上一篇文章

 

 

分享到:
评论
2 楼 lzh166 2011-07-11  
我这里的insert当然单条插入了,如果批量插入的话就传入的list集合:
tangpengtao 写道
您好,我想咨询您,batch insert是怎么处理的,SqlSessionTemplate有两个构造方法.一个batch,一个是insert 我想问一下你如何动态控制 是单条插入,和批量插入

我这里的insert当然单条插入了,如果批量插入的话就传入的list集合:
<insert id="insertBatch" > insert into student ( <include refid="Base_Column_List" /> )   values   <foreach collection="list" item="item" index="index" separator=",">        (null,#{item.name},#{item.sex},#{item.address},#{item.telephone},#{item.tId})    </foreach></insert>
1 楼 tangpengtao 2011-07-08  
您好,我想咨询您,batch insert是怎么处理的,SqlSessionTemplate有两个构造方法.一个batch,一个是insert 我想问一下你如何动态控制 是单条插入,和批量插入

相关推荐

    MyBatis应用.xmind

    本思维导图主要是关于MyBatis应用相关的知识梳理,包括MyBatis实现CRUD操作、MyBatis开发DAO的两种方式、全局配置文件SqlMapConfig.xml、输入类型结果类型、连接池和事务控制、动态SQL、复杂查询、延迟加载策略、...

    《Mybatis应用技术》复习资料.doc

    ### MyBatis应用技术知识点详解 #### 一、MyBatis简介 - **定义**: MyBatis 是一个优秀的持久层框架,它简化了 JDBC 的操作流程,使开发者能够更专注于 SQL 语句的编写,而无需关注底层的数据库连接、预处理及结果...

    mybatis应用

    【MyBatis 应用详解】 MyBatis 是一款优秀的持久层框架,它支持 SQL 查询、存储过程以及高级映射。MyBatis 的主要优势在于它消除了大部分 JDBC 代码和手动设置参数以及结果集检索的过程。通过简单的 XML 或注解进行...

    【MyBatis入门】—— 第一个MyBatis应用

    【MyBatis入门】—— 第一个MyBatis应用 MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解...

    mybatis demo

    在基于Dubbo的MyBatis应用中,Dubbo作为服务治理框架,负责服务的注册、发现、调用以及负载均衡等。MyBatis则作为数据访问层,处理具体的数据库操作。开发者需要在MyBatis的配置文件(mybatis-config.xml)中配置...

    课堂笔记MyBatis应用分析与最佳实践

    课堂笔记MyBatis应用分析与最佳实践

    课堂笔记MyBatis应用分析与最佳实践(1)

    【课堂笔记】MyBatis应用分析与最佳实践(1)

    MyBatis基本使用总结

    MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。在使用MyBatis时,我们需要理解其核心组件和工作原理,以便更好地进行数据库操作。 一、MyBatis核心配置文件 MyBatis的核心配置文件...

    Spring-MYBatis企业应用实战-有详细目录

    最后,可能还会介绍如何将Spring-MYBatis应用部署到服务器,如Tomcat,并讲解一些常见的线上问题排查方法。同时,为了适应微服务架构,可能还会探讨Spring Cloud与MyBatis的结合,以及Spring Boot在分布式系统中的...

    spring+mybatis企业应用实战 PDF完整目录 方便阅读器跳转阅读

    7. **实战案例**:提供实际的企业应用场景,如用户管理、订单处理等,演示如何将Spring和Mybatis应用于具体业务。 8. **性能优化与最佳实践**:分享在使用Spring和Mybatis时的优化技巧和经验,包括SQL优化、缓存...

    spring+mybatis应用ppt

    个人编写用于spring+mybatis开发的课件,ppt版本的,有什么不足之处欢迎指教。

    《spring+mybatis 企业应用实战》源码、类库全资料

    在企业级应用开发中,Spring 和 MyBatis 是两个非常重要的框架。Spring 作为一个全面的后端开发框架,提供依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)等核心功能,极大地提高了开发效率和代码的可维护...

    《Spring MVC MYBatis企业应用实战+源码》

    《Spring MVC MYBatis企业应用实战+源码》是一份深度探讨如何在企业环境中整合并高效使用Spring MVC和MyBatis两大主流Java框架的资源包。这个资源包含了一本PDF电子书《spring+mybatis企业应用实战》以及配套的源...

    Mybatis应用mysql存储过程查询数据实例

    Mybatis应用mysql存储过程查询数据实例 Mybatis是一款流行的持久层框架,mysql是一个广泛使用的关系数据库管理系统。在实际开发中,经常需要使用Mybatis来调用mysql存储过程来查询数据。下面我们将详细介绍Mybatis...

    mybatis-3-config.dtd mybatis-3-mapper.dtd

    理解这两个DTD文件的结构和作用,对于开发者来说至关重要,能够帮助他们编写出规范、高效的MyBatis应用。在开发过程中,合理配置MyBatis的全局设置,以及精心设计SQL映射文件,能够大大提高代码的可维护性和性能。

    MyBatis常用项目范例

    此外,你可能还会发现日志配置和异常处理的部分,这对于调试和优化MyBatis应用至关重要。MyBatis允许配置不同的日志实现,以便跟踪SQL执行过程和性能。而针对可能出现的数据库操作异常,MyBatis提供了统一的处理方式...

    myBatis案例.zip

    4. **DAO层实现**:DAO(Data Access Object)层是myBatis应用的重要组成部分,它封装了对数据库的所有操作。在My01和My02的案例中,可能会有对应的UserDao接口及其实现,如UserMapperImpl,通过SqlSession执行SQL并...

    MyBatis-3文档整理.pdf

    它提供了一个核心对象SqlSessionFactory,所有MyBatis应用程序都围绕它构建。以下是MyBatis主要知识点的详细解释: 1. MyBatis概述: - MyBatis是一个提供了动态SQL、存储过程、高级映射的持久层框架。 - 它减少...

    MyBatis整合Spring中间件jar包 mybatis-spring-1.3.0.jar

    MyBatis-Spring是MyBatis与Spring框架的整合组件,其主要目的是简化在Spring应用中集成MyBatis的过程,使两者能够无缝协作...mybatis-spring-1.3.0.jar这个包就包含了这些功能的实现,是构建Spring+MyBatis应用的基础。

Global site tag (gtag.js) - Google Analytics