简单介绍一下IBatis
是什么:iBATIS一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2001年发起的开放源代码项目。最初侧重于密码软件的开发,现在是一个基于Java的持久层框架。
iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO),同时还提供一个利用这个框架开发的JPetStore实例。
相对Hibernate和Apache OJB等“一站式”ORM解决方案而言,ibatis 是一种“半自动化”的ORM实现。
所谓“半自动”,可能理解上有点生涩。纵观目前主流的 ORM,无论 Hibernate 还是Apache OJB,都对数据库结构提供了较为完整的封装,提供了从POJO 到数据库表的全套映射机制。程序员往往只需定义好了POJO 到数据库表的映射关系,即可通过 Hibernate或者OJB 提供的方法完成持久层操作。程序员甚至不需要对 SQL 的熟练掌握,Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的 SQL 并调用 JDBC 接口加以执行。
为什么:看到这里我想很多人想要问,为什么要弄一个半自动化的持久层框架,这里的话就要从hibernate的缺陷说起,虽然hibernate使得对数据的操作变得简单,但是如果数据库的数据处理量特别大,性能也要求很高,需要对sql语句进行优化才能够达到预期的要求,这个时候hibernate确实就是一个累赘了。所以在hibernate和jdbc之间多了一个选择,那就是IBatis,他使得开发人员不用在写繁琐的数据库访问代码,和字段读取操作。并且自己写sql语句。
怎么做:具体代码在附件中
1.建表
CREATE TABLE `users` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `age` varchar(255) DEFAULT NULL, PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; CREATE PROCEDURE `sp_modify_user`(in_id Integer, in_age Integer) begin update users set age=in_age where id=in_id; end;
2.建一个实体类
package com.ibatis.entity; /** * * @author Administrator * User实体类 */ public class Users { private int id; private String name; private int age; 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; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
4.一个映射
<?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="Users"> <typeAlias alias="AllUsersParm" type="com.ibatis.entity.Users"/> <select id="getUsers" resultClass="AllUsersParm"> SELECT id,name,age FROM USERS </select> <insert id="addUser"> insert into USERS(id,name,age) values(#id#,#name#,#age#) </insert> <select id="getUser" parameterClass="int" resultClass="com.ibatis.entity.Users"> SELECT id,name,age FROM USERS WHERE id = #id# </select> <delete id="deleteUser" parameterClass="int"> delete from users where id=#id# </delete> <update id="modifyUser" parameterClass="AllUsersParm"> update users <dynamic prepend="set"> <isNotNull prepend="," property="name"> name=#name# </isNotNull> <isGreaterThan prepend="," property="age" compareValue="0"> age=#age# </isGreaterThan> </dynamic> where id=#id# </update> <procedure id="updateUserAgeById" parameterClass="java.util.Map"> <!-- {call sp_modify_user($id$,$age$)} --> call sp_modify_user($id$,$age$) </procedure> <!-- 分页 --> <select id="pageUsers" parameterClass="java.util.Map" resultClass="AllUsersParm"> select * from users <dynamic prepend="WHERE"> <isGreaterThan prepend="AND" property="age" compareValue="0"> age > $age$ </isGreaterThan> </dynamic> order by id limit $beginCount$,$pageSize$ </select> <!-- 二元条件元素 属性解释: prepend:可被覆盖的sql语句组成部分,添加在语句的前面(可选) property:被比较的属性(必须) compareProperty:另一个用于和前者比较的属性(必须或选择comPareValue) compareValue:用于比较的值(必须或选择compareProperty) isEqual isLessEqual isLessThan isGreaterThan isGreaterEqual:比较属性值是否大于等于静态值或另一个属性值 isPropertyAvailable:检查是否存在该属性(存在parameter bean 的属性) isNotPropertyAvailable:检查是否存在该属性(不存在parameter bean 的属性) isNull:检查属性是否为null isNotNull:检查属性是否不为null isEmpty:检查Collection.size()的值,属性的String或String.valueOf()值,是否为null或空(""或size()<1) isNotEmpty:检查Collection.size()的值,属性的String或String.valueOf()值,是否不为null或不为空(不为""或size()>0) if:<isNotEmpty prepend="and" property="name"> name=#name# </isNotEmpty> isParameterPresent:检查是否存在参数对象(不为null) isNotParameterPresent:检查是否不存在参数对象 --> </sqlMap>
5.IBatis配置文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd"> <sqlMapConfig> <properties resource="com/ibatis/db.properties" /> <settings cacheModelsEnabled="true" enhancementEnabled="true" lazyLoadingEnabled="true" maxRequests="32" maxSessions="10" maxTransactions="5" useStatementNamespaces="false" /> <transactionManager type="JDBC"> <dataSource type="SIMPLE"> <property name="JDBC.Driver" value="${driver}" /> <property name="JDBC.ConnectionURL" value="${url}" /> <property name="JDBC.Username" value="${user}" /> <property name="JDBC.Password" value="${password}" /> </dataSource> </transactionManager> <sqlMap resource="com/ibatis/Users.xml" /> </sqlMapConfig> <!-- (文件元素说明: resource:属性列表配置文件,以便用于数据库连接参数设置。 settings: cacheModelsEnabled:数据高速缓存,提高程序性能,利用LRU(最近最久未使用)方法对使用过的数据保存在内存中。默认true enhancementEnabled:指定是否用cglib中那些已优化的类来提高延迟加载的性能。默认ture lazyLoadingEnabled:延迟加载,除非绝对需要,否则推迟加载的技术。默认true maxRequests(已废弃):一次最多有多少个请求,默认为512 maxSessions(已废弃):任何时候只允许会话数,默认128 maxTransactions(已废弃):事务最大数目,默认32 useStatementNamespaces:在引用已映射语句时,是否需要使用限定名。默认false transactionManager:处理所有的数据库事务。 dataSoutce:数据源工厂 property:配置项 sqlMap:配置SQLMAP文件 typeAlias:定义别名) -->6.后面的太长了还是下附件吧。。
对于这种问题。还是没有理解编译java是怎么实现的呀。。包呀。兄弟。导包,网上一大堆。