今天开始学习iBatis框架,感觉这个框架很轻巧,方便,使用上手很快,没有多大的难点,下面就介绍一下第一个应用开发的步骤:

第一步:在mysql的test数据库中建立一张表:account

create table account(
_id int,first_name varchar(10),
last_name varchar(10),
emall varchar(10),
primary key(_id)
)engine=InnoDB default charset=gb2312;

然后插入两条测试数据:

insert account(_id,first_name,last_name,emall) values(1,'jiangwei','wei','123@qq.com');
insert account(_id,first_name,last_name,emall) values(2,'huang','yang','234@qq.com');

这样第一步就完成了

第二步:开始配置iBatis文件:

首先来看一下应用工程的结构图:

配置:Account.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="Account">//命名空间 <!-- 给Account实体类起一个别名 -->
<typeAlias alias="Account" type="com.ibatis.demo.domain.Account"/> <!-- 将Account实体类中的属性和mysql中的account表中的字段对应起来 -->
<resultMap id="AccountResult" class="Account">
<result property="id" column="_id"/>
<result property="firstName" column="first_name"/>
<result property="lastName" column="last_name"/>
<result property="emailAddress" column="emall"/>
</resultMap> <!-- 查询account表中所有数据,其中id是这条查询语句的id号,在代码中用到,具有唯一性 -->
<select id="selectAllAccounts" resultMap="AccountResult">
select * from account
</select> <!-- 通过id来查询account表中的数据 -->
<select id="selectAccountById" parameterClass="int" resultClass="Account">
select
id as _id,
first_name as firstName,
last_name as lastName,
emall as emailAddress
from account
where _id = #id#
</select> <!--插入语句-->
<insert id="insertAccount" parameterClass="Account">
insert into accout (
_id,
first_name,
last_name,
emall
values (
#id#, #firstName#, #lastName#, #emailAddress#
)
</insert> <!-- 更新语句 -->
<update id="updateAccount" parameterClass="Account">
update account set
first_name = #firstName#,
last_name = #lastName#,
emall = #emailAddress#
where
_id = #id#
</update> <!-- 删除语句 -->
<delete id="deleteAccountById" parameterClass="int">
delete from account where _id = #id#
</delete> </sqlMap>

上面的配置完成后,接下来开始配置全局的文件: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> <!-- 配置数据库连接 -->
<transactionManager type="JDBC" commitRequired="false">
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="com.mysql.jdbc.Driver"/>
<property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8"/>
<property name="JDBC.Username" value="root"/>
<property name="JDBC.Password" value="jiangwei"/>
<property name="Pool.MaximumActiveConnections" value="10" />
<property name="Pool.MaximumIdleConnections" value="5" />
<property name="Pool.MaximumCheckoutTime" value="120000" />
<property name="Pool.TimeToWait" value="500" />
<property name="Pool.PingQuery" value="select 1 from account" />
<property name="Pool.PingEnabled" value="false" />
<property name="Pool.PingConnectionsOlderThan" value="1" />
<property name="Pool.PingConnectionsNotUsedFor" value="1" />
</dataSource>
</transactionManager> <!-- 配置SQL查询的配置文件的Account.xml -->
<sqlMap resource="/Account.xml"/> </sqlMapConfig>

对于上面的数据源配置的参数说明:

transactionManager节点定义了iBatis的事务管理器,提供三种方式,(1、JDBC,2、jta:分布式数据库,3、EXTERNAL:itbatis本身不做事务处理由外部进行处理);
dataSource节点:从属于transactionManager节点,用于设定ibatis运行期使用的DataSource属性;
type属性:type属性指定了dataSource的实现模式,共三种模式,(1、simple:ibatis提供的较小的连接池 2、dbcp:是apache实现的连接池 3、jndi:tomcate或weblogic提供的服务);

JDBC.Driver:JDBC驱动;

JDBC.ConnectionURL:数据库连接URL,如果用的是SQLServer JDBC Driver,需要在url后追加SelectMethod=Cursor以获得JDBC事务的多Statement支持; JDBC.Username:数据库用户名;

JDBC.Password:数据库用户密码;

Pool.MaximumActiveConnections:数据库连接池可维持的最大容量;

Pool.MaximumIdleConnections:数据库连接池中允许的挂起(idle)连接数;

Pool.MaximumCheckoutTime数据库连接池中,连接被某个任务所允许占用的最大时间,如果超过这个时间限定,连接将被强制收回,(毫秒);

Pool.TimeToWait:当线程试图从连接池中获取连接时,连接池中无可用连接可供使用,此时线程将进入等待状态,直到池中出现空闲连接。此参数设定了线程所允许等待的最长时间,(毫秒);

Pool.PingQuery:数据库连接状态检测语句。某些数据库在某段时间持续处于空闲状态时会将其断开。而连接池管理器将通过此语句检测池中连接是否可用,

检测语句应该是一个最简化的无逻辑SQL。如“select 1 from user”,如果执行此语句成功,连接池管理器将认为此连接处于可用状态;

Pool.PingEnabled:是否允许检测连接状态;

Pool.PingConnectionsOlderThan:对持续连接时间超过设定值(毫秒)的连接进行检测;

Pool.PingConnectionsNotUsedFor:对空闲超过设定值(毫秒)的连接进行检测;

第三步实现源代码:

Account的实体类:

package com.ibatis.demo.domain;

public class Account {

  private int id;
private String firstName;
private String lastName;
private String emailAddress; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getFirstName() {
return firstName;
} public void setFirstName(String firstName) {
this.firstName = firstName;
} public String getLastName() {
return lastName;
} public void setLastName(String lastName) {
this.lastName = lastName;
} public String getEmailAddress() {
return emailAddress;
} public void setEmailAddress(String emailAddress) {
this.emailAddress = emailAddress;
} }

这个类没什么好说的了。

然后就是iBatis访问数据的类:

package com.ibatis.demo.data;

import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import com.ibatis.common.resources.Resources;
import com.ibatis.demo.domain.Account; import java.io.Reader;
import java.io.IOException;
import java.util.List;
import java.sql.SQLException; public class IbaitsData { private static SqlMapClient sqlMapper; static {
try {
//读取iBatis的配置文件:SqlMapConfig.xml
Reader reader = Resources.getResourceAsReader("/SqlMapConfig.xml");
sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
reader.close();
} catch (IOException e) {
throw new RuntimeException("Something bad happened while building the SqlMapClient instance." + e, e);
}
} //查询account表中的所有记录
@SuppressWarnings("unchecked")
public static List selectAllAccounts () throws SQLException {
return sqlMapper.queryForList("selectAllAccounts");
} //查询account表中_id为id的记录
public static Account selectAccountById (int id) throws SQLException {
return (Account) sqlMapper.queryForObject("selectAccountById", id);
} //插入一条记录
public static void insertAccount (Account account) throws SQLException {
sqlMapper.insert("insertAccount", account);
} //更新一条记录
public static void updateAccount (Account account) throws SQLException {
sqlMapper.update("updateAccount", account);
} //删除一条记录
public static void deleteAccount (int id) throws SQLException {
sqlMapper.delete("deleteAccount", id);
} }

这个类就是访问数据库的数据,可以查看一下sqlMapper的一些其他的方法的使用.

然后就是写一个ServletDemo来访问数据测试了:

package com.ibaits.demo.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import com.ibatis.demo.data.IbaitsData; public class ServletDemo extends HttpServlet{ private static final long serialVersionUID = -1461257848765985759L; @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
try{
req.setAttribute("listAccout", IbaitsData.selectAllAccounts());
req.getRequestDispatcher("/index.jsp").forward(req, resp);
}catch(Exception e){
e.printStackTrace();
}
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
doGet(req,resp);
} }

