程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2024-11(1)

SpringBoot——SpringBoot集成SSM、Dubbo、Redis、JSP的汇总案例

发布于2021-05-30 19:00     阅读(950)     评论(0)     点赞(30)     收藏(4)


文章目录:

1.思路讲解

2.案例分析

2.1 接口工程

2.2 服务提供者

2.3 服务消费者

2.4 启动测试!!!


1.思路讲解

这个案例其实就是SpringBoot集成SSM、Dubbo、Redis、JSP,看起来集成了一大堆,感觉挺麻烦的,但实际上并不是很麻烦,下面我来说一下我的思路:

  • 接口工程:存放实体bean和业务接口
  • 服务提供者:它是一个SpringBoot框架web项目,集成MyBatis、Redis

              1)pom文件中添加依赖:MyBatis、MySQL驱动、Dubbo、zookeeper、redis、接口工程。

              2)配置springboot核心配置文件(连接数据库、连接redis、dubbo、内嵌tomcat)

  • 服务消费者:它也是一个SpringBoot框架web项目,集成JSP、Dubbo

              1)pom文件中添加依赖:Dubbo、zookeeper、接口工程、解析jsp页面的依赖。

              2)配置springboot核心配置文件(dubbo、内嵌tomcat、视图解析器)

文章比较长,因为代码比较多,大家一定要有这个耐心去看完,相信我讲的还是有点用的!!!


2.案例分析

这里SpringBoot集成MyBatis,我用的是MyBatis逆向工程来直接生成的实体bean、dao、mapper,所以这里首先给出MyBatis逆向工程的配置文件。

这个文件主要是负责生成你项目中的实体bean、dao、mapper,那么再加上集成dubbo的情况下,我们的实体bean是需要放在接口工程中的,而dao、mapper则需要放在服务提供者中,所以在MyBatis逆向工程的配置文件中,需要将实体bean的生成位置改为第一个接口工程的绝对路径。数据库这里的表结构和数据,我就不再给出了,大家自行创建一下就可以了。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE generatorConfiguration
  3. PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  4. "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
  5. <generatorConfiguration>
  6. <!-- 指定连接数据库的 JDBC 驱动包所在位置,指定到你本机的完整路径 -->
  7. <classPathEntry location="E:\mysql-connector-java-5.1.9.jar"/>
  8. <!-- 配置 table 表信息内容体,targetRuntime 指定采用 MyBatis3 的版本 -->
  9. <context id="tables" targetRuntime="MyBatis3">
  10. <!-- 抑制生成注释,由于生成的注释都是英文的,可以不让它生成 -->
  11. <commentGenerator>
  12. <property name="suppressAllComments" value="true"/>
  13. </commentGenerator>
  14. <!-- 配置数据库连接信息 -->
  15. <jdbcConnection driverClass="com.mysql.jdbc.Driver"
  16. connectionURL="jdbc:mysql://localhost:3306/springboot"
  17. userId="root"
  18. password="12345678">
  19. </jdbcConnection>
  20. <!-- 生成 entity 类,targetPackage 指定 entity 类的包名, targetProject指定生成的 entity 放在 IDEA 的哪个工程下面-->
  21. <javaModelGenerator targetPackage="com.szh.springboot.entity"
  22. targetProject="D:\BaiduNetdiskDownload\014-springboot-ssm-dubbo-interface\src\main\java">
  23. <property name="enableSubPackages" value="false"/>
  24. <property name="trimStrings" value="false"/>
  25. </javaModelGenerator>
  26. <!-- 生成 MyBatis 的 Mapper.xml 文件,targetPackage 指定 mapper.xml 文件的包名, targetProject 指定生成的 mapper.xml 放在 IDEA 的哪个工程下面 -->
  27. <sqlMapGenerator targetPackage="com.szh.springboot.mapper"
  28. targetProject="src/main/java">
  29. <property name="enableSubPackages" value="false"/>
  30. </sqlMapGenerator>
  31. <!-- 生成 MyBatis 的 Mapper 接口类文件,targetPackage 指定 Mapper 接口类的包名, targetProject 指定生成的 Mapper 接口放在 IDEA 的哪个工程下面 -->
  32. <javaClientGenerator type="XMLMAPPER"
  33. targetPackage="com.szh.springboot.mapper"
  34. targetProject="src/main/java">
  35. <property name="enableSubPackages" value="false"/>
  36. </javaClientGenerator>
  37. <!-- 数据库表名及对应的 Java 模型类名 -->
  38. <table tableName="t_student" domainObjectName="Student"
  39. enableCountByExample="false"
  40. enableUpdateByExample="false"
  41. enableDeleteByExample="false"
  42. enableSelectByExample="false"
  43. selectByExampleQueryId="false"/>
  44. </context>
  45. </generatorConfiguration>

