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

iBatis3 Note(三) : 初识Hello World (补充)

阅读更多

在上一篇的日志中讲到了iBatis HelloWorld。自己在写完以后发现有些问题

在FirstTest 类中的两个size的确是能显示出正确的记录数,但问题在于两个对象的属性无法取得

其实问题在于一个叫helloworld.map.xml的文件里需要做些修改

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD iBatis Mapper 3.0 //EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="basic.HelloWorld">
	<select id="getHelloworlds" 
			resultType="java.util.List" 
			resultMap="helloWorldMap">
		select hw_id, name, age from t_helloworld
	</select>
	<select id="getHelloworldsMapByHwId" 
			resultType="HelloWorld"
			resultMap="helloWorldMap"
			parameterType="int"
			statementType="PREPARED">
		select hw_id, name, age from t_helloworld where hw_id = #{hw_id}
	</select>
	<resultMap id="helloWorldMap" type="HelloWorld">
		<id property="hwId" column="hw_id"/>
		<result property="name" column="name"/>
		<result property="age" column="age"/>
	</resultMap>
</mapper>

 

 

在这里添加了个很重要的resultMap ,在这个之后我就能获得正确的值了

 

好了下面重新看下代码,为了节约时间写了个工具类

IBatisUtil.java

import java.io.IOException;
import java.io.Reader;
import java.sql.SQLException;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.Transaction;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;

/**
 * ibatis工具类,仅用做测试
 * @author Charles King
 * IBatisUtil.class
 */
public class IBatisUtil {
	
	private static final String IBATIS_CONFIG_XML = "/ibatis-config.xml";
	private final static ThreadLocal<SqlSession> sessionThread = new ThreadLocal<SqlSession>();
	private final static ThreadLocal<Transaction> transactionThread = new ThreadLocal<Transaction>();
	private IBatisUtil(){
		
	}
	
	/**
	 * 获得已有sqlSession没有就创建
	 * @return
	 */
	public static SqlSession openSessionIfNotExist(){
		if(isSessionNotNull())
			return getSqlSession();
		return createNewSqlSession();
	}
	
	/**
	 * 关闭sqlSession
	 */
	public static void closeSqlSession(){
		if(isSessionNotNull()){
			getSqlSession().close();
		}
	}
	
	/**
	 * 创建新的sqlSession
	 * @return
	 */
	private static SqlSession createNewSqlSession(){
		String configXml = "basic" + IBATIS_CONFIG_XML;
		SqlSessionFactoryBuilder builder = null;
		SqlSessionFactory factory = null;
		SqlSession session = null;
		Reader config;
		try {
			builder = new SqlSessionFactoryBuilder();
			config = Resources.getResourceAsReader(configXml);
			factory = builder.build(config);
			session = factory.openSession();
			setSessionInThread(session);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return session;
	}
	
	public static Transaction getCurrentTransactionNotAutoCommit(){
		return getCurrentTransaction(false);
	}
	
	public static Transaction getCurrentTransaction(boolean autoCommit){
		//session为空,不需要transaction
		if(!isSessionNotNull()) return null;
		//session不为空
		Transaction t = getCurrentTransaction();
		//1. 已经有transaction
		if(t!=null) return t;
		//2. 没有transaction
		TransactionFactory factory = new JdbcTransactionFactory();
		t = factory.newTransaction(getSqlSession().getConnection(), autoCommit);
		setTxInThread(t);
		return t;
	}
	
	public static Transaction getCurrentTransactionWithNewSession(boolean autoCommit){
		openSessionIfNotExist();
		return getCurrentTransaction(autoCommit);
	}
	
	public static void rollback() throws SQLException{
		if(isTransactionNotNull()){
			getCurrentTransaction().rollback();
		}
	}
	
	public static void commit() throws IBatisException{
		if(isTransactionNotNull()){
			try {
				getCurrentTransaction().commit();
			} catch (SQLException e) {
				throw new IBatisException(e.getNextException());
			}
		}
	}
	
	public static void commitAndClose() throws IBatisException{
		try {
			commit();
			getCurrentTransaction().close();
		} catch (SQLException e) {
			throw new IBatisException(e.getNextException());
		}
		sessionThread.remove();
		transactionThread.remove();
	}
	
	/**
	 * 存入LocalThread
	 * @param session
	 */
	private static void setSessionInThread(SqlSession session){
		sessionThread.set(session);
	}
	
	/**
	 * 从LocalThread中获得sqlSession
	 * @return
	 */
	private static SqlSession getSqlSession() {
		return sessionThread.get();
	}
	
	/**
	 * 判断LocalThread中sqlSession是否为空
	 * @return
	 */
	private static boolean isSessionNotNull(){
		if(getSqlSession()==null) 
			return false;
		return true;
	}
	
	private static void setTxInThread(Transaction tx){
		transactionThread.set(tx);
	}
	
	private static Transaction getCurrentTransaction(){
		Transaction transaction = transactionThread.get();
		return transaction;
	}
	
	private static boolean isTransactionNotNull(){
		if(getCurrentTransaction() != null) return true;
		return false;
	}
	
	public static int insert(String statement, Object parameter) throws IBatisException{
		IBatisAssert.assertSqlSessionNotNull(getSqlSession());
		return getSqlSession().insert(statement, parameter);
	}
	
	public static int insert(String statement) throws IBatisException{
		IBatisAssert.assertSqlSessionNotNull(getSqlSession());
		return getSqlSession().insert(statement);
	}

	public static int update(String statement, Object parameter) throws IBatisException{
		IBatisAssert.assertSqlSessionNotNull(getSqlSession());
		return getSqlSession().update(statement, parameter);
	}
	
	public static int update(String statement) throws IBatisException{
		IBatisAssert.assertSqlSessionNotNull(getSqlSession());
		return getSqlSession().update(statement);
	}
	
}

 

 

引入自定义异常类

IBatisException.java

 

public class IBatisException extends Exception {
	