这里只测试了访问所有的记录,将访问的结果放到request域中,然后再index.jsp中使用jstl标签访问:

 <!-- c:forEach标签的使用:迭代 -->
<c:forEach var="userBean" items="${listAccout}">
用户id:<c:out value="${userBean.id}"></c:out>
姓:<c:out value="${userBean.firstName}"></c:out>
名:<c:out value="${userBean.lastName}"></c:out>
邮箱地址:<c:out value="${userBean.emailAddress}"></c:out>
<br><br>
</c:forEach>

最后千万不要忘记导入相关的jar包:具体引用到的jar包可以查看上面的图片。

iBatis开发的一个应用的更多相关文章

  1. Spring+Ibatis开发

    Spring+Ibatis开发:1.首先回忆Spring+Hibernate开发:那么时候我们是先加入的Spring,然后在加入Hibernate支持包的,而此时我们Spring+Ibatis开发,原 ...

  2. 我开发了一个产品--Markdown Notes

    大家好,我开发了一个工具类软件产品--Markdown Notes,中文名是Markdown笔记.想写一篇有关它的文章,目的就是为了推广.推广.推广:) BTW:本文就是用这个工具所写的.

  3. [Ruby on Rails系列]3、初试Rails:使用Rails开发第一个Web程序

    本系列前两部分已经介绍了如何配置Ruby on Rails开发环境,现在终于进入正题啦! Part1.开发前的准备 本次的主要任务是开发第一个Rails程序.需要特别指出的是,本次我选用了一个(Paa ...

  4. honeywell D6110开发的一个工厂仓库追溯识别

    近日.接触并开发了一个用honeywell D6110 二维扫描PDA的项目,应用也比較简单. 就是货品物料编码.通过中间码相应,然后中间码再依照不同OEM品牌须要生成各种商品条码并带有流水号. 要求 ...

  5. 开发部署一个简单的Servlet

    Servlet是一个执行在服务器端的Java Class文件,载入前必须先将Servlet程序代码编译成.class文件,然后将此class文件放在servlet Engline路径下.Servlet ...

  6. WPF和Expression Blend开发实例:一个样式实现的数字输入框

    原文:WPF和Expression Blend开发实例:一个样式实现的数字输入框 今天来一个比较奇淫技巧的手法,很少人用,同时也不推荐太过频繁的使用. 先上样式: <Style x:Key=&q ...

  7. 使用Kotlin开发第一个Android应用

    直奔主题 第一步:为AndroidStudio安装Kotlin插件 在线安装步骤:File—>Settings—>Plugins—>Install JetBrains plugin… ...

  8. 原来这样就可以开发出一个百万量级的Android相机

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由QQ空间开发团队发表于云+社区专栏 最近我负责开发了一个跟Android相机有关的需求,新功能允许用户使用手机摄像头,快速拍摄特定尺寸 ...

  9. Netty入门二:开发第一个Netty应用程序

    Netty入门二:开发第一个Netty应用程序 时间 2014-05-07 18:25:43  CSDN博客 原文  http://blog.csdn.net/suifeng3051/article/ ...

随机推荐

  1. Java数组有什么特征

    数组是(相同类型数据)的(有序)(集合) 数组会在内存中开辟一块连续的空间,每个空间相当于之前的一个变量,称为数组的元素element 元素的表示 数组名[下标或者索引] scores[7] scor ...

  2. express 使用art-template模板引擎

    下载express-art-template art-template - app.js中配置 - 注册一个模板引擎 - `app.engine('.html',express-art-templat ...

  3. vue 使用Animate.css库

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. 在CMake中启用VS2017的C++17特性

    VS2017的C++17特性默认并未开启,需要在编译参数中手动开启.找到项目的CMakeLists.txt,在查找编译器的代码后面加入如下内容即可. ") include(CheckCXXC ...

  5. QDomDocument::clear()的调用,会导致关闭程序时崩溃!!!

    //读一份xml前,先清理m_Doc[QDomDocument] bool XmlIO::xmlRead(QString &errmsg) { m_mutex.lock(); // m_Doc ...

  6. 6380. 【NOIP2019模拟2019.10.06】小w与最长路(path)

    题目 题目大意 给你一棵树,对于每一条边,求删去这条边之后,再用一条边(自己定)连接两个连通块,形成的树的直径最小是多少. 正解 首先,将这棵树的直径给找出来.显然,如果删去的边不在直径上,那么答案就 ...

  7. python3-xlwt-Excel设置(字体大小、颜色、对齐方式、换行、合并单元格、边框、背景、下划线、斜体、加粗)

    搬运出处: https://blog.csdn.net/weixin_44065501/article/details/88899257 # coding:utf-8 import patterns ...

  8. 行业顶级NoSQL成员坐阵,NoSQL数据库专场重点解析!

    NoSQL数据库作为数据库市场最重要的组成之一,它的一举一动都影响着成千上万的企业.本专场邀请了行业顶级的NoSQL核心成员与大家共同展望NoSQL数据库的未来,阿里巴巴.MongoDB.Rediss ...

  9. BZOJ 2326: [HNOI2011]数学作业(矩阵乘法)

    传送门 解题思路 NOIp前看到的一道题,当时想了很久没想出来,NOIp后拿出来看竟然想出来了.注意到有递推\(f[i]=f[i-1]*poww[i]+i\),\(f[i]\)表示\(1-i\)连接起 ...

  10. AcWing 142. 前缀统计 字典树打卡

    给定N个字符串S1,S2…SNS1,S2…SN,接下来进行M次询问,每次询问给定一个字符串T,求S1S1-SNSN中有多少个字符串是T的前缀. 输入字符串的总长度不超过106106,仅包含小写字母. ...