2.1 接口工程

MyBatis逆向工程生成的实体bean。

  1. package com.szh.springboot.entity;
  2. import java.io.Serializable;
  3. public class Student implements Serializable {
  4. private Integer id;
  5. private String name;
  6. private Integer age;
  7. //getter and setter
  8. }

接口服务,其中有两个方法。

  1. package com.szh.springboot.service;
  2. import com.szh.springboot.entity.Student;
  3. /**
  4. *
  5. */
  6. public interface StudentService {
  7. Student queryStudentById(Integer id);
  8. Integer queryAllStudentCount();
  9. }

2.2 服务提供者

SpringBoot核心配置文件

  1. # 配置内嵌tomcat端口号和上下文根
  2. server.port=8081
  3. server.servlet.context-path=/
  4. # 设置连接数据库的信息
  5. spring.datasource.driver-class-name=com.mysql.jdbc.Driver
  6. spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8
  7. spring.datasource.username=root
  8. spring.datasource.password=12345678
  9. # 设置dubbo
  10. spring.application.name=015-springboot-ssm-dubbo-provider
  11. spring.dubbo.server=true
  12. spring.dubbo.registry=zookeeper://localhost:2181
  13. # 设置redis
  14. spring.redis.host=localhost
  15. spring.redis.port=6379

MyBatis逆向工程生成的dao接口和对应的mapper映射文件(这里就做一个简单的案例,所以只用到了 selectByPrimaryKey、queryAllStudentCount 这两个方法)

  1. package com.szh.springboot.mapper;
  2. import com.szh.springboot.entity.Student;
  3. public interface StudentMapper {
  4. int deleteByPrimaryKey(Integer id);
  5. int insert(Student record);
  6. int insertSelective(Student record);
  7. Student selectByPrimaryKey(Integer id);
  8. int updateByPrimaryKeySelective(Student record);
  9. int updateByPrimaryKey(Student record);
  10. Integer queryAllStudentCount();
  11. }
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.szh.springboot.mapper.StudentMapper">
  4. <resultMap id="BaseResultMap" type="com.szh.springboot.entity.Student">
  5. <id column="id" jdbcType="INTEGER" property="id" />
  6. <result column="name" jdbcType="VARCHAR" property="name" />
  7. <result column="age" jdbcType="INTEGER" property="age" />
  8. </resultMap>
  9. <sql id="Base_Column_List">
  10. id, name, age
  11. </sql>
  12. <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
  13. select
  14. <include refid="Base_Column_List" />
  15. from t_student
  16. where id = #{id,jdbcType=INTEGER}
  17. </select>
  18. <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
  19. delete from t_student
  20. where id = #{id,jdbcType=INTEGER}
  21. </delete>
  22. <insert id="insert" parameterType="com.szh.springboot.entity.Student">
  23. insert into t_student (id, name, age
  24. )
  25. values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER}
  26. )
  27. </insert>
  28. <insert id="insertSelective" parameterType="com.szh.springboot.entity.Student">
  29. insert into t_student
  30. <trim prefix="(" suffix=")" suffixOverrides=",">
  31. <if test="id != null">
  32. id,
  33. </if>
  34. <if test="name != null">
  35. name,
  36. </if>
  37. <if test="age != null">
  38. age,
  39. </if>
  40. </trim>
  41. <trim prefix="values (" suffix=")" suffixOverrides=",">
  42. <if test="id != null">
  43. #{id,jdbcType=INTEGER},
  44. </if>
  45. <if test="name != null">
  46. #{name,jdbcType=VARCHAR},
  47. </if>
  48. <if test="age != null">
  49. #{age,jdbcType=INTEGER},
  50. </if>
  51. </trim>
  52. </insert>
  53. <update id="updateByPrimaryKeySelective" parameterType="com.szh.springboot.entity.Student">
  54. update t_student
  55. <set>
  56. <if test="name != null">
  57. name = #{name,jdbcType=VARCHAR},
  58. </if>
  59. <if test="age != null">
  60. age = #{age,jdbcType=INTEGER},
  61. </if>
  62. </set>
  63. where id = #{id,jdbcType=INTEGER}
  64. </update>
  65. <update id="updateByPrimaryKey" parameterType="com.szh.springboot.entity.Student">
  66. update t_student
  67. set name = #{name,jdbcType=VARCHAR},
  68. age = #{age,jdbcType=INTEGER}
  69. where id = #{id,jdbcType=INTEGER}
  70. </update>
  71. <select id="queryAllStudentCount" resultType="java.lang.Integer">
  72. select count(*)
  73. from t_student
  74. </select>
  75. </mapper>

