- 浏览: 1756829 次
- 性别:
- 来自: 大连
博客专栏
-
Spring数据库访问系列...
浏览量:173650
-
Android学习笔记
浏览量:368109
-
iBatis开发详解
浏览量:189253
-
Objective-C学习...
浏览量:99824
最新评论
-
iLidy:
引用[/c
Hibernate持久化对象的生命周期详解 -
fengzigogo:
您好,有这个项目架构的源码下载地址吗?
一种Java Web应用开发框架的构建(基于Struts2+Spring+FreeMarker)之一 -
spring_springmvc:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
用Maven构建Java Web开发环境(Jetty容器)之二 -
springdata_springmvc:
spring mvc demo教程源代码下载,地址:http: ...
Spring 3之MVC & Security简单整合开发(二) -
赵庆辉:
看帖回复是美德,楼主讲的很清晰明了,看了豁然开朗.
Java String对象的经典问题(new String())
iBatis是一款使用方便的数据访问工具,也可作为数据持久层的框架。和ORM框架(如Hibernate)将数据库表直接映射为Java对象相比,iBatis是将SQL语句映射为Java对象。相对于全自动SQL的Hibernate,iBatis允许你对SQL有完全控制权,可以视为半自动的数据访问工具。
iBatis的最大优点是简便,轻量级,仅需iBatis的一个jar和数据库的驱动即可运行,而且使用iBatis仅需掌握SQL和XML的用法即可,而不像Hibernate那样需要配置对象间的关系。学习iBatis的过程要比Hibernate快很多,在项目中,若人员水平不大一致时,使用iBatis代替Hibernate作为数据访问工具可以有效提升开发效率。
不管是iBatis还是Hibernate,都作为访问数据库的工具,它们必然基于JDBC而来,目的解决是JDBC程序开发的繁琐性和代码的冗余性(如加载驱动,建立连接,初始化语句对象,执行数据库操作,返回结果,关闭各个对象这一重复且无技术含量的过程)。
我们还是首先来看一个典型的JDBC示例,使用MySQL数据库,首先是建表。
创建表之后在数据库中创建一条记录。创建一个类模型,描述User对象。
要访问数据库,首先做些基础准备。写一个简单的数据库访问工具类,配置信息从属性文件中读取,比较方便。
最后是一个Demo测试类。
这是一个最朴素的JDBC应用程序,所有操作必须人为显式完成,如有遗漏可能就会对程序造成影响,比如连接不释放,数据更新操作时使用事务。不可否认的是,JDBC直接操作数据库的效率是最高的,一旦使用了持久层的框架,会在效率上造成一定影响。这点要权衡利弊,做出决定。
下面我们进入iBatis的配置。使用iBatis首先要获取开发包,现在iBatis版本分为2和3,二者在使用上稍有差别,这里我们使用2的版本进行说明。首先看下项目结构。
数据库的配置信息还是使用jdbc.properties文件即可,统一管理。
iBatis的配置文件是SqlMapConfig.xml,这里面需要声明数据库连接的属性信息,数据源配置信息,映射文件等信息。先看个例子,其中属性含义先不必深究,当然也可以去google。
配置好iBatis后,我们就要进行数据库操作了,当然iBatis本身的SQL语句也是写在映射文件中的,那么就要看User.xml了。
typeAlias标签是设置别名用的,这里我们使用了一个Bean叫做User,声明别名后,在文件的后续部分可以直接使用别名而不用再给出完整类型了,非常方便,如select标签中的resultClass属性。
这个配置我们使用的是Bean作为返回的结果类型,当然也可以使用Map,非常灵活。Select的id是标识该SQL语句的标识符,要在应用程序中使用到,必须唯一。Select标签体内的部分就是SQL语句了,当然这里是最简单的示例。
最后就是应用程序,写法也很简单。首先是加载iBatis的配置文件,然后使用SqlMapClient接口提供的方法进行数据操作。
至此,一个简单的iBatis应用就写完了,相比于Hibernate,我们对SQL有完全的主动权,对SQL的管理也高度统一,并且配置非常简单。
欢迎交流,希望对学习者有用。
User.xml需要修改
请为该字段添加get和set方法,在SQL中要查询该字段,做映射时要准确匹配到实体bean上
呵呵,只看原理,不追版本号
iBatis的最大优点是简便,轻量级,仅需iBatis的一个jar和数据库的驱动即可运行,而且使用iBatis仅需掌握SQL和XML的用法即可,而不像Hibernate那样需要配置对象间的关系。学习iBatis的过程要比Hibernate快很多,在项目中,若人员水平不大一致时,使用iBatis代替Hibernate作为数据访问工具可以有效提升开发效率。
不管是iBatis还是Hibernate,都作为访问数据库的工具,它们必然基于JDBC而来,目的解决是JDBC程序开发的繁琐性和代码的冗余性(如加载驱动,建立连接,初始化语句对象,执行数据库操作,返回结果,关闭各个对象这一重复且无技术含量的过程)。
我们还是首先来看一个典型的JDBC示例,使用MySQL数据库,首先是建表。
create table users( ID INT(10) AUTO_INCREMENT PRIMARY KEY, USERNAME VARCHAR(10) NOT NULL, PASSWORD VARCHAR(32) NOT NULL, MOBILE VARCHAR(11) NOT NULL, EMAIL VARCHAR(40) );
创建表之后在数据库中创建一条记录。创建一个类模型,描述User对象。
package jdbc.model; public class User implements java.io.Serializable { private Integer userId; private String userName; private String password; private String mobile; private String email; //省略属性的getter和setter方法 @Override public String toString() { return "User [email=" + email + ", mobile=" + mobile + ", password=" + password + ", userId=" + userId + ", userName=" + userName + "]"; } }
要访问数据库,首先做些基础准备。写一个简单的数据库访问工具类,配置信息从属性文件中读取,比较方便。
package jdbc.util; import java.sql.*; import java.util.ResourceBundle; public class DBUtil { private static Connection conn = null; private static Statement stmt; private static PreparedStatement pstmt = null; private static String url = "", driver = "", userName = "", password = ""; static { ResourceBundle bundle = ResourceBundle.getBundle("jdbc"); url = bundle.getString("jdbc.url"); driver = bundle.getString("jdbc.driverClassName"); userName = bundle.getString("jdbc.username"); password = bundle.getString("jdbc.password"); } public DBUtil() { } public static Connection getConnection() { try { Class.forName(driver); conn = DriverManager.getConnection(url, userName, password); } catch (Exception e) { e.printStackTrace(); } return conn; } }
最后是一个Demo测试类。
package jdbc; import java.sql.*; import jdbc.model.User; import jdbc.util.DBUtil; public class JDBCDemo { public static User getUser(int id) throws SQLException { User user = null; String sql = "select * from users where ID=?"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = DBUtil.getConnection(); pstmt = conn.prepareStatement(sql); pstmt.setInt(1, id); rs = pstmt.executeQuery(); while (rs.next()) { user = new User(); user.setUserId(rs.getInt("ID")); user.setUserName(rs.getString("USERNAME")); user.setPassword(rs.getString("PASSWORD")); user.setMobile(rs.getString("MOBILE")); user.setEmail(rs.getString("EMAIL")); } } finally { try { if (rs != null) { rs.close(); } } finally { try { if (pstmt != null) { pstmt.close(); } } finally { if (conn != null) { conn.close(); } } } } return user; } public static void main(String[] args) throws Exception { System.out.println(getUser(1)); } }
这是一个最朴素的JDBC应用程序,所有操作必须人为显式完成,如有遗漏可能就会对程序造成影响,比如连接不释放,数据更新操作时使用事务。不可否认的是,JDBC直接操作数据库的效率是最高的,一旦使用了持久层的框架,会在效率上造成一定影响。这点要权衡利弊,做出决定。
下面我们进入iBatis的配置。使用iBatis首先要获取开发包,现在iBatis版本分为2和3,二者在使用上稍有差别,这里我们使用2的版本进行说明。首先看下项目结构。
数据库的配置信息还是使用jdbc.properties文件即可,统一管理。
jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=utf8 jdbc.username=root jdbc.password=123
iBatis的配置文件是SqlMapConfig.xml,这里面需要声明数据库连接的属性信息,数据源配置信息,映射文件等信息。先看个例子,其中属性含义先不必深究,当然也可以去google。
<?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="jdbc.properties" /> <transactionManager type="JDBC"> <dataSource type="SIMPLE"> <property name="JDBC.Driver" value="${jdbc.driverClassName}" /> <property name="JDBC.ConnectionURL" value="${jdbc.url}" /> <property name="JDBC.Username" value="${jdbc.username}" /> <property name="JDBC.Password" value="${jdbc.password}" /> </dataSource> </transactionManager> <sqlMap resource="ibatis/resources/User.xml" /> </sqlMapConfig>
配置好iBatis后,我们就要进行数据库操作了,当然iBatis本身的SQL语句也是写在映射文件中的,那么就要看User.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> <typeAlias alias="User" type="ibatis.model.User" /> <select id="getAllUsers" resultClass="User"> select * from users </select> </sqlMap>
typeAlias标签是设置别名用的,这里我们使用了一个Bean叫做User,声明别名后,在文件的后续部分可以直接使用别名而不用再给出完整类型了,非常方便,如select标签中的resultClass属性。
这个配置我们使用的是Bean作为返回的结果类型,当然也可以使用Map,非常灵活。Select的id是标识该SQL语句的标识符,要在应用程序中使用到,必须唯一。Select标签体内的部分就是SQL语句了,当然这里是最简单的示例。
最后就是应用程序,写法也很简单。首先是加载iBatis的配置文件,然后使用SqlMapClient接口提供的方法进行数据操作。
package ibatis; import ibatis.model.User; import java.io.*; import java.sql.SQLException; import java.util.List; import com.ibatis.common.resources.Resources; import com.ibatis.sqlmap.client.*; public class IBatisDemo { public static void main(String[] args) throws IOException, SQLException { String config = "ibatis/SqlMapConfig.xml"; Reader reader = Resources.getResourceAsReader(config); SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader); List<User> list = sqlMap.queryForList("getAllUsers"); for (User user : list) { System.out.println(user); } } }
至此,一个简单的iBatis应用就写完了,相比于Hibernate,我们对SQL有完全的主动权,对SQL的管理也高度统一,并且配置非常简单。
欢迎交流,希望对学习者有用。
评论
6 楼
Ennissuper
2015-02-08
您好:请问
String config = "SqlMapConfig.xml";
Reader reader = Resources.getResourceAsReader(config);
这个 SqlMapConfig,xml的路径应该怎么写 ?我报错 错误为
Could not find resource SqlMapConfig.xml
at com.ibatis.common.resources.Resources.getResourceAsStream(Resources.java:110)
at com.ibatis.common.resources.Resources.getResourceAsStream(Resources.java:95)
at com.ibatis.common.resources.Resources.getResourceAsReader(Resources.java:161)
at com.mdbp.urlMatcher.persisit.CommodityMessageService.main(CommodityMessageService.java:17)
at com.mdbp.urlMatcher.matcher.UrlMatcherRun.main(UrlMatcherRun.java:101)
String config = "SqlMapConfig.xml";
Reader reader = Resources.getResourceAsReader(config);
这个 SqlMapConfig,xml的路径应该怎么写 ?我报错 错误为
Could not find resource SqlMapConfig.xml
at com.ibatis.common.resources.Resources.getResourceAsStream(Resources.java:110)
at com.ibatis.common.resources.Resources.getResourceAsStream(Resources.java:95)
at com.ibatis.common.resources.Resources.getResourceAsReader(Resources.java:161)
at com.mdbp.urlMatcher.persisit.CommodityMessageService.main(CommodityMessageService.java:17)
at com.mdbp.urlMatcher.matcher.UrlMatcherRun.main(UrlMatcherRun.java:101)
5 楼
yangphere
2012-09-14
zmj0924 写道
您好,我按照您上面的步骤做了个案例,设计表结构的时候主键是自增长的
用JDBC的方式获取的时候,打印的结果如下:
User [userId=1, userName=张三, password=123456, mobile=15198562145, email=zhangsan@sina.com]
换成ibatis后,打印的结果如下:
User [userId=null, userName=张三, password=123456, mobile=15198562145, email=zhangsan@sina.com]
User [userId=null, userName=李四, password=123456, mobile=15162345897, email=lisi@sina.com]
userId获取不到值了, 求解
用JDBC的方式获取的时候,打印的结果如下:
User [userId=1, userName=张三, password=123456, mobile=15198562145, email=zhangsan@sina.com]
换成ibatis后,打印的结果如下:
User [userId=null, userName=张三, password=123456, mobile=15198562145, email=zhangsan@sina.com]
User [userId=null, userName=李四, password=123456, mobile=15162345897, email=lisi@sina.com]
userId获取不到值了, 求解
User.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> <typeAlias alias="User" type="cn.yangphere.ibatisdemo.model.User"/> <select id="getAllUsers" resultClass="User"> select id as userId, userName as username, password, mobile, email from users </select> </sqlMap>
4 楼
sarin
2012-09-10
zmj0924 写道
您好,我按照您上面的步骤做了个案例,设计表结构的时候主键是自增长的
用JDBC的方式获取的时候,打印的结果如下:
User [userId=1, userName=张三, password=123456, mobile=15198562145, email=zhangsan@sina.com]
换成ibatis后,打印的结果如下:
User [userId=null, userName=张三, password=123456, mobile=15198562145, email=zhangsan@sina.com]
User [userId=null, userName=李四, password=123456, mobile=15162345897, email=lisi@sina.com]
userId获取不到值了, 求解
用JDBC的方式获取的时候,打印的结果如下:
User [userId=1, userName=张三, password=123456, mobile=15198562145, email=zhangsan@sina.com]
换成ibatis后,打印的结果如下:
User [userId=null, userName=张三, password=123456, mobile=15198562145, email=zhangsan@sina.com]
User [userId=null, userName=李四, password=123456, mobile=15162345897, email=lisi@sina.com]
userId获取不到值了, 求解
请为该字段添加get和set方法,在SQL中要查询该字段,做映射时要准确匹配到实体bean上
3 楼
zmj0924
2012-09-10
您好,我按照您上面的步骤做了个案例,设计表结构的时候主键是自增长的
用JDBC的方式获取的时候,打印的结果如下:
User [userId=1, userName=张三, password=123456, mobile=15198562145, email=zhangsan@sina.com]
换成ibatis后,打印的结果如下:
User [userId=null, userName=张三, password=123456, mobile=15198562145, email=zhangsan@sina.com]
User [userId=null, userName=李四, password=123456, mobile=15162345897, email=lisi@sina.com]
userId获取不到值了, 求解
用JDBC的方式获取的时候,打印的结果如下:
User [userId=1, userName=张三, password=123456, mobile=15198562145, email=zhangsan@sina.com]
换成ibatis后,打印的结果如下:
User [userId=null, userName=张三, password=123456, mobile=15198562145, email=zhangsan@sina.com]
User [userId=null, userName=李四, password=123456, mobile=15162345897, email=lisi@sina.com]
userId获取不到值了, 求解
2 楼
sarin
2012-09-04
zhangpeili 写道
现在都用mybatis了
呵呵,只看原理,不追版本号
1 楼
zhangpeili
2012-09-04
现在都用mybatis了
发表评论
-
iBatis操作DDL和映射继承
2012-09-09 21:46 9265本文系iBatis开发详解系列文章之iBatis操作D ... -
iBatis查询复杂集合
2012-09-04 20:23 15746本文系iBatis开发详解系列文章之在iBatis查询 ... -
iBatis中使用XML
2012-08-29 19:57 7697本文系iBatis开发详解系列文章之在iBatis中使 ... -
iBatis执行非查询语句(CRUD,函数和过程)
2012-08-26 21:40 9322CRUD操作中除了查询操作,其他都统一称为更新操作,因 ... -
Spring数据库访问之iBatis(二)
2012-06-10 13:56 5792接上文,我们继续来研究Spring和iBatis的整合 ... -
Spring数据库访问之iBatis(一)
2012-01-02 18:45 15987为了丰富博客专栏【Spring数据库访问系列】的内容, ... -
我的视频教程《中小企业OA系统》
2011-07-29 22:27 7748经过5个月的制作,和华章合作的《中小企业OA系统》Ja ... -
iBatis分页(基于Struts2和Freemarker)
2011-05-02 10:05 13109之前介绍过基于Hibernate分页的原理和设计,这里 ... -
Spring数据库访问之ORM(三)
2011-03-02 20:35 17617本文接上一篇继续研究。 之前我们使用的是Hib ... -
Spring数据库访问之ORM(二)
2011-02-16 13:19 23382本文接上一篇继续来研究Spring的ORM模块。 ... -
Spring数据库访问之ORM(一)
2011-01-27 10:54 30805Spring数据库访问中另外一大模块就是ORM,ORM ... -
Spring数据库访问之异常处理
2011-01-19 10:29 27505使用JDBC API时,很 ... -
Spring数据库访问(HSQL)(四)
2011-01-16 21:49 14562本文接上一篇继续研究Spring的JDBC模板。 ... -
Spring数据库访问(HSQL)(三)
2011-01-13 10:07 13437本文接上一篇继续研究JDBC模板。 之前说的都 ... -
Spring数据库访问(HSQL)(二)
2011-01-11 11:27 10729上一篇我们介绍了 ... -
Spring数据库访问(HSQL)(一)
2011-01-09 23:34 13834本部分主要介绍Spring的JDBC模板,JDBC模板 ... -
Spring 3之MVC & Security简单整合开发(三)
2010-12-03 19:04 22063本文接上一篇继续深入研究Security框架。 ... -
Spring 3之MVC & Security简单整合开发(二)
2010-12-01 20:29 60083本文接上一篇继续 ... -
Spring 3之MVC & Security简单整合开发(一)
2010-11-30 22:00 42622Spring的MVC模块是一种简洁的Web应用框架,实 ... -
iBatis查询select详解
2010-08-07 12:19 40527<select>是iBatis已经映射的语 ...
相关推荐
根据"01_传智播客ibatis教程_准备ibatis环境"的子文件名,我们可以推测这可能是传智播客(一个知名的在线教育平台)提供的Ibatis教程的第一个部分,专门讲解如何搭建和准备Ibatis开发环境。可能包含视频教程、PPT...
这个压缩包很可能是包含MyBatis运行所需的所有依赖库,以便用户能够直接将其添加到项目的`lib`目录下,便于快速搭建开发环境。 在Java应用程序中,JAR文件是一种打包机制,它可以将多个类文件、资源文件和元数据...
iBATIS教程:深入理解与应用 iBATIS框架,作为数据库持久化领域的佼佼者,自诞生以来便因其简洁高效的设计理念而受到广大开发者...希望本文能为初学者提供一个良好的起点,帮助大家在iBATIS的道路上迈出坚实的第一步。
iBATIS作为一个轻量级的解决方案,它简化了Java应用程序中的数据库操作,提供了SQL映射功能,使得开发人员可以更加灵活地处理SQL语句,避免了过度依赖ORM(对象关系映射)工具可能导致的性能问题。 【描述】"ibaits...
环境搭建是使用Mybatis的第一步。你可以访问Mybatis的官方网站或GitHub页面下载所需的jar包。通常,你需要下载Mybatis的核心库以及相关的依赖,例如数据库驱动。对于MySQL,确保下载与你当前版本兼容的驱动包。将...
第一部分:技能储备阶段,学习项目所需要的技能知识 第二部分:设计部分,通过需求分析,设计物理模型,画出原型界面(HTML) 第三部分:编码部分,具体实现各个功能模块 学完本系列课程后,学员将会达到以下学习...
1. **环境搭建**: - Java环境:JDK 1.7.0_72 - Eclipse版本:Indigo - MySQL版本:5.1 - 必需的库文件:MyBatis核心库、MySQL驱动、日志库(如log4j)。 2. **数据库准备**: - 创建MySQL数据库,并导入`sql_...
这个jar包的出现,主要是为了帮助初学者快速搭建完整的开发环境,避免因缺少必要的库文件而导致的编译错误或运行问题。 Spring框架是Java企业级应用的核心组件,它提供了一个容器来管理对象的生命周期和配置。...
6. **第一个MyBatis程序** - 通过实例演示如何将传统的JDBC程序转换为MyBatis程序,包括创建Mapper接口、XML映射文件,以及在Java代码中调用Mapper方法执行SQL。 通过本课件的学习,你将能够熟练掌握MyBatis的配置...
学员将学习如何在WebLogic Server上进行安装、配置和开发环境的搭建,以便于后续的应用程序开发。同时,课程还会讲解WebLogic的管理控制台,让学员熟悉服务器的日常管理和监控。 在数据库连接方面,课程涵盖了...
标题 "system lib.rar" 暗示这可能是一个包含系统库文件的压缩包,用于支持特定的软件开发或运行环境。这些库文件是程序运行所必需的,它们提供了各种功能,如数据库操作、模板引擎、数据处理等。下面将详细讨论...
mybatis实战教程mybatis in action之一开发环境搭建 mybatis实战教程mybatis in action之二以接口的方式编程 mybatis实战教程mybatis in action之三实现数据的增删改查 mybatis实战教程mybatis in action之四实现...
创建并运行第一个Django项目,包括初始化数据库、定义模型、创建视图和URL映射等,是了解Django基础的关键步骤。 7. **Spring+Struts2+Ibatis示例**: 虽然这个文件名与Python无关,但可以看出这涉及到Java Web...
- **环境搭建**:确保安装了Java 1.7及以上版本、Eclipse IDE(如Indigo版本)、MySQL 5.1等。 - **数据库准备**:创建MySQL数据库并导入必要的表结构和初始数据。 - **依赖引入**:引入MyBatis的核心库(例如3.2.7...
这种模式有助于将应用程序的输入、处理和输出分开,实现了应用程序的职能分工,MVC因此被誉为“全球第一设计模式”。 在Java EE(Java Platform, Enterprise Edition)三层架构中,我们将应用程序分为三个层次:...
MyBatis的第一个程序通常包括环境搭建、导入MyBatis库、编写核心配置文件和相关Java代码。例如,首先创建一个数据库和表,然后引入MyBatis的JAR包,接着配置MyBatis的主配置文件,定义数据源、事务管理器和Mapper...
#### 三、第一个MyBatis程序的搭建与实现 ##### 3.1 搭建环境 为了开始使用MyBatis,首先需要搭建相应的开发环境。具体步骤包括: - **环境准备**:确保安装了JDK 8、MySQL 5.7.19、Maven 3.6.1及IDEA。 - **导入...
在软件开发框架方面,"通向架构师的道路(第二十一天)万能框架spring(三)之SSH.docx"提到了Spring框架与其他两个流行框架Struts和Hibernate(SSH)的整合,这展示了如何构建高效的企业级应用程序。"通向架构师的...
本文档旨在通过一个简单的示例来介绍如何将Struts2、Spring和Ibatis(现称为MyBatis)三个框架整合在一起,构建一个基本的Web应用程序。这种整合方式常被称为SSI(Struts2 + Spring + Ibatis/MyBatis)。对于初学者...
Appfuse 的独特之处在于它不仅提供了一个高度集成的开发环境,还内置了一些常见的 Web 应用功能模块,使得开发者能够专注于业务逻辑的开发而非重复性工作。此外,Appfuse 还支持多种前端框架,如 Taperstry 和 JSF,...