	private static final long serialVersionUID = -8341903249485894181L;

	public IBatisException(String errorMsg){
		super(errorMsg);
	}
	
	public IBatisException(Exception e) {
		super(e);
	}
	
	public IBatisException(Throwable t) {
		super(t);
	}
	
}

 

 

之后看下重新改过的测试类吧

FirstTest.java

 

import java.util.List;

import util.IBatisException;
import util.IBatisManager;
import util.IBatisUtil;

public class FirstTest {
	
	public static void main(String[] args) throws IBatisException {
		IBatisUtil.getCurrentTransactionWithNewSession(false);
		IBatisManager<HelloWorld> manager = null;
		
		List<HelloWorld> list = null;
		HelloWorld helloworld = null;
		try {
			manager = new IBatisManager<HelloWorld>();
			
			
			list = manager.selectList("getHelloworlds");
			System.out.println(list.size());
			System.out.println(manager.selectList("getHelloworlds").get(0));
			
			helloworld = manager.selectOne("getHelloworldsMapByHwId", 1);
			System.out.println(helloworld.toString());
			
			
		} finally {
			IBatisUtil.commitAndClose();
		}
	}
	
}

 

 

同样复下HelloWorld.java

 

import java.io.Serializable;

@SuppressWarnings("serial")
public class HelloWorld implements Serializable {
	
	private Integer hwId;
	private String name;
	private Integer age;
	//setters & getters...
	
	@Override
	public String toString() {
		String str = "hw_id:" + hwId + "\n"
		           + "name: " + name + "\n"
		           + "age:  " + age +"\n";
		return str;
	}
}

 

 

 

0
0
分享到:
评论
2 楼 zhou_1985_liang 2011-11-30  
IBatisAssert是什么类?发出来看看
1 楼 qq123zhz 2010-08-17  
不错,最近也在用ibatis3

相关推荐

    iBatis入门Helloworld

    iBatis,现已被更名为MyBatis,是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。...通过这个简单的"iBatis入门Helloworld"项目,你可以快速掌握iBatis的基础操作,并为进一步学习和应用打下坚实基础。

    iBATIS 三个版对比

    ### iBATIS 三个版本对比分析 iBATIS是一款优秀的持久层框架,它极大地简化了SQL映射编程的复杂度。随着技术的发展,iBATIS经历了多个版本的迭代,包括iBATIS v1、v2以及最新的iBATIS v3。本文将详细对比这三个版本...

    ibatis hello world code

    【标题】"iBATIS Hello World代码" 是一篇关于如何开始使用iBATIS框架的教程。iBATIS是一个优秀的开源Java持久层框架,它简化了数据库操作与Java应用程序的集成,使得开发者可以专注于业务逻辑而不必过于关心底层的...

    iBatis2学习笔记

    3.iBatis2学习笔记:单表映射 .doc 4.iBatis2学习笔记:SqlMap的配置总结(18条).doc 5.iBatis2学习笔记:入参和返回值的问题.doc 6.iBatis2学习笔记:一对多映射(双向).doc 7.iBatis2学习笔记:多对多映射(双向)...

    ibatis 第一个helloWorld

    【标题】:“ibatis 第一个helloWorld” 【知识点详解】: Ibatis,作为一个轻量级的持久层框架,是Java开发中的重要工具,它将SQL语句与Java代码分离,提高了代码的可读性和可维护性。在这个“ibatis 第一个hello...

    MyBatis_01_HelloWorld