对接口工程中接口方法的实现,其中包括注入数据库持久层、注入redis模板类对象。

  1. package com.szh.springboot.service.impl;
  2. import com.alibaba.dubbo.config.annotation.Service;
  3. import com.szh.springboot.entity.Student;
  4. import com.szh.springboot.mapper.StudentMapper;
  5. import com.szh.springboot.service.StudentService;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.data.redis.core.RedisTemplate;
  8. import org.springframework.stereotype.Component;
  9. import java.util.concurrent.TimeUnit;
  10. /**
  11. *
  12. */
  13. @Component
  14. @Service(interfaceClass = StudentService.class,version = "1.0.0",timeout = 15000)
  15. public class StudentServiceImpl implements StudentService {
  16. @Autowired
  17. private StudentMapper studentMapper;
  18. @Autowired
  19. private RedisTemplate<Object,Object> redisTemplate;
  20. @Override
  21. public Student queryStudentById(Integer id) {
  22. return studentMapper.selectByPrimaryKey(id);
  23. }
  24. @Override
  25. public Integer queryAllStudentCount() {
  26. //首先去redis缓存中查询,如果有:直接使用;如果没有,去数据库中查询并存放到redis缓存中
  27. Integer allStudentCount= (Integer) redisTemplate.opsForValue().get("allStudentCount");
  28. //判断是否有值
  29. if (allStudentCount==null) {
  30. //此时为空,则去数据库中查询
  31. allStudentCount=studentMapper.queryAllStudentCount();
  32. //并存放到redis缓存中
  33. redisTemplate.opsForValue().set("allStudentCount",allStudentCount,30, TimeUnit.SECONDS);
  34. }
  35. return allStudentCount;
  36. }
  37. }

