接着上一篇,我们在测试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接口和映射文件, 并把他们拷贝到项目中,如图:
二、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;
/**
* <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访问,最后结果如图:
这样,数据库访问就通了,接下来,我们继续封装,比如: 全局异常处理,安全模块等等
补充:
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;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。