在上一篇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,EMAIL) VALUES(#id#,#firstName#,#lastName#,#email#)</insert><!-- 通过map方式,添加用户信息 --><insert id="addUsersByMap" parameterClass="java.util.HashMap">INSERT INTO A_USER(ID,FIRST_NAME,LAST_NAME,EMAIL) 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 SETFIRST_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的基本操作就简单介绍到这里吧!