MyBatis是一个持久层的框架。持久层的框架都是对JDBC的封装。
<1>对原生态JDBC程序(单独使用JDBC开发)问题总结
<1.1>jdbc程序
使用jdbc查询mysql数据库中用户表的记录
创建java工程,加入jar包
数据库驱动包:mysql/oracle
一般需要以下七个步骤:
加载JDBC驱动;
建立并获取数据库连接;
创建 JDBC Statements 对象;
设置SQL语句的传入参数;
执行SQL语句并获得查询结果;
对查询结果进行转换处理并将处理结果返回;
释放相关资源(关闭Connection,关闭Statement,关闭ResultSet);
具体代码如下
public static List<Map<String,Object>> queryForList(){
//建立数据库连接
Connection connection = null;
//结果集对象
ResultSet rs = null;
//预编译的statement,使用预编译的statement提高数据库性能
PreparedStatement stmt = null;
List<Map<String,Object>> resultList = new ArrayList<Map<String,Object>>();
try {
// 加载JDBC驱动
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
String url = "jdbc:oracle:thin:@localhost:1521:ORACLEDB";
String user = "trainer";
String password = "trainer";
// 通过驱动管理类获取数据库连接
connection = DriverManager.getConnection(url,user,password);
//定义sql语句,?表示占位符
String sql = "select * from userinfo where user_id = ? ";
//获取预处理的Statement对象
stmt = connection.prepareStatement(sql);
//设置传入参数,第一个参数为sql语句中参数的序号
stmt.setString(1, "zhangsan");
//执行SQL语句
rs = stmt.executeQuery();
//处理查询结果(将查询结果转换成List<Map>格式)
ResultSetMetaData rsmd = rs.getMetaData();
int num = rsmd.getColumnCount();
while(rs.next()){
Map map = new HashMap();
for(int i = 0;i < num;i++){
String columnName = rsmd.getColumnName(i+1);
map.put(columnName,rs.getString(columnName));
}
resultList.add(map);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// 关闭结果集
if (rs != null) {
rs.close();
rs = null;
}
// 关闭执行
if (stmt != null) {
stmt.close();
stmt = null;
}
if (connection != null) {
connection.close();
connection = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
return resultList;
}
<1.2>问题总结
1.数据库连接,使用时就创建,不使用时就关闭。数据库连接频繁的开启和关闭本身就造成了资源的浪费,影响系统的性能。
解决方案:可以使用数据库连接池来管理数据库的连接。
2.将sql语句硬编码到java代码中,如果sql语句需要修改,需要重新修改java代码,不利于系统维护。
解决方法:将sql语句配置在xml中。即使sql语句变化,不需要重新更改java代码。
3.在向statement设置参数时,对占位符的位置和向占位符设置的变量,硬编码在java代码中,不利于系统维护。
解决方法:将sql语句,占位符及参数全部配置在xml中。
4.从resultSet中遍历结果集数据时,存在硬编码。
System.out.println(rs.getString(“id));
解决方法:将查询结果自动映射成java对象,这样就不需要在代码中将对象写死。
带着这四点问题去学习MyBatis。