`

iBATIS入门示例及注释

阅读更多

工程的结构:


 

 

 

一、SqlMapConfig.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig        
    PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"        
    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>

	<!-- 加载数据库属性文件 -->
	<properties resource="SqlMap.properties" />

	<!-- 
		1、lazyLoadingEnabled:是否延迟加载(只加载必要信息而推迟其他未明确请求数据的技术),默认值是true。
		2、cacheModelsEnabled:ibatis的高速缓存,将近期使用过的数据保存到内存中,值为true或false,全局控制sqlMapClient的缓存
		3、enhancementEnabled:值true或false,作用用来表示是否使用cglib中那些已经优化的javabean类来提高延迟加载的性能。
		4、useStatementNameSpaces:是否使用命名空间(true/false).假如使用在引用的时候需要加上(命名空间+ID)
		来访问,默认是false。
		5、 errorTracingEnabled:是否启用错误日志,在开发期间建议设为"true" 以方便调试     
	-->
	<settings cacheModelsEnabled="true" lazyLoadingEnabled="true"
		enhancementEnabled="true" errorTracingEnabled="true"
		useStatementNamespaces="true" />

	<transactionManager type="JDBC"><!-- type指定事务管理器:JDBC,JTA,EXTERNAL, -->
		<dataSource type="SIMPLE"><!-- type值由:SIMPLE,DBCP,JNDI -->
			<property value="${JDBC.Driver}" name="JDBC.Driver" />
			<property value="${JDBC.ConnectionURL}"
				name="JDBC.ConnectionURL" />
			<property value="${JDBC.Username}" name="JDBC.Username" />
			<property value="${JDBC.Password}" name="JDBC.Password" />
		</dataSource>
	</transactionManager>

	<!-- 引入所有的SQL Map配置文件,这里的路径是classpath的相对路径 -->
	<sqlMap resource="com/wy/pojo/Customer.xml" />

</sqlMapConfig>

 

二、Customer.xml

 

<?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="cust">
	<!-- 类型别名 , 为一个pojo类取一个别名, 以便在下面用时候, 直接用别名引用对象 -->
	<typeAlias alias="Customer" type="com.wy.pojo.Customer" />
	<!-- 数据返回类型,我用的是一张表 , id 与select 标签的id一致, 就可以指定返回是多个pojo,resultMap结果映射到预先定义的resultMap中  -->
	<resultMap class="Customer" id="getAllCustomer">
		<result property="id" column="id" />
		<result property="name" column="name" />
		<result property="email" column="email" />
		<result property="adress" column="adress" />
		<result property="phone" column="phone" />
	</resultMap>
	<!-- 根据自己的SQL查询语句, 及传入的参数来决定它的返回类型,resutlClass="返回类型" parameterClass="传入的参数类型"  -->
	<select id="selectAllRecords" resultClass="Customer">
		<![CDATA[
		    select * from customer
		]]>
	</select>
	<select id="selectOneRecord" parameterClass="java.lang.Integer"
		resultMap="getAllCustomer">
		<![CDATA[
		     select * from customer where id = #id#
		 ]]>    
	</select>
	<!-- #id#由方法的传入参数填充 -->
	<insert id="insertOneRecord" parameterClass="Customer">
		<!-- 序列的返回值是int类型,最好对应数据库id列;keyProperty="id"的id是对应的BEAN里面的属性 -->
		<selectKey resultClass="int" keyProperty="id">
			select customerPKSquence.nextVal as id from dual
		</selectKey>
		<!-- 屏蔽特殊符 -->
		<![CDATA[ 
            insert into customer (id,name, email, adress, phone) values (#id#,#name#, #email#, #adress#, #phone#)
         ]]>
	</insert>

	<update id="updateOneRecord" parameterClass="Customer">
		<![CDATA[
		   update customer set name=#name#, email=#email#, adress=#adress#,phone=#phone# where id=#id#
		]]>
	</update>

	<delete id="deleteOneRecord" parameterClass="java.lang.Integer">
		<![CDATA[ 
		   delete from customer where id = #id#
		]]>
	</delete>
</sqlMap>

 

 

<statement id="statementName"
        [parameterClass="some.class.Name"] //表示输入的参数类型为Class
        [resultClass="some.class.Name"] //表示输出的参数类型为Class
        [parameterMap="nameOfParameterMap"] //表示输入的参数类型为Map
        [resultMap="nameOfResultMap"] //表示输出的参数类型为Class
        [cacheModel="nameOfCache"]
        >
        select * from t_user where sex = [?|#propertyName#]
        order by [$simpleDynamic$]
    </statement>

1、对于参数定义,尽量使用parameterClass,即直接将pojo作为statement的调用参数,如果输入的参数是java.util.map,那么map中的键值将作为输入参数,普通基本类型就是直接输入。
2、对于返回结果而言,尽量也使用resultClass,直接将字段名与pojo相对应。
3、而parameterMap与resultMap实现了pojo到数据库字段的映射配置,parameterMap 使用较少,而resultMap 则大多用于嵌套查询以及存储过程的 
 

 

Customer.java

 

package com.wy.pojo;

public class Customer {
	private Integer id;

	private String name;

	private String email;

	private String adress;

	public Customer() {
	}

	public Customer(Integer id, String name, String email, String adress,
			String phone) {
		super();
		this.id = id;
		this.name = name;
		this.email = email;
		this.adress = adress;
		this.phone = phone;
	}

	public String getAdress() {
		return adress;
	}

	public void setAdress(String adress) {
		this.adress = adress;
	}

	private String phone;

	public String getEmail() {
		return email;
	}

	public Integer getId() {
		return id;
	}

	public String getName() {
		return name;
	}

	public String getPhone() {
		return phone;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public String toString() {
		StringBuffer sb = new StringBuffer();
		sb.append("{");
		sb.append("id:" + id + ",");
		sb.append("name:'" + name + "',");
		sb.append("email:'" + email + "',");
		sb.append("adress:'" + adress + "',");
		sb.append("phone:'" + phone + "'");
		sb.append("}");
		return sb.toString();
	}

}

 

三、CustomerDaoImpl.java

 

package com.wy.dao.impl;

import java.sql.SQLException;
import java.util.List;

import com.ibatis.sqlmap.client.SqlMapClient;
import com.wy.dao.ICustomerDao;
import com.wy.pojo.Customer;
import com.wy.util.SQLMapClient;

public class CustomerDaoImpl implements ICustomerDao {

    // 查询数据的SQL
    private static final String SELECT_All_CUSTOMERS = "cust.selectAllRecords";
    private static final String SELECT_ONE_CUSTOMER = "cust.selectOneRecord";
    //插入数据
    private static final String INSERT_ONE_CUSTOMER  = "cust.insertOneRecord";
    //删除数据
    private static final String DELETE_ONE_CUSTOMER  = "cust.deleteOneRecord";
    //修改
    private static final String UPDATE_ONE_CUSTOMER  = "cust.updateOneRecord";

    private SqlMapClient sqlMapClient = null;

    public CustomerDaoImpl() {
        sqlMapClient = SQLMapClient.getSqlMapClient();
    }

    //插入数据
    @Override
    public void add(Customer student) {
        try {
            sqlMapClient.insert(INSERT_ONE_CUSTOMER, student);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    //删除
    @Override
    public void deleteCustomerById(int id) {
        try {
            sqlMapClient.delete(DELETE_ONE_CUSTOMER, id);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    //查询所有数据
    @SuppressWarnings("unchecked")
    @Override
    public List<Customer> queryAllCustomers() {
        // TODO Auto-generated method stub
        List<Customer> list = null;
        try {
            list = sqlMapClient.queryForList(SELECT_All_CUSTOMERS);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return list;
    }
    public Customer queryOneCustomer(Integer id){
        Customer customer = null;
        try {
            customer = (Customer) sqlMapClient.queryForObject(SELECT_ONE_CUSTOMER,id);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return customer;
    } 
    //修改
    public void update(Customer customer) {
        try {
            sqlMapClient.update(UPDATE_ONE_CUSTOMER, customer);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

 

四、 SQLMapClint.java

 

package com.wy.util;

import java.io.IOException;
import java.io.Reader;

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;

public class SQLMapClient {
    private static SqlMapClient sqlMapClient = null;

    static {
        String resource = "SqlMapConfig.xml";
        Reader reader = null;
        try {
            //读取ClassPath下的配置文件
            reader = Resources.getResourceAsReader(resource);
            sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                reader.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    public static SqlMapClient getSqlMapClient() {
        return sqlMapClient;
    }
}

 

log4j.properties

 

#定义输出级别和输出平台
log4j.rootLogger=debug,consoleAppender
#设定consoleAppender输出平台
log4j.appender.consoleAppender = org.apache.log4j.ConsoleAppender
#输出信息的级别
#log4j.appender.consoleAppender.Threshold = info
log4j.appender.consoleAppender.layout = org.apache.log4j.PatternLayout
log4j.appender.consoleAppender.layout.ConversionPattern=[%-5p][%d{yyyy-MM-dd HH:mm:ss}][%l]:%m%n
log4j.appender.consoleAppender.ImmediateFlush = true

#sqlMap 配置
log4j.logger.com.ibatis = DEBUG  
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource = DEBUG  
log4j.logger.com.ibatis.common.jdbc.ScriptRunner = DEBUG  
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate = DEBUG  
log4j.logger.java.sql.Connection = DEBUG  
log4j.logger.java.sql.Statement = DEBUG  
log4j.logger.java.sql.PreparedStatement = DEBUG, consoleAppender  
log4j.logger.java.sql.ResultSet = DEBUG  

 

五、测试 Test.java

 

package com.wy.test;

import java.util.List;

import org.apache.log4j.Logger;

import com.wy.dao.ICustomerDao;
import com.wy.dao.impl.CustomerDaoImpl;
import com.wy.pojo.Customer;

public class Test {
    private final static Logger log = Logger.getLogger(Test.class);

    public static void main(String[] args) {

        ICustomerDao customerDao = new CustomerDaoImpl();

        //插入数据
        Customer customers = new Customer();
        customers.setName("wy");
        customers.setPhone("13900000000");
        customers.setEmail("wy@163.com");
        customers.setAdress("北京");
        
        customerDao.add(customers);

        //修改数据
        Customer cust = customerDao.queryOneCustomer(21);
        cust.setName("wywy");

        customerDao.update(cust);

        //删除
        customerDao.deleteCustomerById(4);

        //查询所有数据
        List<Customer> list = customerDao.queryAllCustomers();
        for (Customer customer : list) {
            log.info("id:" + customer.getId());
            log.info("name:" + customer.getName());
            log.info("phone:" + customer.getPhone());
            log.info("email:" + customer.getEmail());
            log.info("address:" + customer.getAdress());
        }

    }

}

下面是iBatis的配置关系图


 

遇到一个莫名其妙的错误:

 

Exception in thread "main" java.lang.ExceptionInInitializerError
	at com.wy.dao.impl.CustomerDaoImpl.<init>(CustomerDaoImpl.java:26)
	at com.wy.test.Test.main(Test.java:16)
Caused by: java.lang.RuntimeException: Error occurred.  Cause: com.ibatis.common.xml.NodeletException: Error parsing XML.  Cause: org.xml.sax.SAXParseException: XML document structures must start and end within the same entity.
	at com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser.parse(SqlMapConfigParser.java:49)
	at com.ibatis.sqlmap.client.SqlMapClientBuilder.buildSqlMapClient(SqlMapClientBuilder.java:63)
	at com.wy.util.SQLMapClient.<clinit>(SQLMapClient.java:19)
	... 2 more
Caused by: com.ibatis.common.xml.NodeletException: Error parsing XML.  Cause: org.xml.sax.SAXParseException: XML document structures must start and end within the same entity.
	at com.ibatis.common.xml.NodeletParser.parse(NodeletParser.java:53)
	at com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser.parse(SqlMapConfigParser.java:46)
	... 4 more
Caused by: org.xml.sax.SAXParseException: XML document structures must start and end within the same entity.
	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:174)
	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:388)
	at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1414)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.endEntity(XMLDocumentFragmentScannerImpl.java:902)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.endEntity(XMLDocumentScannerImpl.java:605)
	at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.endEntity(XMLEntityManager.java:1393)
	at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1763)
	at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.scanData(XMLEntityScanner.java:1242)
	at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanComment(XMLScanner.java:756)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanComment(XMLDocumentFragmentScannerImpl.java:1036)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2945)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)
	at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:225)
	at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:283)
	at com.ibatis.common.xml.NodeletParser.createDocument(NodeletParser.java:157)
	at com.ibatis.common.xml.NodeletParser.parse(NodeletParser.java:50)
	... 5 more

 

查了好久原因SqlMapConfig.xml中有一个注释后面没有加空格

 <!-- 引入所有的SQL Map配置文件,这里的路径是classpath的相对路径-->引起。

加上空格后问题解决。不知道iBATIS为什么会出现这种问题!

 

 

 

  • 大小: 29.3 KB
  • 大小: 26.1 KB
分享到:
评论
1 楼 zhangxiaofei2012 2012-05-06  

相关推荐

    ibatis入门级示例

    ibatis入门级完整示例,包含ibatis-2.3.4.726.jar、commons-logging-1.0.4.jar、mysql-connector-java-3.1.10-bin.jar和建表语句。

    Ibatis 入门经典 实例

    《Ibatis 入门经典 实例》 Ibatis 是一款著名的轻量级 Java 持久层框架,它提供了一种映射 SQL 和 Java 对象的简单方式,从而减轻了开发人员在数据库操作中的工作负担。这篇实例教程将带你深入理解 Ibatis 的核心...

    Ibatis入门例子,Ibatis教程

    在本教程中,我们将通过一个简单的Ibatis入门例子,带你逐步了解并掌握这个强大的框架。 首先,我们需要在项目中引入Ibatis的依赖。通常,我们会在Maven的pom.xml文件中添加以下依赖: ```xml &lt;groupId&gt;org....

    ibatis入门

    **Ibatis 入门教程** Ibatis 是一个优秀的 Java ORM(对象关系映射)框架,它允许程序员将数据库操作与业务逻辑分离,提供灵活的 SQL 配置和映射机制,使得开发人员能够自由地编写 SQL 而不被 ORM 的复杂性所束缚。...

    ibatis入门示例

    标题中的“ibatis入门示例”表明我们将探讨的是关于MyBatis框架的基础知识。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。它的核心功能在于将Java代码与SQL语句进行解耦,使得开发者可以...

    Castle+ibatis代码示例

    在这个"Castle+ibatis代码示例"中,我们将深入探讨这两个框架如何协同工作,以实现更加灵活、可维护的软件架构。 首先,让我们了解Castle项目。Castle Project是一个.NET平台上的开源开发工具集,它包含多个组件,...

    iBatis入门(三)

    **iBatis入门(三)** 在本篇中,我们将深入探讨iBatis,这是一个流行的开源持久层框架,它允许开发者将SQL语句与Java代码分离,提供更灵活的数据库操作方式。iBatis的核心是SQL Maps,这些映射文件包含了SQL语句以及...

    最简单的iBatis入门例子

    本教程将带你一步步走进iBatis的世界,通过一个最简单的入门例子来了解其基本概念和使用方法。 一、iBatis简介 iBatis(现在称为MyBatis)是由Apache软件基金会维护的一个开源项目,它解决了Java应用程序直接操作...

    ibatis 入门

    标题 "ibatis 入门" 暗示我们要探讨的是关于使用和理解开源持久层框架 iBATIS 的基础知识。iBATIS 是一个优秀的 Java 应用框架,它将 SQL 查询与 Java 代码分离,提供了更灵活的数据访问方式。这篇博客(博文链接已...

    ibatis入门与ibatis迭代的用法

    **ibatis入门** iBatis,一款轻量级的Java持久层框架,是MyBatis的前身,由美国华人开发团队开发。它提供了一个SQL、Java和XML的映射框架,将SQL语句与Java代码分离,使得开发者可以更加灵活地处理数据库操作,避免...

    ibatis入门到精通详细讲解

    **Ibatis 入门到精通详细讲解** Ibatis 是一个优秀的持久层框架,它允许开发者将 SQL 语句与 Java 代码分离,提供了一个灵活的映射框架,从而减轻了开发人员在数据库操作上的工作负担。这篇详细讲解将带你从入门到...

    ibatis 完整示例下载

    【标题】"ibatis 完整示例下载" 涉及的核心知识点是关于iBATIS,这是一个在Java开发中广泛使用的持久层框架。iBATIS 提供了SQL映射功能,将数据库操作与业务逻辑解耦,使得开发更加灵活。 【描述】中的“少的飞洒发...

    ibatis 自己学的一个ibatis项目(只是打通了Oracle) 非常适合入门

    自己写了一个Ibatis入门文件 JDK用的1.4 ibatis用的2.3.0 一定要注意版本问题,不然出现本本不兼容很费劲,我调了一上午,注意一定要用JDK1.4 ibatis2.3.0! 数据库自己建一张简单的表就行了,特别说明 只适合新手...

    ibatis入门教程_ibatis入门教程_源码

    Ibatis,全称为MyBatis,是一个优秀的Java持久层框架,它主要负责SQL映射,使得...通过学习这个Ibatis入门教程,你可以了解并掌握如何在Java应用中使用Ibatis进行数据操作,为后续的进阶学习和项目开发打下坚实的基础。

    ibatis ibatis入门教程

    【标题】:Ibatis Ibatis入门教程 【描述】:Ibatis是一款优秀的持久层框架,它简化了Java应用与数据库之间的交互,通过提供一个映射SQL的XML或注解方式,使得开发人员能够将精力集中在业务逻辑上,而不是繁琐的...

    ibatis入门开发指南pdf 程序代码示例 jar包

    通过阅读这份“ibatis入门开发指南pdf”和对应的程序代码示例,开发者不仅可以了解iBATIS的基本用法,还能深入理解其实现原理,从而在实际项目中更好地利用这一工具。同时,提供的jar包则包含了运行iBATIS所需的库...

    ibatis 入门的例子

    这个压缩包中的"ibatisJavaTest"项目应该是一个简单的Ibatis入门示例,可能包含了配置文件、映射文件、测试类等。通过分析和运行这个项目,你可以直观地了解Ibatis如何与数据库交互,以及如何编写和使用Mapper接口。...

Global site tag (gtag.js) - Google Analytics