本章节中将通过一个简单的 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 的结果映射,可以进行单表映射、关联映射。