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