- 浏览: 187367 次
- 性别:
- 来自: 郑州
文章分类
最新评论
-
youngbird221:
楼主有答案了么
ERROR JDBCTransaction : Could not toggle autocommi -
xuyoubin1987:
谢了 支持楼主
Struts2+Spring2.5+Ibatis2.3图书管理 -
wx_hello:
哈哈。。谢啦。。
Struts2+Spring2.5+Ibatis2.3图书管理 -
zhuzhijia:
为啥跟图片的高度有关?请教
JavaScript——延迟加载技术 -
zhameng:
...
JavaScript——延迟加载技术
有一段没有更新博客啦,还请各位原谅。
这段时间一直在看Ibatis方面的东西,把IBatis的官方文档也都看完啦,觉得IBatis真就像官方说的那个门槛很低,但更加灵活。
下面三段是引用《Ibatis开发指南》上的原话。
相对 Hibernate和Apache OJB等“一站式”ORM解决方案而言,ibatis 是一种“半
自动化”的ORM实现。
所谓“半自动” ,可能理解上有点生涩。纵观目前主流的 ORM,无论 Hibernate 还是
Apache OJB,都对数据库结构提供了较为完整的封装,提供了从 POJO 到数据库表的全
套映射机制。 程序员往往只需定义好了POJO 到数据库表的映射关系, 即可通过 Hibernate或者 OJB 提供的方法完成持久层操作。程序员甚至不需要对 SQL 的熟练掌握,
Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的 SQL 并调用 JDBC 接口加以执
行。
“半自动化” ,是相对Hibernate等提供了全面的数据库封装机制的 “全自动化”
ORM 实现而言, “全自动”ORM 实现了 POJO 和数据库表之间的映射,以及 SQL 的自动
生成和执行。 而ibatis 的着力点, 则在于POJO 与 SQL之间的映射关系。也就是说,ibatis并不会为程序员在运行期自动生成 SQL 执行。具体的 SQL 需要程序员编写,然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定 POJO。
看了这种描述,对你有何感想呢。
出于对技术的热情,花时间把Ibatis看了一下,觉得真的还不错,就写个简单的例子,供大家参考,有什么不足的地方还请各位指出来。
本例子所用到的Jar文件为:
首先还是老一套,创建一张数据库表(使用Mysql数据库)。
然后呢,创建POJO类:
大家也看到啦,Person类里的属性与person表的字段并不一致,不过没有关系的,在SqlMap中可以使用ResultMap元素进行配置的。
现在呢,就要配置Ibatis的两个关键配置SqlMapConfig映射文件和SqlMap映射文件。
首先要配置的当然是SqlMapConfig文件:
setting元素可以配置和优化SqlMapClient对象的各选项,因为本例只是简单的使用,所有并没有必要去配置。
现在配置SqlMap文件person.xml,此文件是专门针对您的POJO类进行配置的
OK,现在所有的配置都已经完成啦,现在来做一个简单的测试:
好了,以上就是全部的实现,希望会对初学的朋友有所帮助。
我用oracle
预生成(如Oracle)和后生成两种类型(如MS-SQL Server)。下面是两个例子:
<settings useStatementNamespaces="true" />
然后在你的resultMap配置中,定义result ... select="namespace.xxx"
这段时间一直在看Ibatis方面的东西,把IBatis的官方文档也都看完啦,觉得IBatis真就像官方说的那个门槛很低,但更加灵活。
下面三段是引用《Ibatis开发指南》上的原话。
相对 Hibernate和Apache OJB等“一站式”ORM解决方案而言,ibatis 是一种“半
自动化”的ORM实现。
所谓“半自动” ,可能理解上有点生涩。纵观目前主流的 ORM,无论 Hibernate 还是
Apache OJB,都对数据库结构提供了较为完整的封装,提供了从 POJO 到数据库表的全
套映射机制。 程序员往往只需定义好了POJO 到数据库表的映射关系, 即可通过 Hibernate或者 OJB 提供的方法完成持久层操作。程序员甚至不需要对 SQL 的熟练掌握,
Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的 SQL 并调用 JDBC 接口加以执
行。
“半自动化” ,是相对Hibernate等提供了全面的数据库封装机制的 “全自动化”
ORM 实现而言, “全自动”ORM 实现了 POJO 和数据库表之间的映射,以及 SQL 的自动
生成和执行。 而ibatis 的着力点, 则在于POJO 与 SQL之间的映射关系。也就是说,ibatis并不会为程序员在运行期自动生成 SQL 执行。具体的 SQL 需要程序员编写,然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定 POJO。
看了这种描述,对你有何感想呢。
出于对技术的热情,花时间把Ibatis看了一下,觉得真的还不错,就写个简单的例子,供大家参考,有什么不足的地方还请各位指出来。
本例子所用到的Jar文件为:
ibatis-2.3.jar mysql-connecter.jar
首先还是老一套,创建一张数据库表(使用Mysql数据库)。
CREATE DATABASE IBATISSTUDY; CREATE TABLE PERSON( ID INT PRIMERY KEY AUTU_INCREMENT, U_NAME VARCHAR(20), U_PASSWORD VARCHAR(20) )
然后呢,创建POJO类:
package com.jack.ibatis.pojo; public class Person { private int id; private String username; private String password; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
大家也看到啦,Person类里的属性与person表的字段并不一致,不过没有关系的,在SqlMap中可以使用ResultMap元素进行配置的。
现在呢,就要配置Ibatis的两个关键配置SqlMapConfig映射文件和SqlMap映射文件。
首先要配置的当然是SqlMapConfig文件:
<?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文件,加载数据库连接信息 --> <properties resource="mysql.properties"/> <!--配置和优化SqlMapClient实例的各选项,是可选的 <settings cacheModelsEnabled="true" enhancementEnabled="true" lazyLoadingEnabled="true" errorTracingEnabled="true" maxRequests="32" maxSessions="10" maxTransactions="5" useStatementNamespaces="false" /> --> <!-- 配置Ibatis事务管理,使用JDBC事务类型,数据源使用Simple类型 --> <transactionManager type="JDBC"> <dataSource type="SIMPLE"> <property name="JDBC.Driver" value="${mysql.driver}"/> <property name="JDBC.ConnectionURL" value="${mysql.url}"/> <property name="JDBC.Username" value="${mysql.username}"/> <property name="JDBC.Password" value="${mysql.password}"/> </dataSource> </transactionManager> <!-- 配置Ibatis要使用的SqlMap文件信息 --> <sqlMap resource="com/jack/ibatis/pojo/map/person.xml"/> </sqlMapConfig>
setting元素可以配置和优化SqlMapClient对象的各选项,因为本例只是简单的使用,所有并没有必要去配置。
现在配置SqlMap文件person.xml,此文件是专门针对您的POJO类进行配置的
<?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> <!-- 为Person类设置一个别名 --> <typeAlias alias="person" type="com.jack.ibatis.pojo.Person"/> <!-- 配置表和类之间的映射关系 --> <resultMap class="com.jack.ibatis.pojo.Person" id="personMap"> <result property="id" column="ID"/> <result property="username" column="U_NAME"/> <result property="password" column="U_PASSWORD"/> </resultMap> <!-- 添加用户 --> <insert id="insertPerson" parameterClass="person"> <!-- 配置Mysql主键自动增长 --> <selectKey keyProperty="id" resultClass="int"> SELECT LAST_INSERT_ID() as value </selectKey> <!-- 配置Oracle主键自动增长 <selectKey resultClass="int" keyProperty="id" type="pre"> <![CDATA[SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL]]> </selectKey>--> <!-- 配置MSServer主键自动增长 <selectKey resultClass="int" keyProperty="id"> <![CDATA[SELECT SCOPE_IDENTITY() AS ID ]]> </selectKey>--> <![CDATA[ INSERT PERSON(U_NAME,U_PASSWORD) VALUES(#username#,#password#) ]]> </insert> <!-- 查看特定用户 --> <select id="queryPersonById" parameterClass="int" resultMap="personMap"> <![CDATA[ SELECT * FROM PERSON WHERE ID=#id# ]]> </select> <!-- 查看所有的用户 --> <select id="queryAllPerson" resultMap="personMap"> <![CDATA[ SELECT * FROM PERSON ]]> </select> </sqlMap>
OK,现在所有的配置都已经完成啦,现在来做一个简单的测试:
package test.com.jack.ibatis; import java.io.Reader; import org.junit.Test; import com.ibatis.common.resources.Resources; import com.ibatis.sqlmap.client.SqlMapClient; import com.ibatis.sqlmap.client.SqlMapClientBuilder; import com.jack.ibatis.pojo.Person; public class TestPerson { @Test public void testInsert(){ String resource = "sqlMapConfig.xml"; try { //读取配置文件 Reader reader = Resources.getResourceAsReader(resource); //得到SqlMapClient SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader); Person person = new Person(); person.setUsername("jack"); person.setPassword("jack"); //开始Ibatis事务 sqlMap.startTransaction(); sqlMap.insert("insertPerson", person); //结束IBatis事务 sqlMap.commitTransaction(); } catch (Exception e) { e.printStackTrace(); } } @Test public void testQuery(){ String resource = "sqlMapConfig.xml"; try { //读取配置文件 Reader reader = Resources.getResourceAsReader(resource); //得到SqlMapClient SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader); //查看全部的用户 sqlMap.queryForList("queryAllPerson"); //查看特定的用户 sqlMap.queryForObject("queryPersonById", 1); }catch(Exception e){} } }
好了,以上就是全部的实现,希望会对初学的朋友有所帮助。
- ibatisStudy.rar (796.7 KB)
- 描述: IBatis简单实例全部信息。
- 下载次数: 725
评论
16 楼
xnxqs
2009-07-14
楼主你的例子有错误。
com.ibatis.common.beans.ProbeException: Could not set property 'id' to value 'null' for com.jack.ibatis.pojo.Person. Cause: java.lang.IllegalArgumentException
at com.ibatis.common.beans.ComplexBeanProbe.setProperty(ComplexBeanProbe.java:368)
at com.ibatis.common.beans.ComplexBeanProbe.setObject(ComplexBeanProbe.java:234)
at com.ibatis.common.beans.GenericProbe.setObject(GenericProbe.java:90)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.executeSelectKey(SqlMapExecutorDelegate.java:427)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.insert(SqlMapExecutorDelegate.java:387)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.insert(SqlMapSessionImpl.java:82)
at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.insert(SqlMapClientImpl.java:58)
at test.com.jack.ibatis.TestPerson.testInsert(TestPerson.java:26)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:66)
at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: java.lang.IllegalArgumentException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.ibatis.common.beans.MethodInvoker.invoke(MethodInvoker.java:17)
at com.ibatis.common.beans.ComplexBeanProbe.setProperty(ComplexBeanProbe.java:356)
... 27 more
还有,你在帖子上的person.xml的配置中。
<!-- 添加用户 -->
<insert id="insertPerson" parameterClass="person">
<!-- 配置Mysql主键自动增长 -->
<selectKey keyProperty="id" resultClass="int">
SELECT LAST_INSERT_ID() as value @1
---------------------------------------
上面的value是不是应该改为ID??
----------------------------------------
</selectKey>
<!-- 配置Oracle主键自动增长
<selectKey resultClass="int" keyProperty="id" type="pre">
<![CDATA[SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL]]>
</selectKey>-->
<!-- 配置MSServer主键自动增长
<selectKey resultClass="int" keyProperty="id">
<![CDATA[SELECT SCOPE_IDENTITY() AS ID ]]>
</selectKey>-->
<![CDATA[
INSERT PERSON(U_NAME,U_PASSWORD) VALUES(#username#,#password#)
]]>
</insert>
----------------------------
另外。对于自增长主键来说,mysql和sql的自增长ID应该属于后发型,即 type="post"但你没有配置,并且把selectKey 写到前面去了,这样的话应该会报错吧?我猜报ID无法SET的原因就在于此吧??
--------------------------
本人其实也写过类似的例子,但始终无法搞定的就是插入后获得自增长ID值 的问题。网上的方法基本都试过,但获得依旧为NULL,不知道 为什么。。。哭。。。。
com.ibatis.common.beans.ProbeException: Could not set property 'id' to value 'null' for com.jack.ibatis.pojo.Person. Cause: java.lang.IllegalArgumentException
at com.ibatis.common.beans.ComplexBeanProbe.setProperty(ComplexBeanProbe.java:368)
at com.ibatis.common.beans.ComplexBeanProbe.setObject(ComplexBeanProbe.java:234)
at com.ibatis.common.beans.GenericProbe.setObject(GenericProbe.java:90)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.executeSelectKey(SqlMapExecutorDelegate.java:427)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.insert(SqlMapExecutorDelegate.java:387)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.insert(SqlMapSessionImpl.java:82)
at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.insert(SqlMapClientImpl.java:58)
at test.com.jack.ibatis.TestPerson.testInsert(TestPerson.java:26)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:66)
at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: java.lang.IllegalArgumentException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.ibatis.common.beans.MethodInvoker.invoke(MethodInvoker.java:17)
at com.ibatis.common.beans.ComplexBeanProbe.setProperty(ComplexBeanProbe.java:356)
... 27 more
还有,你在帖子上的person.xml的配置中。
<!-- 添加用户 -->
<insert id="insertPerson" parameterClass="person">
<!-- 配置Mysql主键自动增长 -->
<selectKey keyProperty="id" resultClass="int">
SELECT LAST_INSERT_ID() as value @1
---------------------------------------
上面的value是不是应该改为ID??
----------------------------------------
</selectKey>
<!-- 配置Oracle主键自动增长
<selectKey resultClass="int" keyProperty="id" type="pre">
<![CDATA[SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL]]>
</selectKey>-->
<!-- 配置MSServer主键自动增长
<selectKey resultClass="int" keyProperty="id">
<![CDATA[SELECT SCOPE_IDENTITY() AS ID ]]>
</selectKey>-->
<![CDATA[
INSERT PERSON(U_NAME,U_PASSWORD) VALUES(#username#,#password#)
]]>
</insert>
----------------------------
另外。对于自增长主键来说,mysql和sql的自增长ID应该属于后发型,即 type="post"但你没有配置,并且把selectKey 写到前面去了,这样的话应该会报错吧?我猜报ID无法SET的原因就在于此吧??
--------------------------
本人其实也写过类似的例子,但始终无法搞定的就是插入后获得自增长ID值 的问题。网上的方法基本都试过,但获得依旧为NULL,不知道 为什么。。。哭。。。。
15 楼
tinyhot
2009-04-02
谢谢楼主,分享。
14 楼
merman
2008-12-03
孤风浪客 写道
这些主键生成机制都是用数据本身机制生成的,有没有办法自定义主键生成机制呢。比如说用UUID来写主键?
PS:不是用Pojo中的setId(String str)这样子将生成的UUID赋值给主键字段。
PS:不是用Pojo中的setId(String str)这样子将生成的UUID赋值给主键字段。
我用oracle
<insert id="insertUser" parameterClass="user"> INSERT INTO USER_INFO ( id, name, sex) VALUES ( sys_guid(), #name#, #sex# ) </insert>
预生成(如Oracle)和后生成两种类型(如MS-SQL Server)。下面是两个例子:
< !—Oracle SEQUENCE Example --> <insert id="insertProduct-ORACLE" parameterClass="com.domain.Product"> <selectKey resultClass="int" keyProperty="id" > SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL </selectKey> insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values (#id#,#description#) </insert> <!— Microsoft SQL Server IDENTITY Column Example --> <insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product"> insert into PRODUCT (PRD_DESCRIPTION) values (#description#) <selectKey resultClass="int" keyProperty="id" > SELECT @@IDENTITY AS ID </selectKey> </insert>
13 楼
jishan2008
2008-12-03
我第一次接触ibatis这个框架,感觉好可以啊,我以后会常来的。
12 楼
孤风浪客
2008-11-28
这些主键生成机制都是用数据本身机制生成的,有没有办法自定义主键生成机制呢。比如说用UUID来写主键?
PS:不是用Pojo中的setId(String str)这样子将生成的UUID赋值给主键字段。
PS:不是用Pojo中的setId(String str)这样子将生成的UUID赋值给主键字段。
11 楼
Jun_OuYang
2008-11-28
zhi chi!
10 楼
mmwy
2008-11-03
pejaming 写道
请问,ibatis涉及到1:n等关系是否就不能把单独的映射类拆分成多个映射文件
因为在resultMap中需要把外键字段映射到类中的对象字段
因为在resultMap中需要把外键字段映射到类中的对象字段
<settings useStatementNamespaces="true" />
然后在你的resultMap配置中,定义result ... select="namespace.xxx"
9 楼
流浪者A
2008-11-03
还可以啊~
8 楼
InnocentBoy
2008-10-31
mvmouse 写道
同楼上,标题有歧义……
楼主有个简单的例子,地址是:http://www.iteye.com/topic/247467,这是其中的一个方面吧!
7 楼
pejaming
2008-10-13
请问,ibatis涉及到1:n等关系是否就不能把单独的映射类拆分成多个映射文件
因为在resultMap中需要把外键字段映射到类中的对象字段
因为在resultMap中需要把外键字段映射到类中的对象字段
6 楼
yanghaofeilong
2008-10-12
支持顶啊!
5 楼
mvmouse
2008-10-10
同楼上,标题有歧义……
4 楼
caipanjin
2008-10-09
我以为楼主自己实现了一个简单的“iBatis”呢
3 楼
coolstar648
2008-10-08
挺好的。
有时间自己搭建一个demo玩玩.
有时间自己搭建一个demo玩玩.
2 楼
rockxx
2008-10-07
今天刚好要学这个,非常感谢LZ!
1 楼
jy02411368
2008-09-29
放心吧 像这样的好东西 我会定期不间断的来回复了!!!支持支持 大大的支持
发表评论
-
分类排序方法——上移下移操作(Java版)
2009-11-27 19:03 6951最近项目中遇到了上移下移操作的一个操作,以前也看到 ... -
分类排序方法——上移下移操作(ASP版)
2009-11-27 10:34 1858最近项目中遇到了上移下移操作的一个操作,以前也看到过,但一 ... -
Mapabc——地图标注
2009-08-31 10:21 2028项目中使用到了地图标注的功能(mapabc),现在将代码共享出 ... -
表单常用JS验证
2009-08-31 08:21 1276在Web项目中,总会或多或少的使用的Form表单,包含空字符及 ... -
Internet Explorer无法打开站点,已终止操作
2008-12-28 14:28 3210在页面还没有ready的时候就调用了htmlObject的ap ... -
Struts2+Spring2.5+Ibatis2.3图书管理加强版-输入校验、国际化
2008-09-28 11:50 1828昨天写了个基础的Struts+Spring+Ibatis ... -
Struts2+Spring2.5+Ibatis2.3图书管理
2008-09-27 13:50 9467看了Ibatis也有好长时间啦,一直也没有和Struts ... -
电子地图--MapABC研究(三)为地图上添加点并得到中心坐标
2008-08-28 10:56 2369出于项目的需要,还要继续对MapABC进行研究,昨天看了 ... -
电子地图--MapABC研究(二)地图编辑
2008-08-26 14:09 1973这是电子地图研究的第二部分。 普通用户使用地图无非就是 ... -
电子地图--MapABC研究(一)
2008-08-26 08:48 1797回头想想做J2EE也有一年多啦,这一年中一经历了很多很多, ... -
Dwr2+Struts2+Spring2.5+Hibernate3完美整合--用户登录注册系统
2008-08-23 09:51 7977用户注册和登录是每个系统的必须存在的一部分,基于Dwr+S ...
相关推荐
在Ibatis中,只需在Mapper XML文件中的`<insert>`标签中设置`useGeneratedKeys="true"`和`keyProperty="id"`,就可以让数据库自动生成主键。 4. **雪花算法(Snowflake Algorithm)**: 在分布式环境下,为了保证...
在本教程"08_传智播客ibatis教程_sql主键生成方式"中,你将会深入学习到如何在Ibatis中配置和使用上述各种主键生成策略,通过实例和代码讲解,帮助你更好地理解和掌握Ibatis在处理SQL主键生成方面的技巧和最佳实践。...
本教程“08_传智播客ibatis教程_sql主键生成方式”主要聚焦于如何在Ibatis中处理SQL查询时的主键生成策略,这对于确保数据的一致性和完整性至关重要。 Ibatis允许开发者自定义SQL语句,包括插入、更新、删除和查询...
Ibatis生成器(也称为MyBatis Generator)允许用户通过配置文件定义规则,然后根据数据库表结构自动生成相应的Java类、Mapper接口和XML映射文件。 **自定义Ibatis生成器的核心知识点:** 1. **MyBatis框架**:...
要实现MySQL数据库到Java实体类和iBatis配置文件的自动化生成,可以使用一些工具或插件,例如MyBatis Generator(MBG)。MBG是一个强大的工具,能够根据数据库表生成Java模型类、Mapper接口和XML配置文件。以下是...
为了进一步提高开发效率,开发者们设计了一系列的代码生成工具,如"Ibatis Helper"和"generator"等,它们能够自动生成基于Ibatis或Mybatis的CRUD(Create, Read, Update, Delete)代码,从而减少手动编写SQL和实体类...
本项目提供的"mybatis自动sql生成插件源码"则进一步提升了开发效率,通过拦截器(Interceptor)在运行时自动生成SQL语句,适用于具有主键或唯一索引的单表操作。 首先,`AutoMapperInterceptor.java`是这个插件的...
它能够根据数据库中的表结构自动生成对应的Java实体类、Mapper接口及XML配置文件、Service接口及实现类、Controller层代码等,覆盖了Web应用开发的基本模块,使得开发者可以更专注于业务逻辑的实现,而不是基础代码...
本篇文章将深入探讨如何使用Ibatis框架实现对`student`表的增删改查操作,包括模糊查询以及利用序列自动生成主键。 首先,我们来理解Ibatis的基本概念。Ibatis是由Apache基金会维护的一个开源项目,它是一个SQL映射...
- **Delete**:类似地,使用@Delete注解定义删除操作,传入相应的主键或条件,Ibatis会根据这些条件生成并执行删除SQL。 - **Update**:使用@Update注解,编写更新的SQL语句,通过传入的对象属性来确定更新哪些...
`IBatis Codesmith` 的核心功能是通过模板引擎,根据用户定义的模板和数据库元数据,自动生成Java DAO(数据访问对象)层、实体类以及Mapper XML文件。这样,开发者无需手动编写重复的CRUD(创建、读取、更新、删除...
`Abator`作为`Ibatis`的代码生成器,通过简单的配置,可以自动生成DAO接口、实现类以及对应的实体类。使用步骤如下: 1. **配置Abator**:你需要创建一个`abator-config.xml`配置文件,指定数据库连接信息、生成的...
Ibatis提供了多种主键生成策略,比如`identity`(标识列,适用于自动增长类型)、`sequence`(序列,Oracle常用)和`guid`(全局唯一标识符)。在Oracle环境下,我们通常会创建一个序列对象,然后在映射文件中配置...
- **自动生成的主键**:对于INSERT操作,可以通过设置`useGeneratedKeys="true"`来启用主键自动生成。 - **存储过程**:支持调用数据库的存储过程,并通过`<call>`标签定义。 - **`parameterClass`和`parameterMap...
通过使用 XDoclet 和特定的 Javadoc 标签,我们可以为 iBatis 自动生成 SQL 映射文件,这极大地简化了开发过程并提高了开发效率。这种方式尤其适用于那些具有大量实体类和映射关系的项目,能够显著减少手动编写配置...
在`updateUser()`方法上使用`@Update`注解,传入待更新的对象,Ibatis会自动生成更新语句。 在实际项目中,通常会有一个配置文件(如`mybatis-config.xml`),用来配置数据源、事务管理器等。另外,每个Mapper接口...
iBatis会自动处理主键生成和参数绑定,提高开发效率。 2. **删除记录**:删除操作分为删除指定记录和删除全部记录。使用`<delete>`标签定义删除语句,可以按ID或其他条件进行删除。在Java代码中,调用Mapper接口的...
Ibatis会自动生成实现这个接口的代理类,使得你可以像调用普通方法一样执行SQL。 **4. SqlSessionFactory与SqlSession** Ibatis使用SqlSessionFactory来创建SqlSession实例,SqlSession是与数据库交互的主要接口。...
iBATIS支持自动生成的主键,可以自动将主键生成到数据库表中。自动生成的主键可以提高开发效率和减少错误。 十、parameterClass parameterClass是iBATIS的一个重要概念,用于定义参数的类型和关系。parameterClass...
对于支持自动生成主键的数据库,Ibatis 提供了 `<selectKey>` 元素来获取新生成的主键值。在插入语句中,`<selectKey>` 通常置于 `<insert>` 元素内,用于在插入数据后获取数据库生成的主键。例如,对于Oracle,...