ibatis学习笔记(完整)
1. Ibatis是开源软件组织Apache推出的一种轻量级的对象关系映射(ORM)框架,和Hibernate、Toplink等在java编程的对象持久化方面深受开发人员欢迎。
对象关系映射(ORM):简单原理是通过面向对象方式操作关系型数据库,目前存储数据最常用最流行的工具是关系型数据库,其操作方式是通过SQL语句操作数据库的表,但是对于Java面向对象编程语言中,所有的操作对象都是对象,因此对象关系映射就是把数据库表和java编程语言中的对象对应起来,把表的列同java对象中的字段对应起来,程序员在程序开发过程中不再是使用原始SQL语句去直接操作数据库,而是通过ORM提供的查询语句操作普通的java对象,ORM将其提供的对普通java对象的查询语句翻译成SQL语句来操作数据库,从而屏蔽了不同数据库SQL语句的差别,简化了程序开发工作,提高了程序的可移植性。
2. Ibatis开发的准备工作:
(1).将Ibaits相关的jar包添加到工程的类路径下。
(2).Ibatis工程的主要配置文件为:
a.Ibatis的总配置文件SqlMapConfig.xml。
b.Ibatis的实体映射文件。
3.Ibatis总配置文件:
Ibatis的总配置文件主要是配置数据库连接相关信息,和Ibatis实体映射文件。其写法示例如下:
- <? 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>
- <transactionManager type=”JDBC” commitRequired=”false”>
- <dataSource type=”SIMPLE”>
- <property name= “JDBC.Driver” value=”数据库的jdbc驱动”/>
- <property name=”JDBC.ConnectionURL” value=”数据库的url”/>
- <property name=”JDBC.Username” value=”数据库用户名”/>
- <property name=”JDBC.Password” value=”数据库的密码”/>
- ……
- </dataSource>
- </transactionManager>
- <sqlMap resource=”Ibatis的实体映射文件”/>
- ……
- </sqlMapConfig>
4. Ibatis实体映射文件的写法示例:
Ibatis的实体映射文件是Ibatis框架的核心,起作用是将Java的持久化实体对象和关系型数据库映射起来,其内容主要是包括java实体各种增删改查操作对应的数据库语句。其写法示例如下:
- <? 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=”Ibatis命名空间”>
- <typeAlias alias=”实体类类别名” type=”实体类全路径”/>
- <!--restultMap主要是用于Ibatis对数据增删改查操作的返回值结果对于java对象的映射,一般用于所返回的对象可能包含的是一个以上java对象的字段,如果是一个java对象中的字段一般使用resultClass-->
- <resultMap id=”结果集id” class=”实体类别名”>
- <result property=”java实体类中的属性名” column=”数据库表中的列名”/>
- ……
- </resultMap>
- ……
- </sqlMap>
5. 读取Ibatis的总配置文件得到SqlMapClient:
- private static SqlMapClient sqlMapClient = null;
- static{
- try{
- Reader reader = com.ibatis.common.resource.Resources.getResourceAsReader(“Ibatis总配置文件路径”);
- sqlMapClient = com.ibatis.sqlMap.client.SqlMapClientBuilder.builderSqlMapClient(reader);
- reader.close();
- }catch(IOException e){
- 异常处理…….
- }
- }
6. Ibatis的SQL Map:
(1).Ibatis的SQL Map的核心概念是Mapped Statement。Mapped Statement可以使用任意的SQL语句,并拥有parameterMap/parameterClass(输入参数)和resultMap/resultClass(输出结果)。
(2). <statement>元素是个通用的声明,可以用于任何类型的SQL语句,但是通常使用具体的<statement>类型,如:查询使用<select>,添加使用<insert>,更新使用<update>,删除使用<delete>。
7. Ibatis的增删改查操作简单例子:
(1).实体类必须遵循JavaBean的规范,提供一个无参数的构造方法,字段必须提供get和set方法。
(2).在Ibatis对应的实体映射文件的<sqlMap>标签元素添加如下:
a.Ibatis添加:
- <insert id=”Ibatis添加实体操作Id” parameterClass=”参数类型”>
- insert into 实体对应数据库中的表名(实体字段对应的表的列名1, 实体字段对应的表的列名2,……) values(#实体类字段1#,#实体类字段2#......);
- </insert>
注意:Ibatis增删改查语句的参数是通过parameterClass或者parameterMap传递的。Ibatis只能传递一个参数,如果又多个参数需要封装在一个对象中。
b. Ibatis删除:
- <delete id=”Ibatis删除实体操作Id” parameterClass=”参数类型”>
- delete from 实体对应数据库中的表名 where 列名=#列名对应的实体字段名#;
- </delete>
注意:删除和查询时,经常需要根据一定条件操作,有时可能需要模糊查询,对于模糊查询如name like‘%c%’。在Ibatis中有两种写法:
写法1:在java方法中传递参数时写成:”%字段名%”。
写法2:在Ibatis的sql语句中可以写成如:where name=’%$字段名$%’。
a. Ibatis更新:
- <update id=”Ibatis更新实体操作Id” parameterClass=”参数类型”>
- update 实体对应数据库的表名 set 列名1=#字段1#,列名2=#字段2#,…….where ….;
- </update>
b. Ibatis查询
- <select id=”Ibatis查询实体操作Id” resultClass=”查询结果类型” >
- select * from 实体对应的表名;
- </select>
注意:这里演示的是最简单的查询,其结果是一个实体的集合。
8. 在java对象中使用Ibatis的statement操作:
(1).根据Ibatis总配置文件得到SqlMapClient对象,具体方法参见“5. 读取Ibatis的总配置文件得到SqlMapClient”。
(2).使用SqlMapClient对象的queryForObject(),queryForList(),insert(),delete(),update()方法。这些方法都需要一个传递一个参数:在实体映射文件中定义的操作statementId,如果这些定义的操作还需要输入参数,则还需要传递输入参数对象。简单用法如下:
实体对象类型 对象= sqlMapClient.queryForObject(“实体映射文件命名空间.statementId”, “查询条件参数”);
9. Ibatis主键自动生成:
通过使用<select>的子元素<selectkey>来支持自动生成主键。对于不同的数据库主键自动生成机制是不同的,Oracle是通过自增序列欲生成的,MS-SQL Server是通过Identity后生成的。这里以Oracle数据库为例简单讲述一下主键自动生成的方法:
(1).首先在Oracle数据库中创建一个自增的序列:
create Sequence 序列名
start with 1
increment 1;
(2).在insert标签中插入selectkey子标签:
- <insert id=”添加实体操作Id” parameterClass=”输入参数类型”>
- <selectkey resultClass=”int” keyProperty=”自定义主键名称”>
- select 序列名.nextval from dual;
- </selectkey>
- insert into 表名(主键,列名1,列名2,……)
- values(#自定义主键名称#,#字段1#,#字段2#,…….);
- </insert>
注意:selectkey标签中的keyProperty属性是主键赋值的对象。
10. Ibatis的内嵌参数:
所谓内嵌参数是指,使用Ibatis时,当没有给定参数传递值时,Ibatis会使用默认的值代替。
语法为:#参数值:数据库中数据类型:内嵌参数#
一个简单的例子如下:
- <statement id=”insertProduct” parameterClass=”Product”>
- Insert into Product(PRD_ID,PRD_DESC)
- values(#id:Number:-999999#,#desc:varchar:noEntry#);
- </statement>
当id没有给定值是数据库中默认为0,当desc没有给定值是数据库默认给定noEntry。
11. Ibatis对象之间的关系:
Ibatis的输入参数和输出参数只能是一个,因此,当输入参数在一个实体对象时,使用parameterClass,当输入对象也只在一个实体对象中时,使用resultClass。
但是有很多时候输入参数和输出参数可能包含在几个实体对象中,我们不能为了只传递一个参数而专门为这些输入和输出参数组合专门创建类,因此就需要使用parameterMap和resultMap来组合多个实体对象中的字段。
以resultMap为例,使用方法如下:
- <resultMap id=”resultMapId”>
- <result property=”……” column=”…….” select=”实体映射文件中的StatementId”/>
- ……
- </resultMap>
12. Ibatis的SQL Map通过<procedure>标签元素调用存储过程:
存储过程是数据库将一组完成特定功能的Sql语句进行编译,每次调用时不必重新编译,因此执行速度和效率都比直接使用Sql语句有很大优势。在Ibatis中通过<procedure>标签元素可以直接调用数据库的存储过程,其过程如下:
(1).定义存储过程所需输入/输出参数,如:
- <parameterMap id=”存储过程参数” class=”map”>
- <parameter property=”email1” jdbcType=”varchar” javaType=”java.lang.String” mode=”INOUT”/>
- <parameter property=”email2” jdbcType=”varchar” javaType=”java.lang.String” mode=”INOUT”/>
- </parameterMap>
(2).调用存储过程,如:
- <procedure id=”Ibatis调用存储过程” parameterMap=” 存储过程参数”>
- {call 存储过程名(?,?)}
- </procedure>
注意:Ibatis调用存储过程时,要确保始终只使用JDBC标准的存储过程语法。
13. Ibatis与Spring集成:
现在Java Web开发中,SSH(Spring,Sturts,Hibernate)三个开源框架组合非常流行,对于一些对Hibernate不熟悉或者怀疑Hibernate性能的人,也可以使用Ibatis代替Hibernate框架,即SSI(Spring,Struts,Ibatis)。Spring和Struts的集成这里不多说了,具体说一下Spring和Ibatis的集成。
(1).对Ibatis工程引入Spring支持,即将Spring相关的jar包加入到类路径中,在/src目录下创建spring配置文件,在web.xml文件中指定spring配置文件并添加spring的WebContext启动监听器。
(2).将对数据库的连接信息放交由spring管理,在spring配置文件中添加数据库连接信息:
- <bean id=”dataSource” class=”org.apache.commons.dbcp.BasicDataSource” destroy-method=”close”>
- <property name=”driverClassName” value=”数据库驱动类”/>
- <property name=”url” value=”数据库连接URL”/>
- <property name=”username” value=”数据库连接用户名”/>
- <property name=”password” value=”数据库连接密码”/>
- </bean>
(3).在spring配置文件中添加对Ibatis的支持:
- <bean id=”sqlMapClient” class=”org.springframework.orm.ibatis.SqlMapClientFactoryBean”>
- <property name=”configLocation” value=”Ibatis总配置文件路径”/>
- <!--为Spring创建的SqlMapClient对象指定数据源-->
- <property name=”dataSource” ref=”dataSource”/>
- </bean>
(4).在Ibatis总配置文件中移除关于数据库连接的信息,只需在Ibatis总配置文件中配置实体映射文件即可。
至此,Spring和Ibatis就无缝集成起来,在使用时Spring会读取创建SqlMapClient对象,并为其注入数据源,直接通过spring获得SqlMapClient对象就可以直接使用。
14. Ibatis优缺点总结:
优势:使用标准的Sql语句,与JDBC相比简单方便,减少了代码量,架构和性能得到增强;与Hibernate等ORM工具相比因为更接近Sql语句,性能可控;sql语句与程序代码分隔,简化了项目分工,大大提高并行开发的可能性。
缺点:还需要写标准的sql语句,不像Hibernate完全屏蔽了底层数据库的差异,程序的可移植性比Hibernate和JPA要差;输入参数和输出参数都只能有一个,程序编写的灵活性不是太高。
15. 这里只是简单总结了Ibatis的入门开发知识,对于实体之间关系等比较深入了解Ibatis相关的知识其实和Hibernate,JPA等类似,这里不再赘述。
ibatis学习笔记(完整)的更多相关文章
- ibatis 学习笔记 3 - pfpfpfpfpf的专栏 - 博客频道 - CSDN.NET
body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...
- 【原创】SpringBoot & SpringCloud 快速入门学习笔记(完整示例)
[原创]SpringBoot & SpringCloud 快速入门学习笔记(完整示例) 1月前在系统的学习SpringBoot和SpringCloud,同时整理了快速入门示例,方便能针对每个知 ...
- Spring MVC学习笔记——完整的用户登录
1.搭建环境的第一步是导包,把下面这些包都导入工程中 /media/common/工作/Ubuntu软件/SpringMVC_jar包整理/aop/media/common/工作/Ubuntu软件/S ...
- X-Cart 学习笔记 完整目录
如果有需要,可以直接联系博主,讨论学习 一.了解X-CART. 3 二.PHP环境搭建... 3 三.安装配置X-CART. 4 1.下载X-Cart并配置域名,映射地址... 4 2.配置X-Car ...
- SqlAlchemy个人学习笔记完整汇总-转载
使用 sqlalchemy 有3种方式: 方式1, 使用raw sql; 方式2, 使用SqlAlchemy的sql expression; 方式3, 使用ORM. 前两种方式可以统称为 core ...
- ibatis学习笔记
步骤: 搭建配置环境:导入相关jar包 配置文件: JDBC连接属性文件 总配置文件 关于每个实体的映射(map.xml)文件 JDBC连接属性文件 jdbc.properties ## mysql ...
- SQLAlchemy 学习笔记(一):Engine 与 SQL 表达式语言
个人笔记,如有错误烦请指正. SQLAlchemy 是一个用 Python 实现的 ORM (Object Relational Mapping)框架,它由多个组件构成,这些组件可以单独使用,也能独立 ...
- IBatis.Net学习笔记六--再谈查询
在IBatis.Net学习笔记五--常用的查询方式 中我提到了一些IBatis.Net中的查询,特别是配置文件的写法. 后来通过大家的讨论,特别是Anders Cui 的提醒,又发现了其他的多表查询的 ...
- [原创]java WEB学习笔记21:MVC案例完整实践(part 2)---DAO层设计
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
随机推荐
- C#之Dictionary 与 C++之map
最近重学二叉查找树,顺便就好好看了看C#里Dictionary和C++的map的实现原理. 首先简单说明两个基本数据结构: 1. 散列表 散列表是一个key-value数据结构,可根据key值直接访问 ...
- linux free命令下 cached占用很大
# 背景 使用free -h命令,展示如下: # 解决方法 先执行sync命令,同步数据 然后执行 echo 1 > /proc/sys/vm/drop_caches echo 2 > / ...
- tar.gz 解压
tar -xzvf .tar.gz tar [-cxtzjvfpPN] 文件与目录 .... 参数: -c :建立一个压缩文件的参数指令(create 的意思): -x :解开一个压缩文件的参数指令! ...
- cesium编程入门(六)添加 3D Tiles,并调整位置,贴地
添加 3D Tiles,并调整位置 3D Tiles 是什么 3DTiles数据集是cesium小组AnalyticlGraphics与2016年3月定义的一种数据集,3DTiles数据集以分块.分级 ...
- Load sharepoint envirement by powershell
#判断当前上下文环境中是否装在了SharePoint的Powershell环境,如果没有装载,则装载到当前运行环境.$Snapin = get-PSSnapin | Where-Object {$_. ...
- iOS Keychain 跨应用
Keychain 可以用来持久保存一些信息.通常每个应用都有自己的 Keychain Access.但有时你会需要多个应用共用一些信息.这时需要创建 Keychain Access Group. Ke ...
- sql语句中group by使用
group by分组函数,group by name 将查询结果按照name进行分组,相同name的记录一组,配合聚合函数,显示每个name的情况. 1,数据源 表A结构如下: CREATE TA ...
- 【awk】按小时切割日志
需求: 把日志按日志内容中的小时数做切割 {hostname=ali-beijing-msync-3512} 2017-05-17 23:17:52.694 [info] <0.27292.70 ...
- spring管理hibernate session的问题探究
我们再用spring管理hibernate的时候, 我们会继承HibernateDaoSupport 或者HibernateTemplate类. 我们不知道这两个类之间有什么关系. 也没有去关闭ses ...
- ubuntu下apache2使用的简单总结
一. 修改apache2原80端口为90端口 1. 修改/etc/apache2/ports.conf, 将端口80改为90,443,改为444 2. 修改/etc/apache2/sites ...