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,
      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 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的基本操作就简单介绍到这里吧!

posted on 2016-10-09 18:24  小瓢蟲  阅读(981)  评论(0编辑  收藏  举报