pom文件

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.alibaba.spring.boot</groupId>
  8. <artifactId>dubbo-spring-boot-starter</artifactId>
  9. <version>2.0.0</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.apache.zookeeper</groupId>
  13. <artifactId>zookeeper</artifactId>
  14. <version>3.4.6</version>
  15. <exclusions>
  16. <exclusion>
  17. <groupId>org.slf4j</groupId>
  18. <artifactId>slf4j-log4j12</artifactId>
  19. </exclusion>
  20. </exclusions>
  21. </dependency>
  22. <dependency>
  23. <groupId>com.101tec</groupId>
  24. <artifactId>zkclient</artifactId>
  25. <version>0.4</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.mybatis.spring.boot</groupId>
  29. <artifactId>mybatis-spring-boot-starter</artifactId>
  30. <version>2.1.4</version>
  31. </dependency>
  32. <dependency>
  33. <groupId>mysql</groupId>
  34. <artifactId>mysql-connector-java</artifactId>
  35. <version>5.1.9</version>
  36. </dependency>
  37. <dependency>
  38. <groupId>org.springframework.boot</groupId>
  39. <artifactId>spring-boot-starter-data-redis</artifactId>
  40. </dependency>
  41. <!-- 接口工程 -->
  42. <dependency>
  43. <groupId>com.szh.springboot</groupId>
  44. <artifactId>014-springboot-ssm-dubbo-interface</artifactId>
  45. <version>1.0.0</version>
  46. </dependency>
  47. </dependencies>
  48. <build>
  49. <resources>
  50. <resource>
  51. <directory>src/main/java</directory>
  52. <includes>
  53. <include>**/*.xml</include>
  54. </includes>
  55. </resource>
  56. </resources>
  57. <plugins>
  58. <plugin>
  59. <groupId>org.springframework.boot</groupId>
  60. <artifactId>spring-boot-maven-plugin</artifactId>
  61. </plugin>
  62. <!--mybatis 代码自动生成插件-->
  63. <plugin>
  64. <groupId>org.mybatis.generator</groupId>
  65. <artifactId>mybatis-generator-maven-plugin</artifactId>
  66. <version>1.3.7</version>
  67. <configuration>
  68. <!--配置文件的位置-->
  69. <configurationFile>GeneratorMapper.xml</configurationFile>
  70. <verbose>true</verbose>
  71. <overwrite>true</overwrite>
  72. </configuration>
  73. </plugin>
  74. </plugins>
  75. </build>

SpringBoot项目启动入口类

  1. package com.szh.springboot;
  2. import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
  3. import org.mybatis.spring.annotation.MapperScan;
  4. import org.springframework.boot.SpringApplication;
  5. import org.springframework.boot.autoconfigure.SpringBootApplication;
  6. @SpringBootApplication
  7. @MapperScan(basePackages = "com.szh.springboot.mapper")
  8. @EnableDubboConfiguration
  9. public class Application {
  10. public static void main(String[] args) {
  11. SpringApplication.run(Application.class, args);
  12. }
  13. }

2.3 服务消费者

SpringBoot核心配置文件

  1. # 配置内嵌tomcat端口号和上下文根
  2. server.port=8080
  3. server.servlet.context-path=/
  4. # 设置dubbo
  5. spring.application.name=016-springboot-ssm-dubbo-consumer
  6. spring.dubbo.registry=zookeeper://localhost:2181
  7. # 配置视图解析器
  8. spring.mvc.view.prefix=/
  9. spring.mvc.view.suffix=.jsp

定义控制层,其中有两个请求方法

  1. package com.szh.springboot.controller;
  2. import com.alibaba.dubbo.config.annotation.Reference;
  3. import com.szh.springboot.entity.Student;
  4. import com.szh.springboot.service.StudentService;
  5. import org.springframework.stereotype.Controller;
  6. import org.springframework.ui.Model;
  7. import org.springframework.web.bind.annotation.GetMapping;
  8. import org.springframework.web.bind.annotation.PathVariable;
  9. import org.springframework.web.bind.annotation.RequestMapping;
  10. import org.springframework.web.bind.annotation.ResponseBody;
  11. /**
  12. *
  13. */
  14. @Controller
  15. public class StudentController {
  16. @Reference(interfaceClass = StudentService.class,version = "1.0.0",check = false)
  17. private StudentService studentService;
  18. @RequestMapping(value = "/student/detail/{id}")
  19. public String studentDetail(@PathVariable("id") Integer id,
  20. Model model) {
  21. Student student=studentService.queryStudentById(id);
  22. model.addAttribute("student",student);
  23. return "studentDetail";
  24. }
  25. @GetMapping(value = "/student/all/count")
  26. public @ResponseBody Object allStudentCount() {
  27. Integer allStudentCount=studentService.queryAllStudentCount();
  28. return "学生总人数为:" + allStudentCount;
  29. }
  30. }

