9.5.2 封装数据库操作
如果要实现用户发送一次地理位置后能够多次搜索周边信息,就需要将用户发送的地理位置存储在数据库中,当用户再次发送搜索请求时,根据用户最后一次发送的地理位置进行检索。因此,除了连接数据库之外,还需要两个方法:保存用户地理位置和获取用户最后一次发送的地理位置。笔者将所有数据库操作封装到MySQLUtil类中,该类的实现如下:
- package org.liufeng.course.util;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import javax.servlet.http.HttpServletRequest;
- import org.liufeng.course.pojo.UserLocation;
- /**
- * Mysql数据库操作类
- *
- * @author liufeng
- * @date 2013-11-19
- */
- public class MySQLUtil {
- /**
- * 获取Mysql数据库连接
- *
- * @return Connection
- */
- private Connection getConn(HttpServletRequest request) {
- Connection conn = null;
- // 从request请求头中取出IP、端口、用户名和密码
- String host = request.getHeader("BAE_ENV_ADDR_SQL_IP");
- String port = request.getHeader("BAE_ENV_ADDR_SQL_PORT");
- String username = request.getHeader("BAE_ENV_AK");
- String password = request.getHeader("BAE_ENV_SK");
- // 数据库名称
- String dbName = "FTGJUvPHrbXsLGsYpwlp";
- // JDBC URL
- String url = String.format("jdbc:mysql://%s:%s/%s", host, port, dbName);
- try {
- // 加载MySQL驱动
- Class.forName("com.mysql.jdbc.Driver");
- // 获取数据库连接
- conn = DriverManager.getConnection(url, username, password);
- } catch (Exception e) {
- e.printStackTrace();
- }
- return conn;
- }
- /**
- * 保存用户地理位置
- *
- * @param request 请求对象
- * @param openId 用户的OpenID
- * @param lng 用户发送的经度
- * @param lat 用户发送的纬度
- * @param bd09_lng 经过百度坐标转换后的经度
- * @param bd09_lat 经过百度坐标转换后的纬度
- */
- public static void saveUserLocation(HttpServletRequest request, String openId, String lng,
- String lat, String bd09_lng, String bd09_lat) {
- String sql = "insert into user_location(open_id, lng, lat, bd09_lng, bd09_lat) values (?,
- ?, ?, ?, ?)";
- try {
- Connection conn = new MySQLUtil().getConn(request);
- PreparedStatement ps = conn.prepareStatement(sql);
- ps.setString(1, openId);
- ps.setString(2, lng);
- ps.setString(3, lat);
- ps.setString(4, bd09_lng);
- ps.setString(5, bd09_lat);
- ps.executeUpdate();
- // 释放资源
- ps.close();
- conn.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * 获取用户最后一次发送的地理位置
- *
- * @param request 请求对象
- * @param openId 用户的OpenID
- * @return UserLocation
- */
- public static UserLocation getLastLocation(HttpServletRequest request, String openId) {
- UserLocation userLocation = null;
- String sql = "select open_id, lng, lat, bd09_lng, bd09_lat from user_location
- where open_id=? order by id desc limit 0,1";
- try {
- Connection conn = new MySQLUtil().getConn(request);
- PreparedStatement ps = conn.prepareStatement(sql);
- ps.setString(1, openId);
- ResultSet rs = ps.executeQuery();
- if (rs.next()) {
- userLocation = new UserLocation();
- userLocation.setOpenId(rs.getString("open_id"));
- userLocation.setLng(rs.getString("lng"));
- userLocation.setLat(rs.getString("lat"));
- userLocation.setBd09Lng(rs.getString("bd09_lng"));
- userLocation.setBd09Lat(rs.getString("bd09_lat"));
- }
- // 释放资源
- rs.close();
- ps.close();
- conn.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return userLocation;
- }
- }
getLastLocation()方法的返回值类型是UserLocation,它是与数据表user_location相对应的,该类的定义如下:
- package org.liufeng.course.pojo;
- /**
- * 用户地理位置model
- *
- * @author liufeng
- * @date 2013-11-19
- */
- public class UserLocation {
- private String openId;
- private String lng;
- private String lat;
- private String bd09Lng;
- private String bd09Lat;
- public String getOpenId() {
- return openId;
- }
- public void setOpenId(String openId) {
- this.openId = openId;
- }
- public String getLng() {
- return lng;
- }
- public void setLng(String lng) {
- this.lng = lng;
- }
- public String getLat() {
- return lat;
- }
- public void setLat(String lat) {
- this.lat = lat;
- }
- public String getBd09Lng() {
- return bd09Lng;
- }
- public void setBd09Lng(String bd09Lng) {
- this.bd09Lng = bd09Lng;
- }
- public String getBd09Lat() {
- return bd09Lat;
- }
- public void setBd09Lat(String bd09Lat) {
- this.bd09Lat = bd09Lat;
- }
- }