资讯专栏INFORMATION COLUMN

SpringBoot搭建一个SSM开发框架(二)

Nosee / 2722人阅读

摘要:接着上一篇,我们在测试可以允许后,我们接着来写一个查询功能,一连接数据库的查询例子我来看看项目的结构顶级父项目公司默认有的父项目数据层

接着上一篇,我们在测试web可以允许后,我们接着来写一个查询功能,

一、 连接数据库的查询例子

我来看看项目的结构:

 tx-parent 顶级父项目(公司默认有的)
    |- tx-manager ---------------------------pom.xml 父项目
       |- tx-manager-mapper ---------------数据层
       |- tx-manager-common ---------------工具层
       |- tx-manager-bean   ---------------实体层
       |- tx-manager-service --------------服务层
       |- tx-manager-web    ---------------控制层

技术栈:
mqsql数据库
druid连接池
mybatis持久层
spring这个就不说了吧

分析:
分模块开发,所以我们需要把:
实体放到 -> bean 项目中
mybatis的接口和映射文件放到 -> mapper 项目中
yml项目配置如:连接池,日志等 放到 -> web 项目中

下面我们开始动手:

一、tx-manager-mapper

1、创建数据库、表(这个过程忽略),
2、添加依赖,我们需要依赖mybatis、mysql驱动、连接池等。tx-manager-mapper的pom.xml内容如下:


    4.0.0
    
        com.topinfo.manager
        tx-manager
        1.0.0-SNAPSHOT
    
    tx-manager-mapper

    
        
        
            com.topinfo.manager
            tx-manager-bean
            1.0.0-SNAPSHOT
        

        
        
            org.mybatis.spring.boot
            mybatis-spring-boot-starter
        

        
        
            com.github.pagehelper
            pagehelper-spring-boot-starter
        
        
        
        
            mysql
            mysql-connector-java
        

         
        
            com.alibaba
            druid
        
        
    
    
    
    
        
            
                src/main/java
                
                    **/*.properties
                    **/*.xml
                
                false
            
        
    

3、我们通过反向工程来生成 实体bean、 mybatis接口和映射文件, 并把他们拷贝到项目中,如图:

二、tx-manager-bean

1、把反向工程生成的实体复制到 bean 项目中;pom.xml 不需要引入其他,如图:

三、tx-manager-service

1、编写测试方法,编写接口和实现类;

接口 ITxAccountService :

public interface ITxAccountService {
    
    
    /**    
     * @Description: 新增账户  
     * @param: @param account
     * @param: @return      
     * @return: TxResult        
     */
    public TxResult addTxAccount(TxAccount account);
    
    
    
    /**    
     * @Description: 修改账户 
     * @param: @param account
     * @param: @return      
     * @return: TxResult        
     */
    public TxResult updateTxAccount(TxAccount account);
    
    
    
    /**    
     * @Description: 查看账户信息
     * @param: @param accountId
     * @param: @return      
     * @return: TxResult        
     */
    public TxResult queryTxAccount(String accountId);
    
    
    
    /**    
     * @Description: 查询账户列表
     * @param: @param username
     * @param: @param page
     * @param: @param rows
     * @return: TxResult 
     */
    public TxResult queryTxAccountList(String username, int page, int rows);
    
   

}

实现类 TxAccountServiceImpl:

/**   
 * @ClassName:  TxAccountServiceImpl   
 * @Description: 账户服务类
 * @author: 杨攀
 * @date:   2019年1月10日 下午2:55:13     
 * @Copyright: 2019 www.tuxun.net Inc. All rights reserved. 
 */
