`
悲剧了
  • 浏览: 145202 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ibatis/Mybatis实战分享与讨论

阅读更多
以前有类似讨论,互联网项目要用spring jdbc 或者ibatis 不然会有种种问题,神乎其神,到底是为啥呢?hibernate到底有啥不好,做互联网项目还是先看看ibatis是个什么东东吧
关于ibatis入门如何?
入门相对容易,好像没什么有他官方上那本pdf更好的,而且有中文版,看起来速度刷刷的

ibatis主要提供了什么?
数据库字段到model映射,这个通过强大的xml配置解决,可以做出类似hibernate的效果,但是sql语句是你自己书写,也没有面向对象建立数据库的压力,又比spring jdbc之类强大

模板配置sql到底多强大?
可以动态配置sql,可以使用ognl表达式,你的sql用广告词,叫做会跳舞的sql,以前看帖子,有哥们说他们项目自己该造,用freemarker搭建了一个模板,很强大,到底有那些好处,具体不太了解,我觉得现在的绝对够用,就是配置有些繁琐
比如我们ognl严重
<where>
	       <if test="@Ognl@isNotEmpty(clickId)">
				AND click_id = #{clickId}
			</if>
</where>

public class Ognl {
	
	/**
	 * 可以用于判断String,Map,Collection,Array是否为空
	 * @param o
	 * @return
	 */
	public static boolean isEmpty(Object o) throws IllegalArgumentException {
		if(o == null) return true;

		if(o instanceof String) {
			if(((String)o).length() == 0){
				return true;
			}
		} else if(o instanceof Collection) {
			if(((Collection)o).isEmpty()){
				return true;
			}
		} else if(o.getClass().isArray()) {
			if(Array.getLength(o) == 0){
				return true;
			}
		} else if(o instanceof Map) {
			if(((Map)o).isEmpty()){
				return true;
			}
		}else {
			return false;
//			throw new IllegalArgumentException("Illegal argument type,must be : Map,Collection,Array,String. but was:"+o.getClass());
		}

		return false;
	}
	
	/**
	 * 可以用于判断 Map,Collection,String,Array是否不为空
	 * @param c
	 * @return
	 */	
	public static boolean isNotEmpty(Object o) {
		return !isEmpty(o);
	}
	
	public static boolean isNotBlank(Object o) {
		return !isBlank(o);
	}
...略


ibatis这些点怎么搭建一个良好快速的开发环境呢?(也就是对ibatis提供的特性进行了强力的封装)
1.代码生成器需要统一的几个点
利用代码生成器,我们每张表的常规操作,CRUD于基于简单字段查询条件的分页都自动生成映射到model上了
统一了几个点:namespace=table.xxx xxx代表具体操作,每张表生成适合都是统一的
也自动生成了action--service--dao--xml
2.底层统一接口调用的问题
Dao层继承BaseIbatisDao,上面统一的几个点造成了一些Crud于有条件的分页可以放到顶层的Dao中
不可能每次调用都要打开sqlsession 关闭sqlsession
那么模板方法模式封装好这个流程,然后每次调用就可以了,每次直接调用模板sqlsessionTemplete
类似模板方法:
public Object execute(SqlSessionCallback action)  {
			SqlSession session = null;
			try {
				session = sqlSessionFactory.openSession();
				Object result = action.doInSession(session);
				return result;
			}finally {
				if(session != null) session.close();
			}
		}

		public Object executeBatch(SqlSessionCallback action)  {
			SqlSession session = null;
			try {
				session = sqlSessionFactory.openSession(false);
				Object result = action.doInSession(session);
				return result;
			}finally {
				if(session != null) {
					session.commit(true);
					session.close();
				}
			}
		}


3.分页问题解决
这个没想象那么难,见下面模板跟代码
    <select id="AdClickinfo.findPage" resultMap="RM.AdClickinfo">
    	SELECT <include refid="AdClickinfo.columns" />
	    FROM ad_clickinfo
		<include refid="AdClickinfo.findPage.where"/>

		<if test="@Ognl@isNotEmpty(sortColumns)">
			ORDER BY ${sortColumns}
		</if>
    </select>
<sql id="AdClickinfo.findPage.where">
		<!-- ognl访问静态方法的表达式 为@class@method(args),以下为调用rapid中的Ognl.isNotEmpty()方法,还有其它方法如isNotBlank()可以使用,具体请查看Ognl类 -->
		<where>
	       <if test="@Ognl@isNotEmpty(clickId)">
				AND click_id = #{clickId}
			</if>
	       <if test="@Ognl@isNotEmpty(adId)">
				AND ad_id = #{adId}
			</if>
	       <if test="@Ognl@isNotEmpty(clickDatetimeBegin)">
				AND click_datetime >= #{clickDatetimeBegin}
		   </if>
		   <if test="@Ognl@isNotEmpty(clickDatetimeEnd)">
				AND click_datetime &lt;= #{clickDatetimeEnd}
		   </if>
	       <if test="@Ognl@isNotEmpty(clickIp)">
				AND click_ip = #{clickIp}
			</if>
	       <if test="@Ognl@isNotEmpty(clickFrom)">
				AND click_from = #{clickFrom}
			</if>
		</where>
	</sql>

	public static Page pageQuery(SqlSessionTemplate sqlSessionTemplate,String statementName,String countStatementName, PageRequest pageRequest) {

		Number totalCount = (Number) sqlSessionTemplate.selectOne(countStatementName,pageRequest);
		if(totalCount == null || totalCount.longValue() <= 0) {
			return new Page(pageRequest,0);
		}

		Page page = new Page(pageRequest,totalCount.intValue());

		Map filters = new HashMap();
		filters.put("offset", page.getFirstResult());
		filters.put("pageSize", page.getPageSize());
		filters.put("lastRows", page.getFirstResult() + page.getPageSize());
		filters.put("sortColumns", pageRequest.getSortColumns());

		Map parameterObject = PropertyUtils.describe(pageRequest);
		filters.putAll(parameterObject);

		List list = sqlSessionTemplate.selectList(statementName, filters,page.getFirstResult(),page.getPageSize());
		page.setResult(list);
		return page;
	}

public class Page<T> implements Serializable,Iterable<T>
{
	
	protected List<T> result;

	protected int pageSize;

	protected int pageNumber;
    /* added by xiajun 新增设置当前页数方法 2010-11-02*/
	public void setPageNumber(int pageNumber) {
		this.pageNumber = pageNumber;
	}

	protected int totalCount = 0;
	
	public Page(PageRequest p, int totalCount) {
		this(p.getPageNumber(),p.getPageSize(),totalCount);
	}
	
	public Page(int pageNumber,int pageSize,int totalCount) {
		this(pageNumber,pageSize,totalCount,new ArrayList(0));
	}
	
	public Page(int pageNumber,int pageSize,int totalCount,List<T> result) {
		if(pageSize <= 0) throw new IllegalArgumentException("[pageSize] must great than zero");
		this.pageSize = pageSize;
		this.pageNumber = PageUtils.computePageNumber(pageNumber,pageSize,totalCount);
		this.totalCount = totalCount;
		setResult(result);
	}





实际使用遇到的问题
1.关于灵活性的问题

你需要model中的几个属性值,你是调用自动生成的代码取得整个model,还是自己写一个,如果这个查询发生次数多,必须自己写
2.关于配置复杂的问题
看下官方文档高级映射,就知道这个难度不大,写着麻烦,配置很繁琐,为了一个特殊的查询是否有必要取那样做,前后端都hashmap,跨过model映射这个,如果要自己写,你的model要符合,我们的model不满足,全部直接都hashmap
分享到:
评论

相关推荐

    Ibatis/mybatis代码生成工具

    《Ibatis/mybatis代码生成工具详解》 在Java开发领域,Ibatis和Mybatis作为两款广泛应用的持久层框架,极大地简化了数据库操作。为了进一步提高开发效率,开发者们设计了一系列的代码生成工具,如"Ibatis Helper"和...

    MyBatisLink:用于从 Java 代码导航到 xml 的 IBatis/MyBatis Eclipse 插件-开源

    IBatis/MyBatis Eclipse 插件帮助编码人员从 java 代码导航到 IBatis/MyBatis 配置 xml 文件。 IBatis/MyBatis 的 sqlmap 元素可以在程序员按下 Ctrl 并点击 Java 代码中的 sqlmap 元素 id 时显示出来。 该插件还...

    从iBatis迁移到MyBatis

    标题 "从iBatis迁移到MyBatis" 暗示了本次讨论的主题是关于数据库持久层框架的升级,从较早的iBatis转向更现代的MyBatis。iBatis是一个Java语言中的SQL映射框架,而MyBatis是在iBatis的基础上发展起来的,提供了更多...

    ibatis2mybatis-master.zip

    描述中的“一键转换,不用自己再手动替换标签”意味着这个工具可以自动化处理iBATIS与MyBatis之间的转换工作,减少了开发者手动修改大量代码的时间和精力。通常,这样的转换涉及到的主要任务包括: 1. **XML配置...

    ibatis2mybatis-master

    可以帮你将 ibatis 2.x sqlmap 文件转换为 myBatis 3.x mapper 文件,该工具是使用了 Ant 构建任务进行 XSTL 转换和一些语法文字替换 该工具下载下来使用非常简单,把你要转换的所有 sqlmap 文件放到 source 文件夹...

    ibatis2.X升级mybatis3.X之曲径通幽处

    Ibatis和Mybatis都是广泛使用的Java ORM(对象关系映射)框架,它们帮助开发者将数据库操作与业务逻辑解耦。本篇文章将探讨从ibatis2.x升级到mybatis3.x的过程,揭示其中的技术变迁和核心变化。 Ibatis2.x是一款轻...

    ibatis和mybatis对比

    ibatis和mybatis对比

    2011最新ibatis+Mybatis+Spring整合文档全集以及案例

    Spring也提供了对事务管理、数据访问集成(包括与iBatis/Mybatis的整合)、Web开发等模块的支持。 整合iBatis或Mybatis与Spring的核心在于,Spring可以管理这些数据访问组件的生命周期,并通过其IoC容器进行依赖...

    ibatis插件

    在本话题中,我们将主要讨论Ibatis插件的安装和使用。 首先,让我们来了解如何安装Ibatis插件。通常,Ibatis插件的安装涉及到以下几个步骤: 1. **选择插件**:根据项目需求,选择合适的Ibatis插件。例如,MyBatis...

    mybatis-3.4.1

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github

    Ibatis和Mybatis实例源码

    《Ibatis与Mybatis源码解析》 Ibatis和Mybatis是两个著名的Java持久层框架,它们在数据库操作中提供了高效、灵活的解决方案。本文将深入探讨这两个框架的源码,帮助开发者理解其内部机制,提升Java编程能力。 首先...

    iBatis和MyBatis对比

    在MyBatis中,配置文件的结构与iBatis有所不同。全局配置文件通常命名为`Configuration.xml`,而映射文件则定义了数据库表与Java对象之间的映射关系。全局配置文件中可以设置的内容包括: 1. `properties`:定义了...

    ibatis mybatis crud 完整代码

    `iBatis` 提供了一种将SQL语句与Java代码解耦的方法,通过XML或注解来配置和映射原生信息,使开发者能够编写动态、灵活的SQL。 `MyBatis` 是 `iBatis` 的后续版本,由社区发展而来。它进一步简化了数据库操作,增强...

    ibatis mybatis 分页 crud 完整代码

    总的来说,这份资源对于学习和实践Ibatis与Mybatis的CRUD操作以及分页功能非常有价值。通过理解并掌握这些知识,开发者能够有效地管理数据库操作,提升应用的性能和用户体验。同时,提供的公司网站链接也为开发者...

    ibatis和mybatis的区别

    在里面总结了ibatis和mybatis的主要区别,包括xml文件等

    springMvc_ibatis_mybatis

    通过这个项目,初学者可以掌握Spring MVC的基本架构,理解iBatis或MyBatis如何处理SQL,以及如何利用JDBC与数据库进行通信。通过实践,开发者可以更好地理解这三个框架的优缺点,为日后的项目开发打下坚实的基础。

    数据持久化框架-MyBatis.html

    Mybatis官网:https://mybatis.org/mybatis-3/ Mybatis中文官网:https://mybatis.org/mybatis-3/zh/index.html 2、Mybatis的历史 Mybatis前身是Apache的一个开源项目iBatis,2010年该项目由Apache迁移到google ...

    iBatis+MyBatis[中文教程]

    iBatis和MyBatis是两个非常流行的Java持久层框架,它们在数据库操作中提供了强大的支持,极大地简化了数据访问层(DAO)的实现。这篇教程将深入介绍这两个框架的核心概念、功能以及如何进行实际应用。 首先,iBatis...

    myBatis和ibatis的区别

    ### myBatis与ibatis的区别 #### 一、概述 myBatis与ibatis是两款在Java领域中非常流行的持久层框架,它们均基于SQL映射机制,为开发者提供了便捷的方式来处理数据库操作。两者间的关系密切,ibatis是myBatis的...

    mybatis/ibatis代码生成器

    数据库代码生成器,支持mybatis/ibatis两个版本;注意,ibatis(ibatis2)和mybaits(ibatis3)的xml文件中有一些语法不一样,例如 select 等元素的 parameterClass 属性改为了 parameterType 属性,resultClasss 属性改为了 ...

Global site tag (gtag.js) - Google Analytics