Batis-iBatis基本操作(增删改查)
Batis-iBatis基本操作(增删改查)
在上一篇iBatis博客中已介绍了如何 配置iBatis环境,这篇博客主要进行介绍一些iBatis的基本操作实现。iBatis的增删改操作都需要操作SqlMap,DAO层Manger,POJO 这几个类来实现。 下面分别介绍一下iBatis基本操作的实现:
一.iBatis的添加数据方式
这里介绍两种iBatis添加数据的方式:基本方式,添加用户信息;通过map方式,添加用户信息。
若要使用iBatis执行任何CRUD(创建、查询、更新、删除)操作,需要创建一个POJO类。如下:
1.建立POJO对象--User
package com.azj.test; /**
* 用户实体类
* @author AZJ
*
*/
public class User {
/**
* 唯一标识
*/
private String id;
/**
* 名字
*/
private String firstName;
/**
* 姓
*/
private String lastName;
/**
* 电子邮件
*/
private String email;
/**
* 照片信息
*/
private String img; public String getId() {
return id;
}
public void setId(String 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 getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getImg() {
return img;
}
public void setImg(String img) {
this.img = img;
} }
2.上面User POJO类对应的数据库表为

3.在SqlMap中添加添加用户信息的方法
<?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="User">
<!-- 使用别名可以避免每次都输入类路径全称 -->
<typeAlias alias="User" type="com.azj.test.User"/>
<!-- 添加用户信息 -->
<insert id="addUsers" parameterClass="User">
INSERT INTO A_USER(
ID,
FIRST_NAME,
LAST_NAME,
) VALUES(
#id#,
#firstName#,
#lastName#,
#email#
)
</insert>
<!-- 通过map方式,添加用户信息 -->
<insert id="addUsersByMap" parameterClass="java.util.HashMap">
INSERT INTO A_USER(
ID,
FIRST_NAME,
LAST_NAME,
) VALUES(
#id#,
#firstName#,
#lastName#,
#email#
)
</insert> </sqlMap>
4.编写Manager类
Manager类数据DAO层,连接数据库,对数据库进行增删改查操作。类中添加两种添加用户信息的方法,与SqlMap中添加用户方法对应:
package com.azj.test; import java.io.IOException;
import java.io.Reader;
import java.sql.SQLException;
import java.util.List;
import java.util.Map; import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder; /**
* Dao层,连接数据库,对数据库进行增删改查操作
* @author azj
*
*/
public class Manager {
//使用sqlMapClient,此类线程安全,所以可以定义成静态的
private static SqlMapClient sqlMaper; //静态块,初始化 sqlMaper;在类加载的时候执行一次
static{
try{
Reader reader=Resources.getResourceAsReader("sqlMapConfig.xml");
sqlMaper=SqlMapClientBuilder.buildSqlMapClient(reader);
reader.close(); }catch(IOException e){
throw new RuntimeException(e);
}
} /**
* 添加用户信息
* @throws SQLException
*/
public static void addUser(User user) throws SQLException{
sqlMaper.insert("addUsers",user);//与SqlMap中添加用户信息方法对应
} /**
* 通过map方式,添加用户信息
* @param userMap
* @throws SQLException
*/
public static void addUserByMap(Map userMap) throws SQLException{
sqlMaper.insert("addUsersByMap", userMap); //与SqlMap中添加用户信息方法对应 }
}
5.添加测试类,测试用户信息是否添加成功
package com.azj.test; import java.util.HashMap;
import java.util.Map; import junit.framework.TestCase; public class TestInsert extends TestCase {
/**
* 添加用户信息
*/
public void testInsertUser(){
User user=new User();
user.setId("1");
user.setFirstName("子");
user.setLastName("李");
user.setEmail("m@sina.com"); try{
Manager.addUser(user); }catch(Exception e){
e.printStackTrace();
} } /**
* 通过map方式,添加用户信息
*/
public void testInsertUserByMap(){ Map userMap=new HashMap(); userMap.put("id", "2");
userMap.put("firstName", "芳芳");
userMap.put("lastName","王");
userMap.put("email", "value@163.com"); try{
Manager.addUserByMap(userMap); }catch(Exception e){
e.printStackTrace();
} } }
通过JUnit单元测试,执行此测试文件,可以看出用户信息添加成功!通过JUnit控制台打印信息如图:

数据库表信息添加的用户信息如图:

二.iBatis查询数据方式
这里介绍4种查询用户信息的方式:根据id查询用户信息,根据实体类(用户)查询用户信息,查询所有用户信息(list 和map方式)。
1.POJO对象见iBatis添加数据方式
2.数据表信息

3. 在SqlMap中添加查询用户信息的方法
<resultMap id="UserResult" class="User" >
<result property="id" column="ID"/>
<result property="firstName" column="FIRST_NAME"/>
<result property="lastName" column="LAST_NAME"/>
<result property="email" column="EMAIL"/>
</resultMap>
<!-- 根据id查询用户信息 -->
<select id="selectUserById" parameterClass="java.lang.String" resultMap="UserResult">
SELECT * FROM A_USER WHERE ID=#id#
</select> <!-- 根据实体类(用户)查询用户信息 -->
<select id="selectUserByUser" parameterClass="User" resultMap="UserResult">
SELECT * FROM A_USER WHERE ID=#id#
</select> <!-- 查询所有用户信息 -->
<select id="selectUsers" resultMap="UserResult">
SELECT * FROM A_USER
</select>
4.在Manager类中添加查询用户信息的方法
//因其线程安全,设置为静态方法
/**
* 根据id查询用户信息
* @param id
* @return
* @throws SQLException
*/
public static User selectUserById(String id) throws SQLException{
return (User) sqlMaper.queryForObject("selectUserById",id); } /**
* 根据用户实体类查询用户实体
* @param user
* @return
* @throws SQLException
*/
public static User selectUserByUser(User user) throws SQLException{
return (User) sqlMaper.queryForObject("selectUserByUser",user);
} /**
* 查询所有用户信息,放于list中
* @param user
* @return
* @throws SQLException
*/
public static List selectUsers() throws SQLException{
return sqlMaper.queryForList("selectUsers");
} /**
* 查询所有用户信息,放于Map中
* @return
* @throws SQLException
*/
public static Map selectUserForMap() throws SQLException{ return sqlMaper.queryForMap("selectUsers", null, "id");
}
5.编写测试类,测试查询用户信息是否成功
package com.azj.test; import java.util.List;
import java.util.Map; import junit.framework.TestCase; /**
* 测试查询用户信息
*
* @author azj
*/
public class TestManager extends TestCase {
public void testSelectUserById() {
try {
User user = Manager.selectUserById("1");
System.out.println(user);
System.out.println(user.getFirstName());
} catch (Exception e) {
e.printStackTrace();
} } /**
* 根据实体类查询用户信息
*/
public void testSelectUserByUser() {
try {
User userParmUser = new User();
userParmUser.setId("2");
User user = Manager.selectUserByUser(userParmUser);
System.out.println(user);
System.out.println(user.getFirstName());
} catch (Exception e) {
e.printStackTrace();
} } /**
* 查询用户信息放于List中
*/
public void testSelectUsers() {
try {
List userList = Manager.selectUsers();
User user = (User) userList.get(1); System.out.println(user);
System.out.println(user.getFirstName());
} catch (Exception e) {
e.printStackTrace();
} } /**
* 查询用户信息放于Map中
*/
public void testSelectUsersMap() {
try { Map userMap = Manager.selectUserForMap();
// 将ID为1的用户查出来
User user = (User) userMap.get("1");
System.out.println(user);
System.out.println(user.getFirstName());
} catch (Exception e) {
e.printStackTrace();
} }
}
通过JUnit测试,可看出查询方法正确,查询结果均如下所示:

三.iBatis修改数据方式
1.POJO对象见iBatis添加数据方式
2.数据表信息

3. 在SqlMap中添加修改用户信息的方法
<!-- 更新用户信息 -->
<update id="updateUserByID" parameterClass="User">
UPDATE A_USER SET
FIRST_NAME=#firstName#,
LAST_NAME=#lastName#,
EMAIL=#email#
WHERE
ID=#id#
</update>
4.在Manager类中添加修改用户信息的方法
/**
* 更新用户信息
* @param user
* @throws SQLException
*/ public static void updateUser(User user) throws SQLException{
sqlMaper.update("updateUserByID", user);
}
5.编写测试类,测试修改用户信息是否成功
/**
* 更新用户信息
*/
public void testUpdateUser(){
User user=new User();
user.setId("1");
try{
user=Manager.selectUserByUser(user); user.setFirstName("娟子");
user.setLastName("马");
user.setEmail("m2@sina.com"); Manager.updateUser(user); }catch(Exception e){
e.printStackTrace();
} }
通过JUnit测试,可看出修改成功!

四.iBatis删除数据方式
1.POJO对象见iBatis添加数据方式
2.数据表信息

3. 在SqlMap中添加删除用户信息的方法
<!--删除用户(多个)字符串拼接方式 -->
<update id="deleteByString" parameterClass="java.lang.String">
DELETE FROM A_USER WHERE ID IN($id$)
</update> <!-- 删除用户(多个)传参,标签说明使用,分割 ;以(开始,以)结束,解析的内容是id -->
<update id="deleteByList" parameterClass="java.util.List">
DELETE FROM A_USER WHERE ID IN
<iterate conjunction="," open="(" close=")">
#id[]#
</iterate>
</update>
4.在Manager类中添加删除用户信息的方法
/**
* 删除用户信息,字符串拼接,容易产生sql注入
* @param userId
* @throws SQLException
*/
public static void deleteUserByID(String userId) throws SQLException{
sqlMaper.update("deleteByString", userId);
} /**
* 删除用户信息,传参
* @param userList
* @throws SQLException
*/
public static void deleteUserByList(List userList) throws SQLException{
sqlMaper.update("deleteByList", userList);
}
5.编写测试类,测试删除用户信息是否成功
/**
* 删除用户信息,拼接字符串
*/
public void testDeleteUserById(){
try{
String idString="'1','2'"; Manager.deleteUserByID(idString); }catch(Exception e){
e.printStackTrace();
} } /**
* 删除用户信息,传参
*/
public void testDeleteUserByList(){ try{
List userList=new ArrayList();
userList.add("1");
userList.add("2");
Manager.deleteUserByList(userList); }catch(Exception e){
e.printStackTrace();
} }
通过JUnit测试,可看到用户信息成功删除!
iBatis的基本操作就简单介绍到这里吧!
Batis-iBatis基本操作(增删改查)的更多相关文章
- MongoDB的ObjectId和基本操作增删改查(3)
ObjectId 基本操作增删改查 增: insert 介绍: mongodb存储的是文档,. 文档是json格式的对象. 语法: db.collectionName.insert(document) ...
- MongoDB --- 02. 基本操作,增删改查,数据类型,比较符,高级用法,pymongo
一.基本操作 . mongod 启动服务端 2. mongo 启动客户端 3. show databses 查看本地磁盘的数据库 4. use 库名 切换到要使用的数据库 5. db 查看当前使用的数 ...
- web sql 基本操作 - 增删改查
不喜欢看md原文的 可以访问这个链接:http://note.youdao.com/noteshare?id=6a91e3dea7cdf5195bb0e851d9fcb5a5 # web sql 增删 ...
- MongoDB基本操作(增删改查)
基本操作 基本的“增删查改“,在DOS环境下输入mongo命令打开shell,其实这个shell就是mongodb的客户端,同时也是一个js的编译器,默认连接的是“test”数据库.
- django数据库基本操作-增删改查(tip)-基本
补充:django外键保存 #外键保存 form_data = Form_Data() project, is_created = Project_Name.objects.get_or_create ...
- MySQL语句基本操作增删改查
select * from 表名; --------->效率低
- c语言实现双链表的基本操作—增删改查
//初始化 Node*InitList() { Node*head=(Node*)malloc(sizeof(Node)); if(NULL==head) { printf("内存分配失败! ...
- ORM之单表增删改查
ORM之单表增删改查 在函数前,先导入要操作的数据库表模块,model from model所在的路径文件夹 import model 在views文件中,加的路径: #就一个app01功能的文件 ...
- day94:flask:Jinjia2模板引擎&flask中的CSRF攻击&Flask-SQLAlchemy的创建模型类和基本的增删改查
目录 1.Jinjia2模板引擎 1.Jinjia2加载模板并传递数据到模板中 2.Jinjia2的模板语句 3.模板中特有的变量和函数 4.模板中内置的过滤器 5.自定义过滤器 6.模板继承 2.在 ...
随机推荐
- CRL快速开发框架系列教程四(删除数据)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- 一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之 Http 请求客户端
一个技术汪的开源梦 —— 目录 想必大家在项目开发的时候应该都在程序中调用过自己内部的接口或者使用过第三方提供的接口,咱今天不讨论 REST ,最常用的请求应该就是 GET 和 POST 了,那下面开 ...
- CLR via C# 摘要一:托管程序的执行模型
托管程序的执行模型大致如下: 编译源代码为程序集(dll或exe文件),程序集包括了记录相关信息的元数据和IL代码 执行程序集文件时,启动CLR,JIT负责把IL编译为本地代码并执行 IL是微软推出的 ...
- [未完成]scikit-learn一般实例之九:用于随机投影嵌入的Johnson–Lindenstrauss lemma边界
Johnson–Lindenstrauss 引理表明任何高维数据集均可以被随机投影到一个较低维度的欧氏空间,同时可以控制pairwise距离的失真. 理论边界 由一个随机投影P所引入的失真是确定的,这 ...
- 使用SSH上传安装eclipse
安装eclipse 步骤: 1.上传eclipse tar文件 2.[root@localhost soft]# tar -zxvf eclipse-jee-galileo-SR2-linux-gtk ...
- 《连载 | 物联网框架ServerSuperIO教程》- 5.轮询通讯模式开发及注意事项。附:网友制作的类库说明(CHM)
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- Sencha ExtJS 6 Widget Grid 入门
最近由于业务需要,研究了一下Sencha ExtJS 6 ,虽然UI和性能上据相关资料说都有提升,但是用起来确实不太顺手,而且用Sencha cmd工具进行测试和发布,很多内部细节都是隐藏的,出了问题 ...
- Placeholder如何换行
使用js动态添加标签充,处理换行问题 var placeholder = 'This is a line \nthis should be a new line'; $('textarea').att ...
- 如何在webapp中做出原生的ios下拉菜单效果
github:https://github.com/zhoushengmufc/iosselect webapp模仿ios下拉菜单 html下拉菜单select在安卓和IOS下表现不一样,iossel ...
- Dynamics CRM 2015-如何修改Optionset Default Value
在日常工作中,我们时不时会遇到在CRM测试环境上添加Optionset的时候,Default Value是某个值,但换到Production环境或者其他环境,添加的时候,Default Value可能 ...