- 浏览: 898452 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (498)
- J2EE (52)
- 数据库 (17)
- java基础 (43)
- web技术 (19)
- 程序设计 (6)
- 操作系统 (18)
- IT资讯 (7)
- 我的IT生活 (12)
- 学习笔记 (9)
- Jquery (25)
- JavaScript (18)
- spring (40)
- Hibernate (12)
- Struts (10)
- YUI (2)
- Extjs (22)
- .net (0)
- Eclipse (10)
- 社会主义 (2)
- 服务器 (9)
- CSS (8)
- 网络安全 (16)
- 版本控制 (9)
- PHP (2)
- Oracle (42)
- SQL server (1)
- Mysql (11)
- 项目管理 (3)
- 开发工具使用 (10)
- SQL语句 (7)
- Perl (0)
- Shell (6)
- 漏洞 (4)
- ibatis (5)
- hacker (2)
- SQL注入 (6)
- Hacker工具 (2)
- 入侵和渗透 (7)
- 插件/组件 (2)
- 最爱开源 (5)
- 常用软件 (2)
- DOS (1)
- HTML (2)
- Android (9)
- CMS (1)
- portal (8)
- Linux (7)
- OSGI (1)
- Mina (5)
- maven (2)
- hadoop (7)
- twitter storm (2)
- sap hana (0)
- OAuth (0)
- RESTful (1)
- Nginx (4)
- flex (1)
- Dubbo (1)
- redis (1)
- springMVC (1)
- node.js (1)
- solr (2)
- Flume (1)
- MongoDB (2)
- ElasticSearch (1)
最新评论
-
M_drm:
请问要怎么设置浏览器才不报没权限呢?
用JS在页面调用本地可执行文件的方法(ACTIVEX) -
Alexniver:
官方文档。When importing data into I ...
mysql导入数据过慢 解决方法 -
camelwoo:
我记得 Criteria 可以做连接查询与子查询,也可以做分页 ...
Hibernate总结篇二 -
zhenglongfei:
楼主如果SubKeyName 这个节点不存在,怎么办??怎么用 ...
Java操作注册表 -
yxx676229549:
用log4j 2 了
logback
相对Hibernate和Apache OJB 等“一站式”ORM解决方案而言,ibatis 是一种“半
自动化”的ORM实现。
所谓“半自动”,可能理解上有点生涩。纵观目前主流的ORM,无论Hibernate 还是
Apache OJB,都对数据库结构提供了较为完整的封装,提供了从POJO 到数据库表的全
套映射机制。程序员往往只需定义好了POJO 到数据库表的映射关系,即可通过Hibernate
或者OJB 提供的方法完成持久层操作。程序员甚至不需要对SQL 的熟练掌握,
Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的SQL 并调用JDBC 接口加以执
行。 ----摘自官方资料的一段话
iBatis是一种很好的解决方案,使用起来很灵活,参考一些网络中的资料我也想把自己的使用过程写下来,如有错误希望指正。
环境:JDK1.5+Eclipse3.2 使用时仅需要在Eclipse中导入项目。
首先是表结构, 提供了两种数据库的支持分别为MySQL与hsqldb,可以根据实际情况选择使用。以MySQL为例:
然后是iBatis的配置文件 SqlMapConfig.xml
这里进行数据源的配置以及一些参数的设置和优化
User.java就是domain了,是映射的对象。
下面是比较重要的SQL Map XML映射文件,所有方法都在这里。
User.xml
这样就可以来测试了,测试也使用了两种方法,先使用一个普通应用程序来测试一下程序的运行好了。
所有的方法都是静态的,可以分别对映射方法进行测试。
下面使用的是单元测试对iBatis来测试,使用了dbunit这个开源项目。
首先,要为单元测试准备数据。使用DbUnit,我们可以用XML文件来准备测试数据集。
t_user对应表名
id,name,date分别对应列名
user_seed.xml
方便测试,首先为SqlMap的单元测试编写一个抽象的测试基类
然后为每个SqlMap映射文件编写一个测试用例,extends上面的抽象类
注意,其中测试insert时由于id为auto_increment,可能需要对测试数据中<dataset/>进行设置,网络中并未查询到相关的方法,所以在映射文件中加入了一个
用例测试中测试的是insertUserTest,并非insertUser,请注意。
到这里就结束了,demo比较简单,希望能给大家带来帮助。
参考:
[url]http://ibatis.apache.org/ [/url]
http://hsqldb.org/
http://www.dbunit.org/
自动化”的ORM实现。
所谓“半自动”,可能理解上有点生涩。纵观目前主流的ORM,无论Hibernate 还是
Apache OJB,都对数据库结构提供了较为完整的封装,提供了从POJO 到数据库表的全
套映射机制。程序员往往只需定义好了POJO 到数据库表的映射关系,即可通过Hibernate
或者OJB 提供的方法完成持久层操作。程序员甚至不需要对SQL 的熟练掌握,
Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的SQL 并调用JDBC 接口加以执
行。 ----摘自官方资料的一段话
iBatis是一种很好的解决方案,使用起来很灵活,参考一些网络中的资料我也想把自己的使用过程写下来,如有错误希望指正。
环境:JDK1.5+Eclipse3.2 使用时仅需要在Eclipse中导入项目。
首先是表结构, 提供了两种数据库的支持分别为MySQL与hsqldb,可以根据实际情况选择使用。以MySQL为例:
create database if not exists `ibatis_schema`; USE `ibatis_schema`; drop table if exists `t_user`; CREATE TABLE `t_user` ( `id` int(12) NOT NULL auto_increment, `name` varchar(50) default NULL, `date` date default NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=GBK; Insertinto `t_user`(name,date) values('liulu','2007-03-15'),('liulu2','2007-03-15'),('liulu3','2007-03-15');
然后是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> <settings cacheModelsEnabled="true" useStatementNamespaces="true" /> <transactionManager type="JDBC"> <dataSource type="SIMPLE"> <property name="JDBC.Driver" value="com.mysql.jdbc.Driver" /> <property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost/ibatis_schema" /> <property name="JDBC.Username" value="root" /> <property name="JDBC.Password" value="1234" /> </dataSource> </transactionManager> <sqlMap resource="com/javaeye/liulu/maps/User.xml" /> </sqlMapConfig>
User.java就是domain了,是映射的对象。
package com.javaeye.liulu.domain; import java.io.Serializable; import java.util.Date; public class User implements Serializable{ private int id; private String name; private Date date; public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
下面是比较重要的SQL Map XML映射文件,所有方法都在这里。
User.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd"> <sqlMap namespace="User"> <typeAlias alias="UserObject" type="com.javaeye.liulu.domain.User" /> <resultMap id="userResult" class="UserObject"> <result property="id" column="id" jdbcType="NUMBER" /> <result property="name" column="name" jdbcType="VARCHAR2" /> <result property="date" column="date" jdbcType="DATE" /> </resultMap> <select id="getByPK" resultMap="userResult" parameterClass="UserObject"> <![CDATA[ select id, name, date from t_user where id = #id# ]]> </select> <select id="getById" resultMap="userResult" parameterClass="java.lang.String"> <![CDATA[ select id, name, date from t_user where id = $String$ ]]> </select> <sql id="Dy_SC"> <dynamic prepend="WHERE"> <isNotNull prepend="AND" property="id">id like #id#</isNotNull> <isNotNull prepend="AND" property="name">name like #name#</isNotNull> </dynamic> </sql> <select id="getUser" resultMap="userResult"> <![CDATA[ select id, name, date from t_user ]]> <include refid="Dy_SC" /> </select> <insert id="insertUser" parameterClass="UserObject"> INSERT INTO t_user (name,date) VALUES (#name#,#date#) </insert> <insert id="insertUserTest" parameterClass="UserObject"> INSERT INTO t_user (id,name,date) VALUES (#id#,#name#,#date#) </insert> <update id="updateUser" parameterClass="UserObject"> <![CDATA[ UPDATE t_user SET name=#name#, date=#date# WHERE id = #id# ]]> </update> <delete id="deleteUser" parameterClass="java.lang.String"> delete from t_user where id=#value# </delete> <statement id="getMaxId" resultClass="java.lang.Integer"> select Max(id) from t_user </statement> <statement id="getMax" resultClass="java.util.HashMap"> select Max(id) as id,Max(name) as name,Max(date) as date from t_user </statement> </sqlMap>
这样就可以来测试了,测试也使用了两种方法,先使用一个普通应用程序来测试一下程序的运行好了。
package com.javaeye.liulu; import java.io.Reader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import com.ibatis.common.jdbc.ScriptRunner; import com.ibatis.common.resources.Resources; import com.ibatis.sqlmap.client.SqlMapClient; import com.ibatis.sqlmap.client.SqlMapClientBuilder; import com.javaeye.liulu.domain.User; public class Main { //hsql初始化,对MySQL没有影响 static { try { Properties props = Resources.getResourceAsProperties("properties/database.properties"); String url = props.getProperty("url"); String driver = props.getProperty("driver"); String username = props.getProperty("username"); String password = props.getProperty("password"); if (url.equals("jdbc:hsqldb:mem:ibatisDemo")) { Class.forName(driver).newInstance(); Connection conn = DriverManager.getConnection(url, username, password); try { ScriptRunner runner = new ScriptRunner(conn, false, false); runner.setErrorLogWriter(null); runner.setLogWriter(null); runner.runScript(Resources.getResourceAsReader("ddl/hsql/ibatisdemo-hsqldb-schema.sql")); runner.runScript(Resources.getResourceAsReader("ddl/hsql/ibatisdemo-hsqldb-dataload.sql")); } finally { conn.close(); } } } catch (Exception e) { throw new RuntimeException("Description. Cause: " + e, e); } } /** * 初始化iBatis获得一个SqlMapClient对象 * * @param * @return SqlMapClient */ public static SqlMapClient getSqlMapClient() { String resource = "com/javaeye/liulu/maps/SqlMapConfig.xml"; SqlMapClient sqlMap = null; try { Reader reader = Resources.getResourceAsReader(resource); sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader); } catch (Exception e) { e.printStackTrace(); } return sqlMap; } /** * 插入一条记录 * * @param * @return */ public static void insert() { SqlMapClient sqlMap = getSqlMapClient(); try { sqlMap.startTransaction(); User user = new User(); user.setName("insert1"); user.setDate(new Date()); sqlMap.insert("User.insertUser", user); sqlMap.commitTransaction(); } catch (SQLException e) { e.printStackTrace(); } } /** * 将第一条记录的信息更新 * * @param * @return */ public static void update() { SqlMapClient sqlMap = getSqlMapClient(); try { sqlMap.startTransaction(); User user = (User)sqlMap.queryForObject("User.getById", "1"); user.setName("update1"); sqlMap.update("User.updateUser", user); sqlMap.commitTransaction(); } catch (SQLException e) { e.printStackTrace(); } finally { try { sqlMap.endTransaction(); } catch (SQLException e) { e.printStackTrace(); } } } /** * 删除id最大的记录 * * @param * @return */ public static void delete() { SqlMapClient sqlMap = getSqlMapClient(); try { sqlMap.startTransaction(); String maxId = sqlMap.queryForObject("User.getMaxId", null).toString(); sqlMap.delete("User.deleteUser", maxId); sqlMap.commitTransaction(); } catch (SQLException e) { e.printStackTrace(); } } /** * 根据name查询User为Map的List * * @param * @return List */ public static List getUser() { SqlMapClient sqlMap = getSqlMapClient(); List<User> user = null; try { sqlMap.startTransaction(); HashMap params = new HashMap(); params.put("name", "%liulu%"); user = sqlMap.queryForList("User.getUser", params); sqlMap.commitTransaction(); } catch (SQLException e) { e.printStackTrace(); } finally { try { sqlMap.endTransaction(); } catch (SQLException e) { e.printStackTrace(); } } return user; } /** * 查询各个字段的最大值(一般用于统计,此处演示使用方法) * * @param * @return */ public static void getMax() { SqlMapClient sqlMap = getSqlMapClient(); try { sqlMap.startTransaction(); Map search = (HashMap) sqlMap.queryForObject("User.getMax", null); System.out.println(search.get("id").toString() + "\n" + search.get("name").toString() + "\n" + search.get("date").toString()); sqlMap.commitTransaction(); } catch (SQLException e) { e.printStackTrace(); } } /** * 通过主键查找,返回user * * @param * @return */ public static void getByPK() { SqlMapClient sqlMap = getSqlMapClient(); User user = new User(); try { sqlMap.startTransaction(); user.setId(1); user = (User) sqlMap.queryForObject("User.getByPK", user); System.out.println(user.getId() + "\n" + user.getName() + "\n" + user.getDate()); sqlMap.commitTransaction(); } catch (SQLException e) { e.printStackTrace(); } } public static void main(String[] args) { //insert(); //update(); //delete(); List<User> user = getUser(); for (User o : user) { System.out.println("id:" + o.getId() + "\nname:" + o.getName() + "\nDate:" + o.getDate() + "\n------------"); } //getMax(); //getByPK(); } }
所有的方法都是静态的,可以分别对映射方法进行测试。
下面使用的是单元测试对iBatis来测试,使用了dbunit这个开源项目。
首先,要为单元测试准备数据。使用DbUnit,我们可以用XML文件来准备测试数据集。
t_user对应表名
id,name,date分别对应列名
user_seed.xml
<?xml version="1.0" encoding="GBK"?> <dataset> <t_user id="1" name="liulu" date="2007-01-01"/> <t_user id="2" name="liulu2" date="2007-03-15"/> <t_user id="3" name="liulu3" date="2007-03-18"/> </dataset>
方便测试,首先为SqlMap的单元测试编写一个抽象的测试基类
package com.javaeye.liulu.test; import java.io.Reader; import java.sql.Connection; import java.sql.DriverManager; import java.util.Properties; import javax.sql.DataSource; import org.dbunit.DatabaseTestCase; import org.dbunit.database.DatabaseConnection; import org.dbunit.database.IDatabaseConnection; import com.ibatis.common.resources.Resources; import com.ibatis.db.util.ScriptRunner; import com.ibatis.sqlmap.client.SqlMapClient; import com.ibatis.sqlmap.client.SqlMapClientBuilder; public abstract class BaseSqlMapTest extends DatabaseTestCase { protected static SqlMapClient sqlMap; protected IDatabaseConnection getConnection() throws Exception { return new DatabaseConnection(getJdbcConnection()); } protected void setUp() throws Exception { super.setUp(); init(); } protected void tearDown() throws Exception { super.tearDown(); getConnection().close(); if (sqlMap != null) { DataSource ds = sqlMap.getDataSource(); Connection conn = ds.getConnection(); conn.close(); } } protected void init() throws Exception { initSqlMap("com/javaeye/liulu/maps/SqlMapConfig.xml", null); } protected SqlMapClient getSqlMapClient() { return sqlMap; } protected void initSqlMap(String configFile, Properties props) throws Exception { Reader reader = Resources.getResourceAsReader(configFile); sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader, props); reader.close(); } protected void initScript(String script) throws Exception { DataSource ds = sqlMap.getDataSource(); Connection conn = ds.getConnection(); Reader reader = Resources.getResourceAsReader(script); ScriptRunner runner = new ScriptRunner(); runner.setStopOnError(false); runner.setLogWriter(null); runner.setErrorLogWriter(null); runner.runScript(conn, reader); conn.commit(); conn.close(); reader.close(); } private Connection getJdbcConnection() throws Exception { /* Properties props = new Properties(); props.load(Resources.getResourceAsStream("properties/database.properties")); Class driver = Class.forName(props.getProperty("driver")); Connection conn = DriverManager.getConnection(props.getProperty("url"), props.getProperty("username"), props.getProperty("password")); */ Class driver = Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/ibatis_schema","root","1234"); return conn; } }
然后为每个SqlMap映射文件编写一个测试用例,extends上面的抽象类
package com.javaeye.liulu.test; import java.io.Reader; import java.util.Date; import java.util.HashMap; import java.util.List; import org.dbunit.dataset.IDataSet; import org.dbunit.dataset.xml.FlatXmlDataSet; import org.dbunit.operation.DatabaseOperation; import com.ibatis.common.resources.Resources; import com.javaeye.liulu.domain.User; public class UserTest extends BaseSqlMapTest { protected IDataSet getDataSet() throws Exception { Reader reader = Resources.getResourceAsReader("com/javaeye/liulu/test/user_seed.xml"); return new FlatXmlDataSet(reader); } public void testGetByPK() throws Exception { User user = new User(); user.setId(1); user = (User) sqlMap.queryForObject("User.getByPK", user); assertNotNull(user); assertEquals(user.getId(), 1); assertEquals(user.getName(), "liulu"); assertEquals(user.getDate().getDay(), 1); } public void testGetUser() throws Exception { List users = null; HashMap params = new HashMap(); params.put("name", "%liulu%"); users = (List) sqlMap.queryForList("User.getUser", params); assertEquals(users.size(),3); } public void testInsertUser() throws Exception { User user = new User(); user.setId(4); user.setName("insert1"); user.setDate(new Date()); sqlMap.insert("User.insertUserTest", user); User user2 = new User(); user2.setId(4); user2 = (User) sqlMap.queryForObject("User.getById", "4"); assertEquals(user.getId(),user2.getId()); assertEquals(user.getName(),user2.getName()); } public void testUpdateUser() throws Exception { User user = (User)sqlMap.queryForObject("User.getById", "1"); user.setName("liulu7"); sqlMap.update("User.updateUser", user); User user2 = (User)sqlMap.queryForObject("User.getById", "1"); assertEquals(user2.getName(),"liulu7"); } public void testDeleteUser() throws Exception { int num = sqlMap.delete("User.deleteUser", "1"); assertEquals(num,1); } public void testGetMaxId() throws Exception { int i = (Integer)sqlMap.queryForObject("User.getMaxId", null); assertEquals(3,i); } }
注意,其中测试insert时由于id为auto_increment,可能需要对测试数据中<dataset/>进行设置,网络中并未查询到相关的方法,所以在映射文件中加入了一个
<insert id="insertUserTest" parameterClass="UserObject"> INSERT INTO t_user (id,name,date) VALUES (#id#,#name#,#date#) </insert>
用例测试中测试的是insertUserTest,并非insertUser,请注意。
到这里就结束了,demo比较简单,希望能给大家带来帮助。
参考:
[url]http://ibatis.apache.org/ [/url]
http://hsqldb.org/
http://www.dbunit.org/
- _iBatisDemo.rar (287.5 KB)
- 下载次数: 7
- iBatisDemo.rar (1.9 MB)
- 下载次数: 6
发表评论
-
为什么用IBATIS不用Hibernate及不用JDBC而用IBATIS
2013-11-23 14:28 0为什么用IBATIS不用Hiberna ... -
iBatis SqlMap的配置总结
2013-05-17 09:32 1134核心提示:SqlMap的配置是iBatis中应用的核心。这部分 ... -
mybatis-generator 代码自动生成工具
2013-05-16 18:27 795mybatis-generator 代码自动生成工具 ht ... -
用ibator eclipse 插件自动生成sqlmap
2013-05-15 18:28 974http://pure.iteye.com/blog/4418 ... -
定制ibator前的一些思考
2013-05-15 15:33 882定制ibator前的一些思考 http://mov-webh ...
相关推荐
ibatisDemo 入门源码
ibatis demo,ibatis例子,ibatis示例
一个ibatis的demo含数据库哦,通过用户登录测试。
springmvc+ibatis demo搭建实现CRUD操作简单 有静态页面话技术
快速入手ibatis,内含其增删改查例子,以及配套的讲解视频。
ibatis小例子Demo,对于初学者是个很好的例子。
ibatis 例子 ibatisDemo Demo ibatis 例子 ibatisDemo Demo
struts+spring+ibatis的Demo struts+spring+ibatis的Demo struts+spring+ibatis的Demo
最简单的IBatis for .net实现
IbatisDemo包含完整的Ibatis的文档,例子和必要的jar包,
ch07_ibatisDemo.rar
iBatisDemo
利用ibatis框架写的一个demo,真的很好
ibatisDemo 数据库半自动化实现方式,比hibernate 更灵活,电信,淘宝用的数据库操作,配置上较好的数据库连接池更好
Ibatis demo 从0基础到入门,内有学习总结,初学者可以下载看下,若有疑问可以留言
简单整合了struts1+ibatis+Spring demo
IbatisNet完整的增删改查的小例子,为初学者提供方便
javamail ibatis DEMOjavamail ibatis DEMOjavamail ibatis DEMOjavamail ibatis DEMOjavamail ibatis DEMO
IbatisDemo实现基本的CRUD操作
介绍了ibatisnet如何使用动态sql的例子