- 浏览: 932220 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (251)
- WebService (17)
- IBatis (22)
- Hibernate (1)
- SpringMVC - 基础篇 (32)
- Spring (15)
- Java (11)
- JVM及调优 - 基础篇 (4)
- 集群 (14)
- 数据库 (17)
- WebSphere (5)
- 多线程 (4)
- 集合、容器 (2)
- DB Pool (1)
- Power Designer (5)
- Maven基础 (5)
- JS (14)
- WEB 前端 (5)
- 实用小工具 (17)
- 社会、人 (2)
- 乱七八糟 (18)
- ASM&CGLIB - 基础篇 (12)
- 缓存 (1)
- 性能 (1)
- 设计之殇 (1)
- 分布式事务 (1)
- 单点登录 (11)
- 分布式 Session (4)
- Memcached - 基础篇 (6)
最新评论
-
一笑_奈何:
楼主写的还真行不错。
扫盲贴 - J2EE集群之JNDI集群实现 -
xuezhongyu01:
博主写的很详细,但最后还是没明白,最后调用BasicDataS ...
Spring中的destroy-method方法 -
Mr梁:
commons-fileupload.jar commons- ...
SpringMVC 中文件上传 MultipartResolver -
Eywa:
总结的很不错
ORACLE CASE WHEN 及 SELECT CASE WHEN的用法 -
TryRelax:
fastjson 比 jackson 好用吧?
Spring MVC Jackson DateFormat
工程的结构:
一、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为什么会出现这种问题!
发表评论
-
iBATIS缓存
2011-12-12 21:33 1165为了提高应用程序性 ... -
iBatis批处理(batch)
2011-09-05 23:47 6957spring集成了ibatis的批量提交的功能,我们只要调用A ... -
一个Spring+iBatis框架进行batch处理的问题
2011-09-05 23:23 1622在使用org.springframework.jdbc.dat ... -
ibatis 注意点
2011-08-08 19:28 1382insert,update,delete 返回值 inser ... -
ibatis 之 动态SQL查询(dynamic )
2011-06-12 12:13 2288映射文件: <select id=" ... -
ibatis 之 复杂类型集合的属性
2011-06-12 12:10 2149Result Map还可以装入代表复杂类型对象集合(List) ... -
ibatis 之 复杂类型属性(即自定义类型的属性)
2011-06-12 11:54 3451复杂类型用以表示在数 ... -
ibatis 之 java.util.Map作为parameterClass和resultClass
2011-06-12 11:21 51641.Map作为parameterClass 映射 ... -
ibatis Tips 之 resultMap
2011-05-29 21:04 1210转载:http://xulongfa.iteye.com/bl ... -
ibatis Tips之parameterMap
2011-05-29 21:03 1343转载:http://xulongfa.iteye.com/bl ... -
iBatis查询API
2011-05-29 12:34 1856转载:http://sarin.iteye.com/blog/ ... -
iBatis查询select详解
2011-05-29 12:20 2218转载:http://sarin.iteye.com/blog/ ... -
ibatis 表与表的关联查询
2011-05-22 15:04 1265ibatis高级特性,处理表与表之间的关联。ibatis中,提 ... -
ibatis 动态映射机制
2011-05-22 14:15 1457对于这个组合查询页 ... -
sqlMapConfig.xml配置文件详解
2011-05-22 13:04 3554sqlMapConfig.xml配置文件详解: X ... -
ibatis缓存
2011-05-22 12:52 1364iBatis的缓存配置比较简单易懂,以我使用的iBati ... -
ibatis resultclass "java.util.hashmap" 缓存问题
2011-05-22 12:13 1522在做ibatis项目过程中遇到如下样式动态查询 <se ... -
ibatis # $区别
2011-05-22 11:55 14391、#可以进行预编译,进行类型匹配,#变量名# 会转化为 j ... -
iBATIS 三个版本小细节对比
2011-05-08 16:12 1205iBATIS 三个版本小细节对比 sqlMapConfig ... -
深入分析 iBATIS 框架之系统架构与映射原理
2011-05-07 12:48 1222原文:http://www.ibm.com/developer ...
相关推荐
ibatis入门级完整示例,包含ibatis-2.3.4.726.jar、commons-logging-1.0.4.jar、mysql-connector-java-3.1.10-bin.jar和建表语句。
《Ibatis 入门经典 实例》 Ibatis 是一款著名的轻量级 Java 持久层框架,它提供了一种映射 SQL 和 Java 对象的简单方式,从而减轻了开发人员在数据库操作中的工作负担。这篇实例教程将带你深入理解 Ibatis 的核心...
在本教程中,我们将通过一个简单的Ibatis入门例子,带你逐步了解并掌握这个强大的框架。 首先,我们需要在项目中引入Ibatis的依赖。通常,我们会在Maven的pom.xml文件中添加以下依赖: ```xml <groupId>org....
**Ibatis 入门教程** Ibatis 是一个优秀的 Java ORM(对象关系映射)框架,它允许程序员将数据库操作与业务逻辑分离,提供灵活的 SQL 配置和映射机制,使得开发人员能够自由地编写 SQL 而不被 ORM 的复杂性所束缚。...
标题中的“ibatis入门示例”表明我们将探讨的是关于MyBatis框架的基础知识。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。它的核心功能在于将Java代码与SQL语句进行解耦,使得开发者可以...
在这个"Castle+ibatis代码示例"中,我们将深入探讨这两个框架如何协同工作,以实现更加灵活、可维护的软件架构。 首先,让我们了解Castle项目。Castle Project是一个.NET平台上的开源开发工具集,它包含多个组件,...
**iBatis入门(三)** 在本篇中,我们将深入探讨iBatis,这是一个流行的开源持久层框架,它允许开发者将SQL语句与Java代码分离,提供更灵活的数据库操作方式。iBatis的核心是SQL Maps,这些映射文件包含了SQL语句以及...
本教程将带你一步步走进iBatis的世界,通过一个最简单的入门例子来了解其基本概念和使用方法。 一、iBatis简介 iBatis(现在称为MyBatis)是由Apache软件基金会维护的一个开源项目,它解决了Java应用程序直接操作...
标题 "ibatis 入门" 暗示我们要探讨的是关于使用和理解开源持久层框架 iBATIS 的基础知识。iBATIS 是一个优秀的 Java 应用框架,它将 SQL 查询与 Java 代码分离,提供了更灵活的数据访问方式。这篇博客(博文链接已...
**ibatis入门** iBatis,一款轻量级的Java持久层框架,是MyBatis的前身,由美国华人开发团队开发。它提供了一个SQL、Java和XML的映射框架,将SQL语句与Java代码分离,使得开发者可以更加灵活地处理数据库操作,避免...
**Ibatis 入门到精通详细讲解** Ibatis 是一个优秀的持久层框架,它允许开发者将 SQL 语句与 Java 代码分离,提供了一个灵活的映射框架,从而减轻了开发人员在数据库操作上的工作负担。这篇详细讲解将带你从入门到...
【标题】"ibatis 完整示例下载" 涉及的核心知识点是关于iBATIS,这是一个在Java开发中广泛使用的持久层框架。iBATIS 提供了SQL映射功能,将数据库操作与业务逻辑解耦,使得开发更加灵活。 【描述】中的“少的飞洒发...
自己写了一个Ibatis入门文件 JDK用的1.4 ibatis用的2.3.0 一定要注意版本问题,不然出现本本不兼容很费劲,我调了一上午,注意一定要用JDK1.4 ibatis2.3.0! 数据库自己建一张简单的表就行了,特别说明 只适合新手...
Ibatis,全称为MyBatis,是一个优秀的Java持久层框架,它主要负责SQL映射,使得...通过学习这个Ibatis入门教程,你可以了解并掌握如何在Java应用中使用Ibatis进行数据操作,为后续的进阶学习和项目开发打下坚实的基础。
【标题】:Ibatis Ibatis入门教程 【描述】:Ibatis是一款优秀的持久层框架,它简化了Java应用与数据库之间的交互,通过提供一个映射SQL的XML或注解方式,使得开发人员能够将精力集中在业务逻辑上,而不是繁琐的...
通过阅读这份“ibatis入门开发指南pdf”和对应的程序代码示例,开发者不仅可以了解iBATIS的基本用法,还能深入理解其实现原理,从而在实际项目中更好地利用这一工具。同时,提供的jar包则包含了运行iBATIS所需的库...
这个压缩包中的"ibatisJavaTest"项目应该是一个简单的Ibatis入门示例,可能包含了配置文件、映射文件、测试类等。通过分析和运行这个项目,你可以直观地了解Ibatis如何与数据库交互,以及如何编写和使用Mapper接口。...