    在本教程"**MyBatis_01_HelloWorld**"中,我们将探索如何使用MyBatis进行基本的数据库操作,实现一个简单的“Hello, World”示例。 首先,我们需要了解MyBatis的核心组件:SqlSessionFactory和SqlSession。...

    Ibatis3手册 Ibatis3参考手册

    ### 三、Ibatis3的配置与初始化 #### 1. **初始化过程** - **读取配置文件**:使用 `Resources.getResourceAsReader()` 方法读取配置文件,例如 `CONFIG_FILE_PATH`。 - **创建 SqlSessionFactory**:通过 `...

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

    本篇文章将探讨从ibatis2.x升级到mybatis3.x的过程,揭示其中的技术变迁和核心变化。 Ibatis2.x是一款轻量级的ORM框架,它允许开发者通过SQL Map配置文件来编写SQL语句,提供了灵活的SQL控制。然而,随着技术的发展...

    iBatis.Net 入门例子,类似于 HelloWorld

    这个"iBatis.Net 入门例子"就像是.NET开发中的"Hello, World!",它通过一个简单的控制台程序展示了如何配置和使用iBatis.Net进行数据访问。 首先,让我们了解一下iBatis.Net的核心概念。iBatis.Net由以下几个关键...

    mybatis的Helloworld

    【标题】"mybatis的Helloworld" 在Java开发领域,MyBatis是一个广泛使用的持久层框架,它简化了数据库操作,使开发者能够更方便地进行数据存取。本篇文章将详细解析MyBatis的“Hello World”实例,帮助初学者快速...

    ibatis3资料-介绍

    ### iBATIS 3:简介与新功能 iBATIS是一个开源框架,旨在简化Java应用程序中的数据访问层(DAO)的开发。它提供了一种基于SQL映射的方式,使开发者能够更加灵活地处理数据库交互,而无需编写繁琐的JDBC代码。iBATIS...

    博客(传琦):初识Mybatis 对应的源码

    【初识Mybatis源码解析】 Mybatis 是一个流行的、基于Java的持久层框架,它简化了数据库操作,使得开发者可以更加专注于SQL语句的编写,而无需关注JDBC的繁琐工作。本篇将深入剖析Mybatis的核心概念,以及其在实际...

    ibatis总结 ibatis ibatis ibatis ibatis

    3. Struts、Spring与Ibatis的集成: - Struts作为MVC框架,主要负责视图与控制器的交互。在项目中,`cn.gov.yingtan.digital.portal.web.bz0101.javabean`可能代表实体类,而`...

    IBATIS3代码生成器

    【标题】"IBATIS3代码生成器"是一款专为基于IBATIS3框架的项目设计的工具,它能够自动生成常见的SQL映射文件、Java DAO接口和实现类,大大提高了开发效率,降低了手动编写这些代码的工作量。该工具的核心理念是通过...

    helloworld

    #### 三、IBATIS的适用场景 1. **现有数据库系统**: - 当系统需要与现有的数据库集成时,通常只有部分SELECT SQL或存储过程可供使用,而具体的表结构信息不对外公开。在这种情况下,IBATIS可以很好地满足需求,...

    ibatis-common包

    ibatis-common包ibatis-common包ibatis-common包ibatis-common包ibatis-common包ibatis-common包ibatis-common包ibatis-common包ibatis-common包ibatis-common包ibatis-common包

    一个程序员的自省 iBATIS In Action:iBATIS的安装和配置

    【iBATIS In Action:iBATIS的安装和配置】 iBATIS,作为一个知名的持久层框架,其安装和配置过程相对简洁,对于熟悉C#和ADO.NET的开发者来说,理解并应用这个框架是进一步提升开发效率的关键。iBATIS并非一个独立...

    maven搭建SpringMVC+spring+ibatis

    在IT行业中,构建高效、可扩展的Web应用是至关重要的,而"Maven搭建SpringMVC+Spring+Ibatis"的组合则提供了一种强大的解决方案。本文将深入探讨这些技术及其集成,帮助你理解和掌握如何利用它们来构建现代化的Java ...

    ibatis源码

    3. emis05(iBATIS+Oracle).zip:这个项目特别提到了Oracle数据库,表明Ibatis在处理Oracle特定的SQL特性时,如PL/SQL、游标等,依然表现得游刃有余。Ibatis的灵活性使其能够适应各种数据库,包括Oracle、MySQL、SQL ...

    一个程序员的自省 iBATIS In Action:什么是iBATIS(一)

    iBATIS,全称为“Integrated Business Applications Using the SQL Maps”,是一个数据映射框架,由Anders Cui在2007年的文章中提及。iBATIS并非传统的对象关系映射(ORM)工具,而是采取了一种混合式解决方案,融合...

Global site tag (gtag.js) - Google Analytics