pom文件

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.alibaba.spring.boot</groupId>
  8. <artifactId>dubbo-spring-boot-starter</artifactId>
  9. <version>2.0.0</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.apache.zookeeper</groupId>
  13. <artifactId>zookeeper</artifactId>
  14. <version>3.4.6</version>
  15. <exclusions>
  16. <exclusion>
  17. <groupId>org.slf4j</groupId>
  18. <artifactId>slf4j-log4j12</artifactId>
  19. </exclusion>
  20. </exclusions>
  21. </dependency>
  22. <dependency>
  23. <groupId>com.101tec</groupId>
  24. <artifactId>zkclient</artifactId>
  25. <version>0.4</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.apache.tomcat.embed</groupId>
  29. <artifactId>tomcat-embed-jasper</artifactId>
  30. </dependency>
  31. <!-- 接口工程 -->
  32. <dependency>
  33. <groupId>com.szh.springboot</groupId>
  34. <artifactId>014-springboot-ssm-dubbo-interface</artifactId>
  35. <version>1.0.0</version>
  36. </dependency>
  37. </dependencies>
  38. <build>
  39. <resources>
  40. <resource>
  41. <directory>src/main/webapp</directory>
  42. <targetPath>META-INF/resources</targetPath>
  43. <includes>
  44. <include>*.*</include>
  45. </includes>
  46. </resource>
  47. </resources>
  48. <plugins>
  49. <plugin>
  50. <groupId>org.springframework.boot</groupId>
  51. <artifactId>spring-boot-maven-plugin</artifactId>
  52. </plugin>
  53. </plugins>
  54. </build>

响应的jsp页面、SpringBoot项目启动入口类

  1. <%@ page contentType="text/html;charset=utf-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>$</title>
  5. </head>
  6. <body>
  7. <h3>学生信息</h3>
  8. <div>学生编号:${student.id}</div>
  9. <div>学生姓名:${student.name}</div>
  10. <div>学生年龄:${student.age}</div>
  11. </body>
  12. </html>
  1. package com.szh.springboot;
  2. import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. @SpringBootApplication
  6. @EnableDubboConfiguration
  7. public class Application {
  8. public static void main(String[] args) {
  9. SpringApplication.run(Application.class, args);
  10. }
  11. }

2.4 启动测试!!!

因为我们这个案例是SpringBoot集成SSM、Dubbo、Redis、JSP,同时使用注册中心。所以启动的步骤是:

  1. 启动zookeeper注册中心 zkServer.cmd(我这里为了考虑电脑性能,所以直接就在Windows上启动了,推荐是在Linux上启动)
  2. 启动redis服务(redis-server.exe redis,windows.conf    、  redis-cli.exe -h 127.0.0.1 -p 6379)
  3. 启动服务提供者(对应该工程的SpringBoot项目启动入口类)
  4. 启动服务消费者(对应该工程的SpringBoot项目启动入口类)

测试结果中,可以看到,第一个请求结果拿到了学生信息,第二个请求结果也查询出了学生数量,而且我们开启redis服务之后,可以看到发起第二个请求之后,redis缓存中已经有了这个 allStudentCount 数据,经过30秒之后,这个数据会被清除。



所属网站分类: 技术文章 > 博客

作者:再拍我就焖面

链接:http://www.phpheidong.com/blog/article/86687/3434ab4d35b7750a59e8/

来源:php黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

30 0
收藏该文
已收藏

评论内容:(最多支持255个字符)