当前位置: 代码迷 >> 综合 >> Redis小案例(Jedis、Ajax、HTML)
  详细解决方案

Redis小案例(Jedis、Ajax、HTML)

热度:57   发布时间:2023-11-21 02:25:39.0

案例需求

  • 提供index.html页面,页面中有一个省份,下拉列表
  • 当页面加载完成后,发生ajax请求,加载所有省份

只查询数据库的方式

总体步骤概览

 一、环境搭建

1.数据库SQL搭建

CREATE DATABASE mydb; -- 创建数据库
USE mydb; 			   -- 使用数据库
CREATE TABLE province(   -- 创建表id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20) NOT NULL);
-- 插入数据
INSERT INTO province VALUES(NULL,'北京');
INSERT INTO province VALUES(NULL,'上海');
INSERT INTO province VALUES(NULL,'广州');
INSERT INTO province VALUES(NULL,'陕西');

2.相关jar包

3.druid.properties JDBC连接池配置文件

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///mydb
username=root
password=root
initialSize=5
maxActive=10
maxWait=3000

4、编写JDBC工具类JDBCUtils

/*** JDBC工具类 使用Durid连接池*/
public class JDBCUtils {private static DataSource ds ;static {try {//1.加载配置文件Properties pro = new Properties();//使用ClassLoader加载配置文件,获取字节输入流InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");pro.load(is);//2.初始化连接池对象ds = DruidDataSourceFactory.createDataSource(pro);} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}/*** 获取连接池对象*/public static DataSource getDataSource(){return ds;}/*** 获取连接Connection对象*/public static Connection getConnection() throws SQLException {return  ds.getConnection();}
}

5、项目结构和package

6、js文件

二、后台代码编写

1、在domain包下创建Province实体类,对应数据库province表

public class Province {private int id;private String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

2、在dao包下创建接口ProvinceDao,并写一个该接口实现类ProvinceDaoImpl

public interface ProvinceDao {public List<Province> findAll();
}
public class ProvinceDaoImpl implements ProvinceDao {@Overridepublic List<Province> findAll() {return null;//先不写方法具体实现}
}

3、在service包下创建接口ProvinceService,并编写实现类ProvinceServiceImpl

public interface ProvinceService {public List<Province> findAll();
}
public class ProvinceServiceImpl implements ProvinceService {@Overridepublic List<Province> findAll() {return null;//先不写具体实现}}

4、编写dao实现类的具体实现

public class ProvinceDaoImpl implements ProvinceDao {//1.声明成员变量jdbctemplateprivate JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());@Overridepublic List<Province> findAll() {//1.定义sqlString sql = "select * from province";//执行sqlList<Province> list = template.query(sql, new BeanPropertyRowMapper<Province>(Province.class));return list;}
}

5、完成service实现类的具体实现

public class ProvinceServiceImpl implements ProvinceService {//声明daoprivate ProvinceDao dao = new ProvinceDaoImpl();@Overridepublic List<Province> findAll() {return dao.findAll();}
}

6、编写ProvinceServlet

@WebServlet("/provinceServlet")
public class ProvinceServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.调用service查询ProvinceServiceImpl service = new ProvinceServiceImpl();List<Province> list = service.findAll();//2.序列化list为jsonObjectMapper mapper = new ObjectMapper();String json = mapper.writeValueAsString(list);System.out.println(json);//3.响应结果response.setContentType("application/json;charset=utf-8");response.getWriter().write(json);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}
}

二、前台页面编写

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="js/jquery-3.3.1.min.js"></script><script>$(function () {//发生ajax请求,加载所有省份数据$.get("provinceServlet",{},function (data) {//[{"id":1,"name":"北京"},{"id":2,"name":"上海"},{"id":3,"name":"广州"},{"id":4,"name":"陕西"}]//1.获取selectvar province = $("#province");//2.遍历json数组$(data).each(function () {//3.创建<option>var option = "<option name='"+this.id+"'>"+this.name+"</option>>"//4.调用select的append追加optionprovince.append(option);})});})</script></head>
<body><select id="province"><option>--请选择省份--</option></select></body>
</html>

三、测试效果

四、使用redis优化数据库查询

 
1、编写JedisPool工具类,加载配置文件,配置连接池参数,提供获取连接的方法

public class JedisPoolUtils {private static JedisPool jedisPool;static{//读取配置文件InputStream is = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");//创建Properties对象Properties pro = new Properties();//关联文件try {pro.load(is);} catch (IOException e) {e.printStackTrace();}//获取数据,设置到JedisConfig中JedisPoolConfig config = new JedisPoolConfig();config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));config.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle")));//初始化JedisPooljedisPool = new JedisPool(config, pro.getProperty("host"), Integer.parseInt(pro.getProperty("port")));}/*获取连接池的方法*/public static Jedis getJedis(){return jedisPool.getResource();}}

2、在service接口以及实现类添加新方法findAllJson(),以使用缓存redis

public interface ProvinceService {public List<Province> findAll();public String findAllJson();
}
public class ProvinceServiceImpl implements ProvinceService {//声明daoprivate ProvinceDao dao = new ProvinceDaoImpl();@Overridepublic List<Province> findAll() {return dao.findAll();}/*使用redis缓存*/@Overridepublic String findAllJson() {//1.先从redis中查询数据//1.1获取redis客户端连接Jedis jedis = JedisPoolUtils.getJedis();String province_json = jedis.get("province");//2.判断province_json数据是否为nullif (province_json == null || province_json.length() == 0){//redis中没有数据System.out.println("redis中没数据,查询数据库......");//2.1从数据库中查询List<Province> ps = dao.findAll();//2.2将list序列化为jsonObjectMapper mapper = new ObjectMapper();try {province_json = mapper.writeValueAsString(ps);} catch (JsonProcessingException e) {e.printStackTrace();}//2.3将json数据存入redisjedis.set("province",province_json);//归还连接jedis.close();}else {System.out.println("redis中有数据,查询缓存...");}return province_json;}
}

 五、测试

1、第一次查询前

控制台打印:

2、刷新页面,第二次查询

控制台打印:

注意

  • 使用redis缓存一些不经常发生变化的数据,以加快查询速度。
  • 数据库中的数据一旦发生改变,则需要更新数据
    • 数据库的表执行增、删、改的相关操作,需要将redis缓存数据情况,再次存入
    • 在service对应的增、删、改的方法中,将redis数据删除。

 

 

 

 

 

 

 

 

 

 

  相关解决方案