9.5.2 封装数据库操作

如果要实现用户发送一次地理位置后能够多次搜索周边信息,就需要将用户发送的地理位置存储在数据库中,当用户再次发送搜索请求时,根据用户最后一次发送的地理位置进行检索。因此,除了连接数据库之外,还需要两个方法:保存用户地理位置和获取用户最后一次发送的地理位置。笔者将所有数据库操作封装到MySQLUtil类中,该类的实现如下:

  1. package org.liufeng.course.util;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.DriverManager;
  5. import java.sql.PreparedStatement;
  6. import java.sql.ResultSet;
  7. import java.sql.SQLException;
  8. import javax.servlet.http.HttpServletRequest;
  9. import org.liufeng.course.pojo.UserLocation;
  10.  
  11. /**
  12. * Mysql数据库操作类
  13. *
  14. * @author liufeng
  15. * @date 2013-11-19
  16. */
  17. public class MySQLUtil {
  18. /**
  19. * 获取Mysql数据库连接
  20. *
  21. * @return Connection
  22. */
  23. private Connection getConn(HttpServletRequest request) {
  24. Connection conn = null;
  25.  
  26. // 从request请求头中取出IP、端口、用户名和密码
  27. String host = request.getHeader("BAE_ENV_ADDR_SQL_IP");
  28. String port = request.getHeader("BAE_ENV_ADDR_SQL_PORT");
  29. String username = request.getHeader("BAE_ENV_AK");
  30. String password = request.getHeader("BAE_ENV_SK");
  31. // 数据库名称
  32. String dbName = "FTGJUvPHrbXsLGsYpwlp";
  33. // JDBC URL
  34. String url = String.format("jdbc:mysql://%s:%s/%s", host, port, dbName);
  35.  
  36. try {
  37. // 加载MySQL驱动
  38. Class.forName("com.mysql.jdbc.Driver");
  39. // 获取数据库连接
  40. conn = DriverManager.getConnection(url, username, password);
  41. } catch (Exception e) {
  42. e.printStackTrace();
  43. }
  44. return conn;
  45. }
  46.  
  47. /**
  48. * 保存用户地理位置
  49. *
  50. * @param request 请求对象
  51. * @param openId 用户的OpenID
  52. * @param lng 用户发送的经度
  53. * @param lat 用户发送的纬度
  54. * @param bd09_lng 经过百度坐标转换后的经度
  55. * @param bd09_lat 经过百度坐标转换后的纬度
  56. */
  57. public static void saveUserLocation(HttpServletRequest request, String openId, String lng,
  58. String lat, String bd09_lng, String bd09_lat) {
  59. String sql = "insert into user_location(open_id, lng, lat, bd09_lng, bd09_lat) values (?,
  60. ?, ?, ?, ?)";
  61. try {
  62. Connection conn = new MySQLUtil().getConn(request);
  63. PreparedStatement ps = conn.prepareStatement(sql);
  64. ps.setString(1, openId);
  65. ps.setString(2, lng);
  66. ps.setString(3, lat);
  67. ps.setString(4, bd09_lng);
  68. ps.setString(5, bd09_lat);
  69. ps.executeUpdate();
  70. // 释放资源
  71. ps.close();
  72. conn.close();
  73. } catch (Exception e) {
  74. e.printStackTrace();
  75. }
  76. }
  77.  
  78. /**
  79. * 获取用户最后一次发送的地理位置
  80. *
  81. * @param request 请求对象
  82. * @param openId 用户的OpenID
  83. * @return UserLocation
  84. */
  85. public static UserLocation getLastLocation(HttpServletRequest request, String openId) {
  86. UserLocation userLocation = null;
  87. String sql = "select open_id, lng, lat, bd09_lng, bd09_lat from user_location
  88. where open_id=? order by id desc limit 0,1";
  89. try {
  90. Connection conn = new MySQLUtil().getConn(request);
  91. PreparedStatement ps = conn.prepareStatement(sql);
  92. ps.setString(1, openId);
  93. ResultSet rs = ps.executeQuery();
  94. if (rs.next()) {
  95. userLocation = new UserLocation();
  96. userLocation.setOpenId(rs.getString("open_id"));
  97. userLocation.setLng(rs.getString("lng"));
  98. userLocation.setLat(rs.getString("lat"));
  99. userLocation.setBd09Lng(rs.getString("bd09_lng"));
  100. userLocation.setBd09Lat(rs.getString("bd09_lat"));
  101. }
  102. // 释放资源
  103. rs.close();
  104. ps.close();
  105. conn.close();
  106. } catch (SQLException e) {
  107. e.printStackTrace();
  108. }
  109. return userLocation;
  110. }
  111. }

getLastLocation()方法的返回值类型是UserLocation,它是与数据表user_location相对应的,该类的定义如下:

  1. package org.liufeng.course.pojo;
  2.  
  3. /**
  4. * 用户地理位置model
  5. *
  6. * @author liufeng
  7. * @date 2013-11-19
  8. */
  9. public class UserLocation {
  10. private String openId;
  11. private String lng;
  12. private String lat;
  13. private String bd09Lng;
  14. private String bd09Lat;
  15.  
  16. public String getOpenId() {
  17. return openId;
  18. }
  19.  
  20. public void setOpenId(String openId) {
  21. this.openId = openId;
  22. }
  23.  
  24. public String getLng() {
  25. return lng;
  26. }
  27.  
  28. public void setLng(String lng) {
  29. this.lng = lng;
  30. }
  31.  
  32. public String getLat() {
  33. return lat;
  34. }
  35.  
  36. public void setLat(String lat) {
  37. this.lat = lat;
  38. }
  39.  
  40. public String getBd09Lng() {
  41. return bd09Lng;
  42. }
  43.  
  44. public void setBd09Lng(String bd09Lng) {
  45. this.bd09Lng = bd09Lng;
  46. }
  47.  
  48. public String getBd09Lat() {
  49. return bd09Lat;
  50. }
  51.  
  52. public void setBd09Lat(String bd09Lat) {
  53. this.bd09Lat = bd09Lat;
  54. }
  55. }