接着上一篇,我们在测试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内容如下:

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.topinfo.manager</groupId>
        <artifactId>tx-manager</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <artifactId>tx-manager-mapper</artifactId>

    <dependencies>
        <!-- 依赖实体 -->
        <dependency>
            <groupId>com.topinfo.manager</groupId>
            <artifactId>tx-manager-bean</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>

        <!-- MyBatis -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>

        <!-- MyBatis spring-boot pagehelper 的分页插件 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
        </dependency>
        
        <!-- 添加MySQL依赖  -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!-- druid configuration --> 
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
        </dependency>
        
    </dependencies>
    
    <!-- 如果不添加此节点mybatis的mapper.xml文件不会打包编译进去,会被漏掉 -->
    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>
</project>

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

clipboard.png

二、tx-manager-bean

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

三、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;
    
    
    /**   
     * <p>Description: 新增账户</p>   
     * @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访问,最后结果如图:

clipboard.png

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

补充:

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<Object> list = new ArrayList<Object> ();
                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> T parseObject(String json, Class<T> 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<T>        
     */
    public static <T> List<T> parseArray(String json, Class<T> clazz){
        
        try {
            JSONObject jsonObject = JSONObject.fromObject (json);
            int errcode = jsonObject.getInt ("errcode");

            if (STATE_SUCCESS == errcode) {// 成功
                JSONArray jsonArray = jsonObject.getJSONArray ("data");
                List<T> list =  (List<T>) 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<Object> getData(){
        return data;
    }


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


    
    public String getExpfield(){
        return expfield;
    }


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

妞见妞爱
44 声望15 粉丝

时光,不会辜负每一个平静努力的人...