原生态JDBC程序问题总结

来源:互联网 发布:mac登陆windows 编辑:程序博客网 时间:2024/06/05 20:00

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。

具体参考https://my.oschina.net/xianggao/blog/591482#OSC_h1_43