相对于Hibernate提供了全面的数据库封装机制的“全自动化”ORM实现而言,iBATIS则是一种“半自动”的ORM实现。
所谓“全自动化”ORM实现是指实现了POJO(Plain Old Java Object 简单的Java对象)和数据库表之间的映射,以及SQL的自动生成和执行。而IBatis则不会为程序员在运行期间自动生成SQL语句,需要程序员自己编写,然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定的POJO中。
iBatis 与 Hibernate 的区别:
Hibernate功能强大,数据库无关性好,O/R映射能力强,如果对Hibernate相当精通,而且对Hibernate进行了适当的封装,那么整个持久层代码会相当简单,需要写的代码很少,开发速度快。Hibernate对数据库结构提供了较为完整的封装,Hibernate的O/R Mapping实现了POJO和数据库表之间的映射,以及SQL的自动生成和执行。程序员只需要定义好POJO到数据表的映射关系,即可通过Hibernate提供的方法完成持久层的操作。程序员甚至不需要对SQL相当熟练的掌握,Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的SQL并调用JDBC接口加以执行。
iBatis入门简单,即学即用,提供了数据库查询的自动绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美。当系统数据处理量巨大、性能要求极为苛刻时,这往往意味着我们必须经过高度优化的SQL语句(或存储过程)才能达到性能设计的指标。在这种情况下iBatis会有更好的可控性和表现。
总之:Hibernate比iBatis复杂,学习成本高,iBatis简单容易上手,是基于原生SQL的框架。可以说Hibernate功能强大而复杂,iBatis简单而小巧。
iBATIS的下载与配置:
iBATIS的官方下载地址:http://labs.renren.com/apache-mirror/ibatis/binaries/ibatis.java/
MYBATIS的官方下载地址:http://code.google.com/p/mybatis/downloads/list
注:iBATIS 是 3.0以前的版本的名字,3.0(包括3.0)以后的版本叫MyBatis。MyBatis 和 iBatis有很多的区别,包括包的结构和类名。而我们今天所说的iBatis是指3.0以前的版本。
注:所有的持久类属性的类型都不要声明为基本类型(int、long、float、double),应该声明为对应的封装类型(Integer、Long、Float、Double),因为IBatis是面向对象的解决方案。因此所有的属性、参数和结果必须是对象。
ibatis运行过程:
ibatis框架整体运行模式和Hibernate很像,对于每一个需要操作的实体类我们都必须创建一个类似的映射文件一般名为xxx_SqlMap.xml,在我们配置好所有的实体类的映射文件后还需要配置二个文件,一个是装有数据库连接参数的属性文件SqlMapConfig.properties;另一个是sqlMapConfig.xml文件,数据库的配置文件后面会截图给大家,主要是sqlMapConfig.xml这个文件,这个文件是我们使用ibatis操作数据库前必须要加载的,我找了一些资料上说可以使用单例模式将sqlMapClient参数作为static final类型,但是我赋值有错误,所以自己写了一个静态方法获取sqlMapClient实例。
配置文件样例(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="SqlMapConfig.properties"/>
<settings
enhancementEnabled="true"
useStatementNamespaces="true"
cacheModelsEnabled="true"
lazyLoadingEnabled="true"
/>
<transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="${driver}"/>
<property name="JDBC.ConnectionURL" value="${url}"/>
<property name="JDBC.Username" value="${username}"/>
<property name="JDBC.Password" value="${password}"/>
<property name="Pool.MaximumActiveConnections" value="10" /> <!-- 数据库连接池可维持的最大容量 -->
<property name="Pool.MaximumIdleConnections" value="5" /> <!-- 数据库连接池可挂起的连接数 -->
<property name="Pool.MaximumCheckoutTime" value="120000" /> <!-- 连接某个任务占用的最大时间(ms) -->
<property name="Pool.TimeToWait" value="500" /> <!-- 线程等待连接的最大时间(ms) -->
<property name="Pool.PingQuery" value="select 1 from users" /> <!-- 数据库连接状态检测语句 -->
<property name="Pool.PingEnabled" value="false" /> <!-- 是否允许检测连接状态 -->
<property name="Pool.PingConnectionsOlderThan" value="1" /> <!-- 对连接时间超过设定值将进行连接检测 -->
<property name="Pool.PingConnectionsNotUsedFor" value="1" /> <!-- 对空闲超过设定值的连接进行检测 -->
</dataSource>
</transactionManager>
<sqlMap resource="com/ego/vo/users_SqlMap.xml" />
</sqlMapConfig>
数据库属性文件配置:
#MySql数据库连接参数配置
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/testibatis
username=root
password=111111
users_SqlMap.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="users">
<cacheModel id="userCache" type="LRU">
<flushInterval hours="24"/>
<property name="size" value="1000"/>
</cacheModel>
<typeAlias alias="User" type="com.ego.vo.User"/> <!-- 使用别名 -->
<resultMap id="userResult" class="User">
<result property="userId" column="ID" jdbcType="VARCHAR"/>
<result property="username" column="USERNAME" jdbcType="VARCHAR"/>
<result property="password" column="PASSWORD" jdbcType="VARCHAR"/>
<result property="age" column="AGE" jdbcType="VARCHAR"/>
</resultMap>
<select id="getUser" cacheModel="userCache" resultMap="userResult" parameterClass="User">
SELECT * FROM T_USER WHERE ID=#userId:NUMERIC#
</select>
<select id="getUserList" cacheModel="userCache" resultMap="userResult" parameterClass="User">
SELECT * FROM T_USER
</select>
<insert id="insertUser" parameterClass="User">
insert into T_USER(ID,USERNAME,PASSWORD,AGE)
values(#userId:NUMERIC#,#username:VARCHAR#,#password:VARCHAR#,#age:NUMERIC#);
</insert>
<update id="updateUser" parameterClass="User">
update T_USER set USERNAME=#username:VARCHAR#,PASSWORD=#password:VARCHAR#,AGE=#age:NUMERIC#
where ID=#userId:NUMERIC#;
</update>
<delete id="deleteUser" parameterClass="User">
delete from T_USER where ID="userId:NUMERIC";
</delete>
</sqlMap>
测试类:
package com.ego.dao;
import java.io.IOException;
import java.io.Reader;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.ego.vo.User;
import com.ibatis.common.resources.Resources;
import com.ibatis.common.util.PaginatedList;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
public class UserDao {
/**
* 获取SqlMapClient实例
* @return
*/
public static SqlMapClient getSqlMapClient(){
SqlMapClient sqlMapClient=null;
String resource = "sqlMapConfig.xml";
//加载配置文件和映射文件
try {
Reader reader = Resources.getResourceAsReader(resource);
sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
} catch (IOException e) {
e.printStackTrace();
}
return sqlMapClient;
}
/**
* 插入对象
* @param sqlMapClient
* @throws Exception
*/
public void insertUser(SqlMapClient sqlMapClient) throws Exception{
sqlMapClient.startTransaction();
User user = new User();
user.setUserId("1007");
user.setAge("25");
user.setUsername("GYL");
user.setPassword("1234");
sqlMapClient.insert("users.insertUser", user);
sqlMapClient.commitTransaction();
}
/**
* 查询单个对象
* @param sqlMapClient
* @return
* @throws Exception
*/
public User queryForObject(SqlMapClient sqlMapClient) throws Exception{
sqlMapClient.startTransaction();
User user=new User();
try {
user.setUserId("1007");
//String userId =new String("1007");
user = (User)sqlMapClient.queryForObject("users.getUser",user);
System.out.println("userDao:"+user.toString());
} catch (SQLException e) {
e.printStackTrace();
}
sqlMapClient.commitTransaction();
return user;
}
/**
* 查询集合
* @param sqlMapClient
* @return
* @throws Exception
*/
public List<User> queryForList(SqlMapClient sqlMapClient) throws Exception{
sqlMapClient.startTransaction();
List<User> users = new ArrayList<User>();
users = (List<User>)sqlMapClient.queryForList("users.getUserList",null,0,3);
sqlMapClient.commitTransaction();
return users;
}
/**
* 分页查询
* @param sqlMapClient
* @return
*/
public PaginatedList queryForPaginatedList(SqlMapClient sqlMapClient){
PaginatedList usersByPage=null;
try {
usersByPage = sqlMapClient.queryForPaginatedList("users.getUserList", null,3);
} catch (SQLException e) {
e.printStackTrace();
}
return usersByPage;
}
/**
* 测试方法
* @param args
*/
public static void main(String[] args) {
UserDao userDao = new UserDao();
SqlMapClient sqlMapClient = UserDao.getSqlMapClient();
// try {
// userDao.insertUser(sqlMapClient);
// System.out.println("成功!!!");
// } catch (Exception e) {
// System.out.println(" 失败!!!");
// e.printStackTrace();
// }
// try {
// User user = userDao.queryForObject(sqlMapClient);
// System.out.println("User:"+user.toString());
// } catch (Exception e) {
// e.printStackTrace();
// }
//List<User> users = new ArrayList<User>();
// try {
// users = userDao.queryForList(sqlMapClient);
// } catch (Exception e) {
// e.printStackTrace();
// }
// System.out.println("Size:"+users.size());
//
// for(User user:users){
// System.out.println("user:"+user.toString());
// }
PaginatedList users=null;
users = userDao.queryForPaginatedList(sqlMapClient);
System.out.println("Size:"+users.size());
users.nextPage();
int n = users.getPageIndex();
System.out.println("n"+n);
for(int i=0;i<users.size();i++){
User user = (User)users.get(i);
System.out.println("user:"+user.toString());
}
}
}
实体类User:
package com.ego.vo;
public class User {
private String userId;//用户ID
private String username;//用户名
private String password;//密码
private String age;//
public User(){
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getUserId() {
return userId;
}
public String getUsername() {
return username;
}
public void setUserId(String userId) {
this.userId = userId;
}
@Override
public String toString() {
return "User [age=" + age + ", password=" + password + ", userId="
+ userId + ", username=" + username + "]";
}
}
数据库字段:
见附图 其中ID和AGE是int类型。
本篇有部分参考其他资料,如有侵权行为,请联系我,我会及时删除,谢谢。
相关推荐
【作品名称】:基于servlet+jsp+mysql实现的影视管理系统【课程设计】 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: 基于servlet+jsp+mysql实现的影视管理系统【课程设计】 基于servlet+jsp+mysql实现的影视管理系统【课程设计】 Java Web课程设计,基于servlet+jsp+ajax+mysql做的影视管理系统 运行环境: Tomcat 9.0 JDK 1.8 MySQL 8.0 后台管理账号密码均为:root,项目依赖:lib 目录 【资源声明】:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。需要有一定的基础看懂代码,自行调试代码并解决报错,能自行添加功能修改代码。
kernel-5.15-ky10-x86.tar.gz
【作品名称】:基于AT89C51 单片机为核心器件,程序设计采用C 语言,Keil 软件编译程序,配以相关外围接口电路,实现了方波、锯齿波、正弦波、三角波、梯形波五种特定波形的产生【论文+源码】 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:本设计中的波形发生器系统要求基于51单片机,因此选用以AT89C51单片机作为整个系统的控制核心,应用其强大的接口功能,构成整个波形发生器的硬件系统。使用C 语言对单片机编程可产生相应的正弦波,方波,三角波,锯齿波梯形波波形信号。在程序运行时,当接收到按键信息后,需要输出某种波形时,调用相应的中断服务子程序和波形发生程序,经电路的数/模转换器和运算放大器处理后,从信号发生器的输出端口输出即可得到要求的波形。 当需要改变频率时只需要改变单片机的波形发生程序中的递增或者递减变量即可。 【资源声明】:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。需要有一定的基础看懂代码,自行调试代码并解决报错,能自行添加功能修改代码。
基于java的法律咨询系统设计与实现.docx
适用于元营销 API 的 Python SDK适用于 Python 的 Facebook Business SDK 介绍Facebook Business SDK是一站式服务,可帮助我们的合作伙伴更好地服务于他们的业务。合作伙伴正在使用多个 Facebook API 来满足其客户的需求。采用所有这些 API 并在各个平台上保持最新状态可能非常耗时,而且最终会造成高昂的成本。为此,Facebook 开发了 Business SDK,将其许多 API 捆绑到一个 SDK 中,以简化实施和维护。Business SDK 是 Marketing API SDK 的升级版,其中包括 Marketing API 以及来自不同平台(如 Pages、Business Manager、Instagram 等)的许多 Facebook API。快速入门商业SDK入门指南Python 目前是我们第三方开发人员最常用的语言。是一个 Python 包,它提供了您的 Python 应用程序与Business SDK 内的 Facebook APIfacebook_business之间的
数学建模培训资料 数学建模实战题目真题答案解析解题过程&论文报告 公交车调度的运作数学模型 共12页.pdf
smart-http 是一款可编程的 Http 应用微内核,方便用户根据自身需求进行 Server 或 Client 的应用开发。支持GET、POST的 HTTP 请求。提供了 URL 路由组件,可以快速搭建一套静态服务器。支持部分 RFC2612 规范,后续会逐渐完善。支持 Https 协议,由 smart-socket 为其赋能。具备文件上传的能力。支持 websocket、Cookie支持 Server、Client 开发
新闻资讯系统 微信小程序+SpringBoot毕业设计 源码+数据库+论文+启动教程 项目启动教程:https://www.bilibili.com/video/BV1oiBpYcEBp
高校师生工作室-JAVA-基于微信小程序的高校师生工作室管理系统的设计与实现
基于java的常见小儿疾病中医护理系统设计与实现.docx
本教程播放列表涵盖了 Python 中的数据结构和算法。每个教程都有数据结构或算法背后的理论、BIG O 复杂性分析和可供练习的练习。使用 Python 的数据结构和算法本教程涵盖了 Python 中的数据结构和算法。每个教程都包含数据结构或算法背后的理论、BIG O 复杂度分析以及可供练习的练习。要观看视频,您可以访问播放列表https://www.youtube.com/playlist?list=PLeo1K3hjS3uu_n_a__MI_KktGTLYopZ12订阅 codebasics youtube 频道https://www.youtube.com/c/codebasics
数学建模学习资料 蒙特卡罗方法课件教程 第2章.随机数 共29页.pptx
python实现基于CNN网络的新闻数据集文本分类源码+数据集(Python期末大作业),个人大三学期的期末大作业、经导师指导并认可通过的高分大作业设计项目,评审分98分。主要针对计算机相关专业的正在做大作业的学生和需要项目实战练习的学习者,可作为课程设计、期末大作业。 python实现基于CNN网络的新闻数据集文本分类源码+数据集(Python期末大作业)python实现基于CNN网络的新闻数据集文本分类源码+数据集(Python期末大作业),个人大三学期的期末大作业、经导师指导并认可通过的高分大作业设计项目,评审分98分。主要针对计算机相关专业的正在做大作业的学生和需要项目实战练习的学习者,可作为课程设计、期末大作业。python实现基于CNN网络的新闻数据集文本分类源码+数据集(Python期末大作业),个人大三学期的期末大作业、经导师指导并认可通过的高分大作业设计项目,评审分98分。主要针对计算机相关专业的正在做大作业的学生和需要项目实战练习的学习者,可作为课程设计、期末大作业。python实现基于CNN网络的新闻数据集文本分类源码+数据集(Python期末大作业),个人大
中小学知识产权教育试点学校申报表.doc
基于django的音乐推荐系统.zip
在建工程涉及专项行动情况检查表.docx
本项目是一个基于Python技术的学生管理系统,采用Django框架进行开发,旨在为计算机相关专业的学生提供一个实践性强、功能全面的管理系统,以帮助他们完成毕业设计或进行项目实战练习。 系统实现了对学生信息、课程信息、成绩、考勤等多方面的管理功能。学生信息管理包括学生基本信息的增删改查;课程信息管理允许管理员设置课程信息,包括课程名称、授课老师、学分等;成绩管理功能使学生和教师能够录入、查看和修改成绩;考勤管理则方便教师记录学生的出勤情况。 该项目采用B/S架构,前端使用HTML、CSS、JavaScript等技术,后端使用Python语言和Django框架,数据库采用MySQL。Django框架提供了强大的后台管理功能,使得系统管理更加便捷。 通过开发这个项目,学生不仅能提升自己的编程能力,还能学习到如何构建一个实际应用的系统,对于即将步入职场的学生来说,具有很高的实用价值。
适用于 Python 的 Splunk 软件开发工具包参考文档适用于 Python 的 Splunk Enterprise 软件开发工具包版本 2.1.0适用于 Python 的 Splunk Enterprise 软件开发套件 (SDK) 包含库代码,旨在使开发人员能够使用 Splunk 平台构建应用程序。Splunk 平台是一个搜索引擎和分析环境,它使用分布式 map-reduce 架构来有效地索引、搜索和处理大型时变数据集。Splunk 平台深受系统管理员的欢迎,用于聚合和监控 IT 机器数据、安全性、合规性以及各种其他场景,这些场景都需要有效地从大量时间序列数据中索引、搜索、分析和生成实时通知。Splunk 开发者平台使开发人员能够利用 Splunk 平台所使用的相同技术来构建令人兴奋的新应用程序。开始使用 Python 版 Splunk SDK开始使用 Python 版 Splunk Enterprise SDKSplunk Enterprise SDK for Python 包含库代码,其示例位于splunk-app-examples存储库
分布式事务练习
家庭财务管理系统 微信小程序+SSM毕业设计 源码+数据库+论文+启动教程 项目启动教程:https://www.bilibili.com/video/BV1BfB2YYEnS