接着上一篇,我们在测试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-mapper1、创建数据库、表(这个过程忽略),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接口和映射文件, 并把他们拷贝到项目中,如图:二、tx-manager-bean1、把反向工程生成的实体复制到 bean 项目中;pom.xml 不需要引入其他,如图:三、tx-manager-service1、编写测试方法,编写接口和实现类;接口 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. /@Servicepublic 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-webtx-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.Driverspring: ############################################################ ## 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<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; } }