@Service
public class TxAccountServiceImpl implements ITxAccountService {

    
    @Autowired
    private TxAccountMapper accountMapper;
    
    
    /**   
     * 

Description: 新增账户

* @param account * @return * @see com.topinfo.manager.service.ITxAccountService#addTxAccount(com.topinfo.manager.bean.TxAccount) */ @Override public TxResult addTxAccount(TxAccount account){ return null; } @Override public TxResult updateTxAccount(TxAccount account){ return null; } @Override public TxResult queryTxAccount(String accountId){ //根据账户id查询 TxAccount account = accountMapper.selectByPrimaryKey (accountId); if(null != account) { return TxResult.buildSuccess (account); } return TxResult.buildFailure (); } @Override public TxResult queryTxAccountList(String username, int pageNum, int rows){ return null; } }
四、tx-manager-web

tx-manager-web层我们需要做几步:
1、连接池、日志的配置
2、controller的编写
3、启动dao层的扫描

1、连接池、日志的配置

1、在application-dev.yml开发配置中,添加连接池的配置,同时设置Tomcat服务端口、模板thymeleaf、security 等, 内容如下:

############################################################
#############  开发环境配置
############################################################

## Tomcat服务端口
server:
  port: 8080


############################################################
############# 数据源配置 Druid 
############################################################  
druid:
  datasource:
    ## useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
    url: jdbc:mysql://127.0.0.1:3306/tx-manager?characterEncoding=UTF-8&serverTimezone=UTC
    username: spring
    password: spring
    driverClass: com.mysql.jdbc.Driver


spring:
  ############################################################
  ##  thymeleaf 模板配置
  thymeleaf:
    cache: false ## 开发阶段,关闭thymeleaf缓存
    prefix: classpath:/templates/
    suffix: .html

  security:
    user:
      name: admin
      password: 111111

说明: url后面需要添加 serverTimezone=UTC,否则启动会报异常

java.sql.SQLException: The server time zone value "Öйú±ê׼ʱ¼ä"....

2、添加配置类

/**
 *@Description: 阿里连接池
 *@Author:杨攀
 *@Since:2018年6月28日下午5:18:02  
 */
@Configuration
@ConfigurationProperties(prefix = "druid.datasource")
public class DruidDataSourceConfig {
    
    @Autowired
    private Environment env;
    
    @Bean
    public DruidDataSource dataSource(){

        DruidDataSource dataSource = new DruidDataSource();
        
        dataSource.setUrl(env.getProperty("druid.datasource.url"));
        dataSource.setUsername(env.getProperty("druid.datasource.username"));
        dataSource.setPassword(env.getProperty("druid.datasource.password"));
        dataSource.setInitialSize(5);
        dataSource.setMaxActive(50);
        dataSource.setMinIdle(0);
        dataSource.setMaxWait(60000);
        dataSource.setValidationQuery("SELECT 1");
        dataSource.setTestOnBorrow(false);
        dataSource.setTestWhileIdle(true);
        dataSource.setPoolPreparedStatements(false);
        
        return dataSource;
    }    

}

3、在application.yml全局配置中添加日志的配置, mybatis的配置

############################################################
#############  全局配置
############################################################

# 多个环境配置文件切换 
spring:
  profiles:  
    active: dev 




############################################################
#############  mybatis 配置
############################################################

# mybatis配置
mybatis:
  # 配置mybatis的xml文件路径 com.topinfo.manager.mapper
  mapper-locations: classpath:/com/topinfo/manager/mapper/*.xml
  # 配置Bean的路径
  type-aliases-package: com.topinfo.manager.bean
  
# mybatis 分页插件配置
pagehelper:
  reasonable: true
  supportMethodsArguments: true
  params: count=countSql
   

############################################################
############# logging 日志配置
############################################################  
logging:
  # 日志配置文件,Spring Boot默认使用classpath路径下的日志配置文件
  config: classpath:logback-boot.xml
  # 日志文件,绝对路径或相对路径 D:/upload, 最后不需要添加“/”
  dir:  D:/upload
  # 日志输出级别: 级别依次为【从高到低】:FATAL > ERROR > WARN > INFO > DEBUG
  level: 
    # 配置spring web日志级别  
    root: INFO 
2、controller的编写

controller的编写

@RestController
@RequestMapping("/account")
public class AccountController {

    @Autowired
    private ITxAccountService accountService;
    
     
    @RequestMapping(value="/view", method=RequestMethod.GET)
    public TxResult view(String id) {
        return accountService.queryTxAccount (id);
    }
    
}
3、启动dao层的扫描

添加 @MapperScan 扫描注解, 然后运行。

@SpringBootApplication
@MapperScan(value={"com.topinfo.manager.mapper"}) //此注解表示动态扫描DAO接口所在包
public class ManagerApplication {
    
    public static void main(String[] args) throws Exception{
        SpringApplication.run (ManagerApplication.class, args);
    }

}

在数据库中添加了一条测试数据,然后根据id访问,最后结果如图:

这样,数据库访问就通了,接下来,我们继续封装,比如: 全局异常处理,安全模块等等

补充:

TxResult 为自定义响应格式,内容如下:

/**   
 * @ClassName:  TxResult   
 * @Description: 自定义响应格式 
 * @author: 杨攀
 * @date:   2018年12月26日 下午5:35:34     
 * @Copyright: 2018 www.tuxun.net Inc. All rights reserved. 
 */
public class TxResult {
    
    public static final int STATE_SUCCESS = 1; //表示成功

    public static final int STATE_FAILURE = -1; //表示失败
    
    /** 
     *@Fields  成功返回: 1   失败返回:-1 或 其他错误码
     */
    private Integer           errcode;

    /** 
     *@Fields  返回成功或失败的信息提示.
     */
    private String            message;

    /** 
     *@Fields  返回的数据,不管是单个对象还是对个对象,统一放到List中.
     */
    private List   data;
    
    
    /**   
     * @Fields expfield : 扩展字段  
     */
    private String            expfield;
 
    
    
    private TxResult(int code, String message, Object object, String expfield) {
        this.errcode = code;
        this.message = message;
        this.expfield = expfield;
        
        if (null != object) {
            if(object instanceof List) { //如果是列表则
                this.data = (List) object;
            }else {
                List list = new ArrayList ();
                list.add (object);
                this.data = list;
            }
        }
    }
    
    
    private TxResult(int code, String message, Object object) {
        this (code, message, object, "");
    }

     
    /**    
     * @Description: 操作成功! 
     * @param: @return      
     * @return: TxResult        
     */
    public static TxResult buildSuccess(){
        return new TxResult(1, "操作成功!", null);
    }
    
    
    /**    
     * @Description: 操作成功! 
     * @param: @return      
     * @return: TxResult        
     */
    public static TxResult buildSuccess(Object data){
        return new TxResult(1, "操作成功!", data);
    }
    
    /**    
     * @Description: 操作失败!  
     * @param: @return      
     * @return: TxResult        
     */
    public static TxResult buildFailure(){
        return new TxResult(-1, "操作失败!", null);
    }
    
    /**    
     * @Description: 自定义消息   
     * @param: @param code
     * @param: @param msg
     * @param: @return      
     * @return: TxResult        
     */
    public static TxResult build(int code, String msg) {
        return new TxResult(code, msg, null);
    }
    
    /**    
     * @Description: 自定义消息
     * @param: @param code
     * @param: @param msg
     * @param: @param data
     * @param: @return      
     * @return: TxResult        
     */
    public static TxResult build(int code, String msg, Object data) {
        return new TxResult(code, msg, data);
    }
    
    
    /**    
     * @Description: 解析 json (TxResult的json) 判断是否为 true
     * @param: @param json
     * @param: @return      
     * @return: T        
     */
    public static boolean parseBoolean(String json){
        try {
            JSONObject jsonObject = JSONObject.fromObject (json);
            int errcode = jsonObject.getInt ("errcode");
            if (STATE_SUCCESS == errcode) {// 成功
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
    
    /**    
     * @Description:  解析 json (TxResult的json) 的扩展信息
     * @param: @param json
     * @param: @return      
     * @return: boolean        
     */
    public static String parseExpfield(String json){
        try {
            JSONObject jsonObject = JSONObject.fromObject (json);
            String expfield = jsonObject.getString ("expfield");
            return expfield;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }
    
    
    
    /**    
     * @Description: 解析 json (TxResult的json) 为一个 对象
     * @param: @param json
     * @param: @param clazz
     * @param: @return      
     * @return: T        
     */
    public static  T parseObject(String json, Class clazz){
        try {
            JSONObject jsonObject = JSONObject.fromObject (json);
            int errcode = jsonObject.getInt ("errcode");

            if (STATE_SUCCESS == errcode) {// 成功
                JSONArray jsonArray = jsonObject.getJSONArray ("data");
                if (jsonArray.size () > 0) {// 判断,防止返回没有对象
                    JSONObject bean = jsonArray.getJSONObject (0);
                    T t = (T) bean.toBean (bean, clazz);
                    return t;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
    
    /**    
     * @Description: 解析json (TxResult的json)  为一个 List  
     * @param: @param json
     * @param: @param clazz 
     * @param: @return      
     * @return: List        
     */
    public static  List parseArray(String json, Class clazz){
        
        try {
            JSONObject jsonObject = JSONObject.fromObject (json);
            int errcode = jsonObject.getInt ("errcode");

            if (STATE_SUCCESS == errcode) {// 成功
                JSONArray jsonArray = jsonObject.getJSONArray ("data");
                List list =  (List) JSONArray.toCollection (jsonArray, clazz);
                return list;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    
    public Integer getErrcode(){
        return errcode;
    }


    
    public void setErrcode(Integer errcode){
        this.errcode = errcode;
    }


    
    public String getMessage(){
        return message;
    }


    
    public void setMessage(String message){
        this.message = message;
    }


    
    public List getData(){
        return data;
    }


    
    public void setData(List data){
        this.data = data;
    }


    
    public String getExpfield(){
        return expfield;
    }


    
    public void setExpfield(String expfield){
        this.expfield = expfield;
    }
    
}
           
               
                                           
                       
                 
            
                     
             
               

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72933.html

相关文章

  • Java后端

    摘要:,面向切面编程,中最主要的是用于事务方面的使用。目标达成后还会有去构建微服务,希望大家多多支持。原文地址手把手教程优雅的应用四手把手实现后端搭建第四期 SpringMVC 干货系列:从零搭建 SpringMVC+mybatis(四):Spring 两大核心之 AOP 学习 | 掘金技术征文 原本地址:SpringMVC 干货系列:从零搭建 SpringMVC+mybatis(四):Sp...

    joyvw 评论0 收藏0
  • SpringBoot搭建一个SSM开发框架

    摘要:的子模块我们先讲层,因为我想把配置在这里也说下。长这样我们接下来看看每个子模块如何编写。二子模块搭建子模块搭建子模块配置在将之前,我们先将的配置文件,使用一个全局的配置文件或,我们推荐使用文件。 现在,我们来搭建一个简单的分模块的SSM开发框架吧, 一: 分析并创建项目 先来简单分析下我们项目的结构: 比如:我现在搭建一个管理系统,我们把项目分为: tx-parent 顶级父项目(公...

    tuomao 评论0 收藏0
  • 两年了,我写了这些干货!

    摘要:开公众号差不多两年了,有不少原创教程,当原创越来越多时,大家搜索起来就很不方便,因此做了一个索引帮助大家快速找到需要的文章系列处理登录请求前后端分离一使用完美处理权限问题前后端分离二使用完美处理权限问题前后端分离三中密码加盐与中异常统一处理 开公众号差不多两年了,有不少原创教程,当原创越来越多时,大家搜索起来就很不方便,因此做了一个索引帮助大家快速找到需要的文章! Spring Boo...

    huayeluoliuhen 评论0 收藏0
  • SpringBoot 仿抖音短视频小程序开发(一)

    摘要:一项目简介模仿抖音做的一个短视频微信小程序,用搭建小程序后台,用框架搭建短视频后台管理系统,小程序后台通过分布式监听节点自动下载或删除短视频后台管理系统上传的视频。 一、项目简介 模仿抖音做的一个短视频微信小程序,用SpringBoot搭建小程序后台,用SSM框架搭建短视频后台管理系统,小程序后台通过分布式zookeeper监听节点自动下载或删除短视频后台管理系统上传的视频。 二、环境...

    CoffeX 评论0 收藏0

发表评论

0条评论

Nosee

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<