在上一篇的日志中讲到了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;
}
}
分享到:
相关推荐
iBatis,现已被更名为MyBatis,是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。...通过这个简单的"iBatis入门Helloworld"项目,你可以快速掌握iBatis的基础操作,并为进一步学习和应用打下坚实基础。
### iBATIS 三个版本对比分析 iBATIS是一款优秀的持久层框架,它极大地简化了SQL映射编程的复杂度。随着技术的发展,iBATIS经历了多个版本的迭代,包括iBATIS v1、v2以及最新的iBATIS v3。本文将详细对比这三个版本...
【标题】"iBATIS Hello World代码" 是一篇关于如何开始使用iBATIS框架的教程。iBATIS是一个优秀的开源Java持久层框架,它简化了数据库操作与Java应用程序的集成,使得开发者可以专注于业务逻辑而不必过于关心底层的...
3.iBatis2学习笔记:单表映射 .doc 4.iBatis2学习笔记:SqlMap的配置总结(18条).doc 5.iBatis2学习笔记:入参和返回值的问题.doc 6.iBatis2学习笔记:一对多映射(双向).doc 7.iBatis2学习笔记:多对多映射(双向)...
【标题】:“ibatis 第一个helloWorld” 【知识点详解】: Ibatis,作为一个轻量级的持久层框架,是Java开发中的重要工具,它将SQL语句与Java代码分离,提高了代码的可读性和可维护性。在这个“ibatis 第一个hello...
在本教程"**MyBatis_01_HelloWorld**"中,我们将探索如何使用MyBatis进行基本的数据库操作,实现一个简单的“Hello, World”示例。 首先,我们需要了解MyBatis的核心组件:SqlSessionFactory和SqlSession。...
### 三、Ibatis3的配置与初始化 #### 1. **初始化过程** - **读取配置文件**:使用 `Resources.getResourceAsReader()` 方法读取配置文件,例如 `CONFIG_FILE_PATH`。 - **创建 SqlSessionFactory**:通过 `...
本篇文章将探讨从ibatis2.x升级到mybatis3.x的过程,揭示其中的技术变迁和核心变化。 Ibatis2.x是一款轻量级的ORM框架,它允许开发者通过SQL Map配置文件来编写SQL语句,提供了灵活的SQL控制。然而,随着技术的发展...
这个"iBatis.Net 入门例子"就像是.NET开发中的"Hello, World!",它通过一个简单的控制台程序展示了如何配置和使用iBatis.Net进行数据访问。 首先,让我们了解一下iBatis.Net的核心概念。iBatis.Net由以下几个关键...
【标题】"mybatis的Helloworld" 在Java开发领域,MyBatis是一个广泛使用的持久层框架,它简化了数据库操作,使开发者能够更方便地进行数据存取。本篇文章将详细解析MyBatis的“Hello World”实例,帮助初学者快速...
### iBATIS 3:简介与新功能 iBATIS是一个开源框架,旨在简化Java应用程序中的数据访问层(DAO)的开发。它提供了一种基于SQL映射的方式,使开发者能够更加灵活地处理数据库交互,而无需编写繁琐的JDBC代码。iBATIS...
【初识Mybatis源码解析】 Mybatis 是一个流行的、基于Java的持久层框架,它简化了数据库操作,使得开发者可以更加专注于SQL语句的编写,而无需关注JDBC的繁琐工作。本篇将深入剖析Mybatis的核心概念,以及其在实际...
3. Struts、Spring与Ibatis的集成: - Struts作为MVC框架,主要负责视图与控制器的交互。在项目中,`cn.gov.yingtan.digital.portal.web.bz0101.javabean`可能代表实体类,而`...
【标题】"IBATIS3代码生成器"是一款专为基于IBATIS3框架的项目设计的工具,它能够自动生成常见的SQL映射文件、Java DAO接口和实现类,大大提高了开发效率,降低了手动编写这些代码的工作量。该工具的核心理念是通过...
#### 三、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 In Action:iBATIS的安装和配置】 iBATIS,作为一个知名的持久层框架,其安装和配置过程相对简洁,对于熟悉C#和ADO.NET的开发者来说,理解并应用这个框架是进一步提升开发效率的关键。iBATIS并非一个独立...
在IT行业中,构建高效、可扩展的Web应用是至关重要的,而"Maven搭建SpringMVC+Spring+Ibatis"的组合则提供了一种强大的解决方案。本文将深入探讨这些技术及其集成,帮助你理解和掌握如何利用它们来构建现代化的Java ...
3. emis05(iBATIS+Oracle).zip:这个项目特别提到了Oracle数据库,表明Ibatis在处理Oracle特定的SQL特性时,如PL/SQL、游标等,依然表现得游刃有余。Ibatis的灵活性使其能够适应各种数据库,包括Oracle、MySQL、SQL ...
iBATIS,全称为“Integrated Business Applications Using the SQL Maps”,是一个数据映射框架,由Anders Cui在2007年的文章中提及。iBATIS并非传统的对象关系映射(ORM)工具,而是采取了一种混合式解决方案,融合...