本章节中将通过一个简单的 JDBC 示例,讲解什么是结果集映射。
构建 JDBC 应用程序涉及以下六个步骤:
导入包:需要包含包含数据库编程所需的 JDBC 类的包。 大多数情况下,使用 import java.sql.* 就足够了。
注册JDBC驱动程序:需要初始化驱动程序,以便可以打开与数据库的通信通道。
打开一个连接:需要使用 DriverManager.getConnection() 方法创建一个 Connection 对象,它表示与数据库的物理连接。
执行查询:需要使用类型为 Statement 的对象来构建和提交 SQL 语句到数据库。
从结果集中提取数据:需要使用相应的 ResultSet.getXXX() 方法从结果集中检索数据。
清理环境:需要明确地关闭所有数据库资源,而不依赖于 JVM 的垃圾收集。
下面代码将介绍一个完整 JDBC 应用程序的开发过程,代码如下:
//STEP 1. 导入需要的包
import java.sql.*;
public class FirstExample {
   // 数据库驱动名和数据库URL地址
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://localhost/emp";
   //  数据库帐号和密码
   static final String USER = "root";
   static final String PASS = "123456";
   public static void main(String[] args) {
       Connection conn = null;
       Statement stmt = null;
       try{
          // STEP 2: 注册JDBC驱动
          Class.forName("com.mysql.jdbc.Driver");
          // STEP 3: 打开一个链接
          System.out.println("Connecting to database...");
          conn = DriverManager.getConnection(DB_URL,USER,PASS);
          // STEP 4: 执行查询
          System.out.println("Creating statement...");
          stmt = conn.createStatement();
          String sql = "SELECT user_id, name, age FROM user";
          ResultSet rs = stmt.executeQuery(sql);
          // STEP 5: 从结果集提取数据
          while(rs.next()){
             // 根据列名获取值
             int userId  = rs.getInt("user_id");
             int age = rs.getInt("age");
             String name = rs.getString("name");
             // 显示值
             System.out.print("USER ID: " + userId);
             System.out.print(", NAME: " + name);
             System.out.print(", AGE: " + age);
          }
          // STEP 6: 清理环境,释放资源
          rs.close();
          stmt.close();
          conn.close();
       } catch(Exception e) {
          e.printStackTrace();
       } finally {
          try {
             if(stmt!=null)
                stmt.close();
          } catch(SQLException se2) {}
          try {
             if(conn!=null)
                conn.close();
          } catch(SQLException se) {
             se.printStackTrace();
          }
       }
       System.out.println("There are so thing wrong!");
    }
}上面代码中,while 部分用来将查询到的数据获取出来,然后显示出来。而在实际业务中,我们需要将返回的结果封装到 JavaBean,然后将 JavaBean 传递给 Service。那么,将怎样将这些零散的值放入到对应的 JavaBean 中呢?在没有 MyBatis 之前,我们是这样做的:
// 定义 JavaBean UserBean
public class UserBean {
   private Integer userId;
   private String name;
   private Integer age;
   // 忽略 getter 和 setter
}
// STEP 5: 从结果集提取数据
List<UserBean> userList = new ArrayList<UserBean>();
while(rs.next()){
    // 根据列名获取值
    int userId  = rs.getInt("user_id");
    int age = rs.getInt("age");
    String name = rs.getString("name");
    // 显示值
    UserBean user = new UserBean();
    user.setUserId(userId);
    user.setAge(age);
    user.setName(name);
    userList.add(user);
}
// 调用服务
service.userFind(userList);有了 MyBatis 后,事情就变得非常简单了。MyBatis 可以通过 <resultMap> 标签来定义怎样将 SQL 语句返回的列和 JavaBean 进行映射。例如:
<!-- 映射结果 --> <resultMap id="RESULT_MAP" type="com.hxstrive.mybatis.sql.demo2.UserBean"> <id column="user_id" jdbcType="INTEGER" property="userId" /> <result column="name" jdbcType="VARCHAR" property="name" /> <result column="sex" jdbcType="VARCHAR" property="sex" /> <result column="age" jdbcType="INTEGER" property="age" /> </resultMap>
在后续章节将详细介绍 MyBatis 的结果映射,可以进行单表映射、关联映射。
