Spring Boot 整合JDBC 实现后端项目开发
一、前言
二、新建Spring Boot 项目
三、Spring Boot 整合JDBC 与MySQL 交互
3.1 新建数据表skr_user
3.2 Jdbcproject 项目结构如下
3.3 搭建文件结构
3.3.1 创建package
3.3.2 创建开发环境配置文件
3.4 新建工具类
3.4.1 加密工具类MD5Util.java
3.4.2 单据编号生成工具类GenerateIdUtil.java
3.5 新建实体类
3.5.1 数据表对应用户实体类SkrUser.java
3.5.2 请求参数封装实体类RequsetEntity.java
3.5.3 后台响应结果封装实体类ResultEntity.java
3.6 完善持久层和业务层代码
3.6.1 新建持久层接口SkrUserDao.java
3.6.2 新建持久层实现类SkrUserDaoImpl.java
3.6.3 新建业务接口SkrUserService.java
3.6.4 新建业务实现类SkrUserServiceImpl.java
四、后端项目对外接口开发
4.1 新建Controller 控制层类
4.2 项目最终结构图如下
五、后端开发项目测试
源码: https://github.com/niaonao/jdbcproject
一、前言
前后端分离开发是将项目开发工作前后端交互工作拆分,使前端开发人员能够专注于页面开发或APP 开发,后端开发人员专注与接口开发、业务逻辑开发。
此处开发后端项目,给前端或者APP 端提供接口。不涉及复杂的业务逻辑,通过简单的增删改查来演示后端开发项目。
环境介绍:
- 开发工具:IDEA
- JDK: 1.7 及以上
- Spring Boot: 2.0 及以上
- Maven: 3.0 及以上
- MySQL: 5.7
二、新建Spring Boot 项目
通过功能菜单File - New - Project 新建Spring Initializr 项目,Project SDK 选择Java 1.8.0,其他默认即可Next 下一步。
图2-1、新建Spring Initializr 项目
坐标Group 填写pers.niaonao,坐标Artifact 填写jdbcproject,项目Name 为jdbcproject,Package 包名为pers.niaonao.jdbcproject。
图2-2、Project Metadata 图
项目依赖选择Web、JDBC、MySQL 然后Next 下一步。
图2-3、选择项目依赖图
图2-4、完成项目创建
你可以另外配置Maven 也可以使用默认的Maven,我这里是自己配置的Maven 3.5
图2-5、Maven 配置图
三、Spring Boot 整合JDBC 与MySQL 交互
3.1 新建数据表skr_user
-- ----------------------------
-- Table structure for skr_user
-- ----------------------------
DROP TABLE IF EXISTS `skr_user`;
CREATE TABLE `skr_user` (
`id` int(5) NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_id` varchar(20) NOT NULL COMMENT '用户ID',
`user_nick_name` varchar(10) DEFAULT NULL COMMENT '用户昵称',
`user_real_name` varchar(10) DEFAULT NULL COMMENT '用户名称',
`user_phone` varchar(11) DEFAULT NULL,
`user_password` varchar(32) DEFAULT NULL,
`user_address` varchar(32) DEFAULT NULL,
`user_gender` int(1) DEFAULT NULL COMMENT '性别: 0/1 - 男/女',
`user_card` varchar(20) DEFAULT NULL COMMENT '身份证',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of skr_user
-- ----------------------------
INSERT INTO `skr_user` VALUES ('', '', 'kecun', '柯纯', '', 'E10ADC3949BA59ABBE56E057F20F883E', 'hpu松7', '', '');
INSERT INTO `skr_user` VALUES ('', '', 'huangza', '皇子昂', '', 'E10ADC3949BA59ABBE56E057F20F883E', '安徽省安庆市潜山县', '', '');
INSERT INTO `skr_user` VALUES ('', '', 'guosb', '郭淑白', '', 'E10ADC3949BA59ABBE56E057F20F883E', '广东省江门市鹤山市', '', '');
INSERT INTO `skr_user` VALUES ('', '', 'gongcj', '龚才俊', '', 'E10ADC3949BA59ABBE56E057F20F883E', '海南省三亚市万宁市', '', '');
INSERT INTO `skr_user` VALUES ('', '', 'chenh', '陈鸿祯', '', 'E10ADC3949BA59ABBE56E057F20F883E', '江苏省淮阴市金湖县', '', '');
INSERT INTO `skr_user` VALUES ('', '', 'lie', '李尔', '', 'E10ADC3949BA59ABBE56E057F20F883E', '河北省邢台市沙河市', '', '');
INSERT INTO `skr_user` VALUES ('', '', 'guxz', '顾兴朝', '', 'E10ADC3949BA59ABBE56E057F20F883E', '西藏自治区日喀则地区', '', '');
INSERT INTO `skr_user` VALUES ('', '', 'taohh', '陶鸿晖', '', 'E10ADC3949BA59ABBE56E057F20F883E', '山西省忻州地区定襄县', '', '');
INSERT INTO `skr_user` VALUES ('', '', 'qincc', '秦痴春', '', 'E10ADC3949BA59ABBE56E057F20F883E', '云南省昆明市呈贡县', '', '');
INSERT INTO `skr_user` VALUES ('', '', 'long', '龙伟兆', '', 'E10ADC3949BA59ABBE56E057F20F883E', '广西壮族自治区南宁市', '', '');
INSERT INTO `skr_user` VALUES ('', '', 'qian', '钱逸明', '', 'E10ADC3949BA59ABBE56E057F20F883E', '陕西省安康地区', '', '');
INSERT INTO `skr_user` VALUES ('', '', 'weih', '韦宏旷', '', 'E10ADC3949BA59ABBE56E057F20F883E', '安徽省安庆市潜山县', '', '45010019710713799X');
INSERT INTO `skr_user` VALUES ('', '', 'songms', '宋妙松', '', 'E10ADC3949BA59ABBE56E057F20F883E', '西藏自治区日喀则地区日喀则市', '', '15212719921025705X');
INSERT INTO `skr_user` VALUES ('', '', 'zhanghc', '张宏畅', '', 'E10ADC3949BA59ABBE56E057F20F883E', '安徽省安庆市枞阳县', '', '');
INSERT INTO `skr_user` VALUES ('', '', 'fangxq', '方新晴', '', 'E10ADC3949BA59ABBE56E057F20F883E', '辽宁省葫芦岛市兴城市', '', '');
INSERT INTO `skr_user` VALUES ('', '', 'linz', '林芷天', '', 'E10ADC3949BA59ABBE56E057F20F883E', '四川省凉山彝族自治州宁南县', '', '21148119971204138X');
INSERT INTO `skr_user` VALUES ('', '', 'qianyw', '钱阳文', '', 'E10ADC3949BA59ABBE56E057F20F883E', '河北省石家庄市赞皇县', '', '');
INSERT INTO `skr_user` VALUES ('', '', 'panyq', '潘雅琴', '', 'E10ADC3949BA59ABBE56E057F20F883E', '河南省濮阳市市区', '', '');
INSERT INTO `skr_user` VALUES ('', '', 'hanyh', '韩宇航', '', 'E10ADC3949BA59ABBE56E057F20F883E', '湖南省衡阳市南岳区', '', '');
INSERT INTO `skr_user` VALUES ('', '', 'luth', '卢天华', '', 'E10ADC3949BA59ABBE56E057F20F883E', '安徽省安庆市潜山县', '', '');
3.2 Jdbcproject 项目结构如下
图3-1、项目初始结构图
添加JSON 依赖,pom.xml 文件如下
<?xml version="1.0" encoding="UTF-8"?>
<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> <groupId>pers.niaonao</groupId>
<artifactId>jdbcproject</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <name>jdbcproject</name>
<description>Demo project for Spring Boot</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties> <dependencies>
<!--1.JDBC 依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--2.Web 依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <!--3.MySQL 依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <!--4.JSON依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.8</version>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>
此处添加了JSON 依赖,前后端数据的传输格式统一为JSON 类型。引入依赖。
图3-2、引入Maven 依赖图
3.3 搭建文件结构
在pers.niaonao.jdbcproject 下新建package 包
- dao: 存放持久层接口
- entity: 存放实体类
- service: 存放业务层相关接口
- util: 存放工具类
- web: 存放Controller 控制层相关类
在资源路径resources 新建application.yml 和application-dev.yml 文件。
- application.yml: 和application.properties 配置文件一样,只是文件格式不一样。Spring Boot 推荐使用yaml 格式配置文件。
- application-dev.yml: 作为开发环境配置文件。(一个项目的开发一般有正式环境application-master.yml,开发环境application-dev.yml,测试环境application-feature.yml)
图3-3、搭建文件结构图
application.xml 文件如下
spring:
profiles:
active: dev
application-dev.xml 文件如下
#develop environment
#端口
server:
port: 8082
#数据库
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/yonyou_nc
username: root
password: root
3.4 新建工具类
在util 包下新建加密工具类MD5Util.java,新建id 生成工具类。
加密工具类MD5Util.java
package pers.niaonao.jdbcproject.util; import java.security.MessageDigest; /**
* @Author: niaonao
* @Date: Created in 15:21 2018/7/29
* @Description :md5加密工具类
*/
public class MD5Util {
/**
* 生成md5
*
* @param message
* @return
*/
public static String getMD5(String message) {
String md5str = "";
try {
// 1 创建一个提供信息摘要算法的对象,初始化为md5算法对象
MessageDigest md = MessageDigest.getInstance("MD5"); // 2 将消息变成byte数组
byte[] input = message.getBytes("UTF-8"); // 3 计算后获得字节数组,这就是那128位了
byte[] buff = md.digest(input); // 4 把数组每一字节(一个字节占八位)换成16进制连成md5字符串
md5str = bytesToHex(buff); } catch (Exception e) {
e.printStackTrace();
}
return md5str;
} /**
* 二进制转十六进制
*
* @param bytes
* @return
*/
public static String bytesToHex(byte[] bytes) {
StringBuffer md5str = new StringBuffer();
// 把数组每一字节换成16进制连成md5字符串
int digital;
for (int i = 0; i < bytes.length; i++) {
digital = bytes[i]; if (digital < 0) {
digital += 256;
}
if (digital < 16) {
md5str.append("0");
}
md5str.append(Integer.toHexString(digital));
}
return md5str.toString().toLowerCase();
}
}
GenerateIdUtil.java
package pers.niaonao.jdbcproject.util; import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random; /**
* @Author: niaonao
* @Date: Created in 15:21 2018/7/29
* @Desprition: 实体类ID 生成工具类
*/
public class GenerateIdUtil { /** 默认用户分表位 */
private static final String DEFAULT_USER_PARTITION = "1"; /** 默认替代位 */
private static final String DEFAULT_REPLACE = "0"; /** 默认横线 */
private static final String DEFAULT_LINE = "-"; /**
* 生成 id 方法
* 一般项目会有多个实体类(数据表)
* 此处生成id 添加四位标记码可以区分不同的数据表,且能够降低出现重复的id
* @param tableBizCode 数据表标记码
* @return
*/
public static String generateId(String tableBizCode){
//获取当前日期字符串
String dateString = getPartition(new Date());
//获取随机生成十四位数字
String ranString = String.valueOf(new Random().nextLong()).substring(0,6);
//如果当前随机数第一位是-,则用0代替
if (ranString.contains(DEFAULT_LINE)){
ranString = ranString.replace(DEFAULT_LINE,DEFAULT_REPLACE);
}
//iD规则:当前日期字符串 + 1 + 数据表标记码 + 6位随机数字符串
return dateString + DEFAULT_USER_PARTITION + tableBizCode + ranString;
} /**
* 日期转换
* @param date 当前时间
* @return 日期字符串
*/
public static String getPartition(Date date) {
//前8位yyyyMMdd格式
DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
return dateFormat.format(date);
} public static void main(String args[]){
//生成数据格式:2018072910221899540
System.out.println(generateId("0221"));
}
}
3.5 新建实体类
在entity 包下新建实体类SkrUser.java、RequestEntity.java、ResultEntity.java
数据表对应用户实体类SkrUser.java
package pers.niaonao.jdbcproject.entity; /**
* @Author: niaonao
* @Date: Created in 16:24 2018/7/29
* @Desprition: 用户实体类
*/
public class SkrUser { /**
* 用户ID
*/
private String userId;
/**
* 用户注册昵称
*/
private String userNickName;
/**
* 用户真实名称
*/
private String userRealName;
/**
* 用户手机号码
*/
private String userPhone;
/**
* 用户登录密码
*/
private String userPassword;
/**
* 用户地址
*/
private String userAddress;
/**
* 用户身份证号
*/
private String userCard;
/**
* 用户性别
* 0/1 - 男/女
*/
private int userGender = -1; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getUserNickName() { return userNickName; } public void setUserNickName(String userNickName) { this.userNickName = userNickName; } public String getUserRealName() { return userRealName; } public void setUserRealName(String userRealName) { this.userRealName = userRealName; } public String getUserPhone() { return userPhone; } public void setUserPhone(String userPhone) { this.userPhone = userPhone; } public String getUserPassword() { return userPassword; } public void setUserPassword(String userPassword) { this.userPassword = userPassword; } public String getUserAddress() { return userAddress; } public void setUserAddress(String userAddress) { this.userAddress = userAddress; } public String getUserCard() { return userCard; } public void setUserCard(String userCard) { this.userCard = userCard; } public int getUserGender() { return userGender; } public void setUserGender(int userGender) { this.userGender = userGender; }
}
请求参数封装实体类RequsetEntity.java
package pers.niaonao.jdbcproject.entity; import java.io.Serializable; /**
* @Author: niaonao
* @Date: Created in 16:36 2018/7/29
* @Desprition: 请求参数封装类
*/
public class RequestEntity implements Serializable {
private static final long serialVersionUID = 3401781428101852075L; /**
* 请求响应数据
*/
private String treasureData; public String getTreasureData() {
return treasureData;
} public void setTreasureData(String treasureData) {
this.treasureData = treasureData;
} }
后台响应结果封装实体类ResultEntity.java
package pers.niaonao.jdbcproject.entity; import java.io.Serializable; /**
* @Author: niaonao
* @Date: Created in 16:36 2018/7/29
* @Desprition: 返回结果封装实体类
*/
public class ResultEntity implements Serializable { private static final long serialVersionUID = 3401781428101852075L; /**
* 接口请求处理结果
* 成功true,失败-false
*/
private Boolean success; /**
* 处理结果信息
*/
private String errorMsg; /**
* 返回数据对象
*/
private Object object; public Boolean getSuccess() {
return success;
} public void setSuccess(Boolean success) {
this.success = success;
} public String getErrorMsg() {
return errorMsg;
} public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
} public Object getObject() {
return object;
} public void setObject(Object object) {
this.object = object;
} /**
* 构造函数
* @param success
* @param errorMsg
* @param object
*/
public ResultEntity(Boolean success, String errorMsg, Object object) {
this.success = success;
this.errorMsg = errorMsg;
this.object = object;
}
}
3.6 完善持久层和业务层代码
新建持久层接口SkrUserDao.java
package pers.niaonao.jdbcproject.dao; import pers.niaonao.jdbcproject.entity.SkrUser; import java.util.List; /**
* @Author: niaonao
* @Date: Created in 16:25 2018/7/29
* @Desprition: 用户持久层接口类
*/
public interface SkrUserDao {
/**
* 多条件查询获取实体信息
* @param SkrUser
* @return
*/
SkrUser selectByParams(SkrUser SkrUser); /**
* 获取全部用户
* @param SkrUser
* @return
*/
List<SkrUser> getList(SkrUser SkrUser); /**
* 更新用户信息(如果字段不为空更新)
* @param SkrUser
* @return
*/
int updateByIdSelective(SkrUser SkrUser); /**
* 根据id删除实体信息
* @param SkrUser
* @return
*/
int deleteById(SkrUser SkrUser); /**
* 插入用户记录
* @param SkrUser
* @return
*/
int insert(SkrUser SkrUser); /**
* 根据不为空的参数插入用户记录
* @param SkrUser
* @return
*/
int insertBySelective(SkrUser SkrUser);
}
在包pers.niaonao.jdbcproject.dao 下新建package 包 daoimpl
在daoimpl 下新建实现类SkrUserDaoImpl.java
package pers.niaonao.jdbcproject.dao.daoimpl; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import pers.niaonao.jdbcproject.dao.SkrUserDao;
import pers.niaonao.jdbcproject.entity.SkrUser;
import pers.niaonao.jdbcproject.util.MD5Util; import java.util.List; /**
* @Author: niaonao
* @Date: Created in 16:29 2018/7/29
* @Desprition: 用户持久层接口实现类
*/
@Repository
public class SkrUserDaoImpl implements SkrUserDao {
@Autowired
private JdbcTemplate jdbcTemplate; @Override
public SkrUser selectByParams(SkrUser skrUser) { //拼接多条件查询语句,支持模糊查询
String sql = " select user_id, user_nick_name, user_password, user_real_name," +
" user_gender, user_card, user_phone, user_address from skr_user WHERE ";
if (skrUser.getUserId() != null){
sql = sql + " user_id = '" + skrUser.getUserId() + "' AND ";
}
if (skrUser.getUserRealName() != null) {
sql = sql + " user_real_name = '" + skrUser.getUserRealName() + "' AND ";
}
if (skrUser.getUserNickName() != null){
sql = sql + " user_nick_name = '" + skrUser.getUserNickName() + "' AND ";
}
if (skrUser.getUserPassword() != null){
sql = sql + " user_password = '" + MD5Util.getMD5(skrUser.getUserPassword()) + "' AND ";
}
if (skrUser.getUserPassword() != null){
sql = sql + " user_phone = '" + skrUser.getUserPhone() + "' AND ";
}
if (skrUser.getUserPassword() != null){
sql = sql + " user_gender = '" + skrUser.getUserGender() + "' AND ";
}
if (skrUser.getUserPassword() != null){
sql = sql + " user_address = '" + skrUser.getUserAddress() + "' AND ";
} //截取SQl语句多余后缀
if (sql.endsWith("AND ")){
sql = sql.substring(0,sql.length() - 4);
} //封装执行SQL 语句结果
List<SkrUser> skrUserList = jdbcTemplate.query(sql ,new Object[]{}, new BeanPropertyRowMapper(SkrUser.class)) ;
if (skrUserList == null || skrUserList.size() < 1){
return null;
}
return skrUserList.get(0);
} @Override
public List<SkrUser> getList(SkrUser skrUser) {
//拼接SQL语句
String sql = " SELECT user_id, user_nick_name, user_password, user_real_name," +
" user_gender, user_card, user_phone, user_address FROM skr_user WHERE "; if (skrUser.getUserId() != null){
sql = sql + " user_id = '" + skrUser.getUserId() + "' AND ";
}
if (skrUser.getUserRealName() != null) {
sql = sql + " user_real_name LIKE '%" + skrUser.getUserRealName() + "%' AND ";
}
if (skrUser.getUserNickName() != null){
sql = sql + " user_nick_name LIKE '%" + skrUser.getUserNickName() + "%' AND ";
}
if (skrUser.getUserPassword() != null){
sql = sql + " user_password LIKE '%" + MD5Util.getMD5(skrUser.getUserPassword()) + "%' AND ";
}
if (skrUser.getUserPhone() != null){
sql = sql + " user_phone LIKE '%" + skrUser.getUserPhone() + "%' AND ";
}
if (skrUser.getUserGender() == 1 || skrUser.getUserGender() == 0){
sql = sql + " user_gender LIKE '%" + skrUser.getUserGender() + "%' AND ";
}
if (skrUser.getUserAddress() != null){
sql = sql + " user_address LIKE '%" + skrUser.getUserAddress() + "%' AND ";
} //截取SQl语句多余后缀
if (sql.endsWith("WHERE ")){
sql = sql.substring(0,sql.length() - 6);
}else if (sql.endsWith("AND ")){
sql = sql.substring(0,sql.length() - 4);
} return jdbcTemplate.query(sql, new Object[]{}, new BeanPropertyRowMapper(SkrUser.class));
} @Override
public int updateByIdSelective(SkrUser skrUser) {
//根据对象唯一ID更新
if (skrUser.getUserId() == null){
return 0;
} //拼接SQL语句,拼接SQL语句考虑拼接的数据加单引号
String sql = "UPDATE skr_user SET " ;
if (skrUser.getUserRealName() != null) {
sql = sql + " user_real_name = '" + skrUser.getUserRealName() + "' , ";
}
if (skrUser.getUserNickName() != null) {
sql = sql + " user_nick_name = '" + skrUser.getUserNickName() + "' , ";
}
if (skrUser.getUserPassword() != null) {
sql = sql + " user_password = '" + skrUser.getUserPassword() + "' , ";
}
if (skrUser.getUserAddress() != null) {
sql = sql + " user_address = '" + skrUser.getUserAddress() + "' , ";
}
if (skrUser.getUserGender() == 1 || skrUser.getUserGender() == 0) {
sql = sql + " user_gender = '" + skrUser.getUserGender() + "' , ";
}
if (skrUser.getUserCard() != null) {
sql = sql + " user_card = '" + skrUser.getUserCard() + "' , ";
}
if (skrUser.getUserPhone() != null) {
sql = sql + " user_phone = '" + skrUser.getUserPhone() + "' , ";
} if (sql.endsWith("SET")){
return 0;
} //截取SQl语句多余后缀","并拼接WHERE条件
if (sql.endsWith(", ")){
sql = sql.substring(0,sql.length() - 2) + " WHERE user_id = '" + skrUser.getUserId() + "'";
}
return jdbcTemplate.update(sql);
} @Override
public int deleteById(SkrUser skrUser) {
//根据对象唯一ID删除
if (skrUser.getUserId() == null){
return 0;
}
return jdbcTemplate.update("DELETE from skr_user WHERE user_id=?",skrUser.getUserId());
} @Override
public int insert(SkrUser skrUser) { String sql = "INSERT INTO skr_user " +
"(user_id, user_nick_name, user_password, user_address, user_real_name, user_gender, user_card, user_phone)" +
" VALUES (?,?,?,?,?,?,?,?)";
return jdbcTemplate.update(sql, skrUser.getUserId(), skrUser.getUserNickName(), skrUser.getUserPassword(),
skrUser.getUserAddress(),skrUser.getUserRealName(),skrUser.getUserGender(),skrUser.getUserCard(),skrUser.getUserPhone());
} @Override
public int insertBySelective(SkrUser skrUser) { skrUser.setUserRealName(skrUser.getUserRealName() == null ? "" : skrUser.getUserRealName());
skrUser.setUserNickName(skrUser.getUserNickName() == null ? "" : skrUser.getUserNickName());
skrUser.setUserPassword(skrUser.getUserPassword() == null ? "" : skrUser.getUserPassword());
skrUser.setUserNickName(skrUser.getUserNickName() == null ? "" : skrUser.getUserNickName());
skrUser.setUserAddress(skrUser.getUserAddress() == null ? "" : skrUser.getUserAddress());
skrUser.setUserCard(skrUser.getUserCard() == null ? "" : skrUser.getUserCard());
skrUser.setUserGender(skrUser.getUserGender());
skrUser.setUserId(skrUser.getUserId()); String sql = "INSERT INTO skr_user " +
"(user_id, user_nick_name, user_password, user_address, user_real_name, user_gender, user_card, user_phone)" +
" VALUES (?,?,?,?,?,?,?,?)"; return jdbcTemplate.update(sql, skrUser.getUserId(), skrUser.getUserNickName(), skrUser.getUserPassword(),
skrUser.getUserAddress(),skrUser.getUserRealName(),skrUser.getUserGender(),skrUser.getUserCard(),skrUser.getUserPhone());
}
}
在包service 下新建业务接口SkrUserService.java
package pers.niaonao.jdbcproject.service; import pers.niaonao.jdbcproject.entity.RequestEntity;
import pers.niaonao.jdbcproject.entity.ResultEntity; /**
* @Author: niaonao
* @Date: Created in 16:26 2018/7/29
* @Desprition: 用户业务接口
*/
public interface SkrUserService {
/**
* 多条件获取用户
* @param requestEntity
* @return
*/
ResultEntity getSkrUser(RequestEntity requestEntity); /**
* 获取全部用户
* @param requestEntity
* @return
*/
ResultEntity getSkrUserList(RequestEntity requestEntity); /**
* 更新用户信息(如果字段不为空更新)
* @param requestEntity
* @return
*/
ResultEntity updateSkrUser(RequestEntity requestEntity); /**
* 根据id删除用户信息
* @param requestEntity
* @return
*/
ResultEntity deleteSkrUser(RequestEntity requestEntity); /**
* 注册用户
* @param requestEntity
* @return
*/
ResultEntity addSkrUser(RequestEntity requestEntity);
}
在pers.niaonao.jdbcproject.service 下新建package 包serviceimpl
在serviceimpl 下新建业务实现类SkrUserServiceImpl.java
package pers.niaonao.jdbcproject.service.serviceimpl; import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import pers.niaonao.jdbcproject.dao.SkrUserDao;
import pers.niaonao.jdbcproject.entity.RequestEntity;
import pers.niaonao.jdbcproject.entity.ResultEntity;
import pers.niaonao.jdbcproject.entity.SkrUser;
import pers.niaonao.jdbcproject.service.SkrUserService;
import pers.niaonao.jdbcproject.util.GenerateIdUtil;
import pers.niaonao.jdbcproject.util.MD5Util; import java.util.List; /**
* @Author: niaonao
* @Date: Created in 16:29 2018/7/29
* @Desprition: 用户业务实现类
*/
@Service(value = "skrUserService")
public class SkrUserServiceImpl implements SkrUserService { @Autowired
private SkrUserDao skrUserDao; @Override
public ResultEntity getSkrUser(RequestEntity requestEntity) {
//解析请求数据
SkrUser user = JSONObject.parseObject(requestEntity.getTreasureData(), SkrUser.class); Boolean success = Boolean.FALSE;
String errorMsg = "获取用户信息成功!";
if (user == null){
errorMsg = "请求数据不能为空!";
} else {
//根据请求参数查询用户信息
user = skrUserDao.selectByParams(user);
if (user == null){
errorMsg = "用户信息不存在!";
} else {
success = Boolean.TRUE;
}
} //封装返回结果
ResultEntity resultEntity = new ResultEntity(success,errorMsg,user);
return resultEntity;
} @Override
public ResultEntity getSkrUserList(RequestEntity requestEntity) {
//解析请求数据
SkrUser user = JSONObject.parseObject(requestEntity.getTreasureData(), SkrUser.class);
if (user == null){
user = new SkrUser();
} //获取用户信息集合
List<SkrUser> userList = skrUserDao.getList(user); //初始化执行结果
Boolean success = Boolean.TRUE;
String errorMsg = "获取用户信息成功!";
if (userList == null) {
success = Boolean.FALSE;
errorMsg = "用户信息不存在!!";
} //封装返回结果
ResultEntity resultEntity = new ResultEntity(success,errorMsg,userList);
return resultEntity;
} @Override
public ResultEntity updateSkrUser(RequestEntity requestEntity) {
//解析请求数据
SkrUser user = JSONObject.parseObject(requestEntity.getTreasureData(), SkrUser.class); Boolean success = Boolean.FALSE;
String errorMsg = "更新用户信息成功!";
if (user == null){
errorMsg = "请求数据不能为空!";
} else if (user.getUserId() == null || user.getUserId().equals("")){
errorMsg = "用户编号不能为空!";
} else {
//更新用户信息
int resultRow = skrUserDao.updateByIdSelective(user);
if (resultRow < 1){
errorMsg = "更新用户失败!";
}else {
success = Boolean.TRUE;
}
} //封装返回结果
ResultEntity resultEntity = new ResultEntity(success, errorMsg, null);
return resultEntity;
} @Override
public ResultEntity deleteSkrUser(RequestEntity requestEntity) { //解析请求数据
SkrUser user = JSONObject.parseObject(requestEntity.getTreasureData(), SkrUser.class); Boolean success = Boolean.FALSE;
String errorMsg = "用户删除成功!";
if (user == null){
errorMsg = "请求数据不能为空!";
} else if (user.getUserId() == null || user.getUserId().equals("")){
errorMsg = "用户编号不能为空!";
} else {
//删除用户信息
int resultRow = skrUserDao.deleteById(user);
if (resultRow < 1){
errorMsg = "删除用户失败!";
}else {
success = Boolean.TRUE;
}
} //封装返回结果
ResultEntity resultEntity = new ResultEntity(success, errorMsg, null);
return resultEntity;
} @Override
public ResultEntity addSkrUser(RequestEntity requestEntity) { //解析请求数据
SkrUser user = JSONObject.parseObject(requestEntity.getTreasureData(), SkrUser.class); Boolean success = Boolean.FALSE;
String errorMsg = "添加用户成功!";
if (user == null){
errorMsg = "请求数据不能为空!";
} else if (user.getUserNickName() == null || user.getUserPassword() == null
|| user.getUserNickName().equals("") || user.getUserPassword().equals("")){
errorMsg = "用户名和密码不能为空!";
} else {
//生成id,此处参数自定义,作为数据表标识。此处以1234 标识skr_user
user.setUserId(GenerateIdUtil.generateId("1234"));
//登录密码加密
user.setUserPassword(MD5Util.getMD5(user.getUserPassword())); //插入用户信息
int resultRow = skrUserDao.insertBySelective(user);
if (resultRow < 1){
errorMsg = "添加用户失败!";
}else {
success = Boolean.TRUE;
}
} //封装返回结果
ResultEntity resultEntity = new ResultEntity(success, errorMsg, null);
return resultEntity;
}
}
至此基本的业务逻辑和数据库交互开发完成。
四、后端项目对外接口开发
后端项目通过控制层Controller 来处理前端发出的请求。在控制层调用业务层Service ,具体的业务逻辑代码编写工作在业务层实现。
此处在包web 下新建用户控制类AppUserController.java 来响应前端请求。
package pers.niaonao.jdbcproject.web; import org.springframework.web.bind.annotation.*;
import pers.niaonao.jdbcproject.entity.RequestEntity;
import pers.niaonao.jdbcproject.entity.ResultEntity;
import pers.niaonao.jdbcproject.service.SkrUserService; import javax.annotation.Resource; /**
* @Author: niaonao
* @Date: Created in 16:27 2018/7/29
* @Desprition: 前端访问接口的控制类
*/
@RestController
@RequestMapping(value = "/app")
public class AppUserController { @Resource
private SkrUserService skrUserService; /**
* 获取用户信息列表
* 多条件模糊查询
* @return
*/
@ResponseBody
@PostMapping(value = "/user/getAllSkrUser", produces ="application/json;charset=UTF-8" )
public ResultEntity getSkrUserList(@RequestBody RequestEntity requestEntity) {
return skrUserService.getSkrUserList(requestEntity);
} /**
* 获取用户
* @param requestEntity
* @return
*/
@ResponseBody
@PostMapping(value = "/user/getSkrUser", produces ="application/json;charset=UTF-8" )
public ResultEntity getSkrUser(@RequestBody RequestEntity requestEntity) {
return skrUserService.getSkrUser(requestEntity);
} /**
* 更新用户
* @param requestEntity
* @return
*/
@ResponseBody
@PostMapping(value = "/user/updateSkrUser", produces ="application/json;charset=UTF-8" )
public ResultEntity updateSkrUser(@RequestBody RequestEntity requestEntity) {
return skrUserService.updateSkrUser(requestEntity);
} /**
* 注册用户
* @param requestEntity
* @return
*/
@ResponseBody
@PostMapping(value = "/user/registerSkrUser", produces ="application/json;charset=UTF-8" )
public ResultEntity addSkrUser(@RequestBody RequestEntity requestEntity) {
return skrUserService.addSkrUser(requestEntity);
} /**
* 删除用户
* @param requestEntity
* @return
*/
@ResponseBody
@PostMapping(value = "/user/deleteSkrUser", produces ="application/json;charset=UTF-8" )
public ResultEntity deleteSkrUser(@RequestBody RequestEntity requestEntity) {
return skrUserService.deleteSkrUser(requestEntity);
} }
项目最终结构图如下:
图4-1、项目完成结构图
五、后端开发项目测试
此处使用接口测试工具Postman 进行测试项目JdbcProject。快捷键Shift + Alt + D 运行项目。打开Postman 新建测试数据测试截图如下。以上五个接口均已测试通过。以注册用户接口为例。
- 项目运行端口8082
- 请求方式为Post
- 请求数据类型为JSON 类型
测试请求数据格式如下:
{
"treasureData":"{\"userPassword\":\"yixiaochuan\",\"userNickName\":\"lvsu\",\"userRealName\":\"吕素\",\"userAddress\":\"秦朝单父县\",\"userGender\":\"1\"}"
}
图5-1、用户注册测试图
Spring Boot 整合JDBC 实现后端项目开发的更多相关文章
- Spring Boot微服务电商项目开发实战 --- 基础配置及搭建
根据SpringBoot实现分布式微服务项目近两年的开发经验,今天决定开始做SpringBoot实现分布式微服务项目的系列文章,帮助其他正在使用或计划使用SringBoot开发的小伙伴们.本次系列文章 ...
- Spring Boot微服务电商项目开发实战 --- 多环境部署配置、端口号统一配置及Dubbo提供者消费者实现
昨天已经搭建好了SpringBoot基于Maven的基础父子级项目,今天开始进入项目分模块及分布式实现.首先我们基于昨天的项目,在父级工程下建lyn-sys,lyn-customer,lyn-good ...
- Spring Boot微服务电商项目开发实战 --- 分布式开发要避的那些坑
今天已经进入第七讲了,整个微服务架构的搭建工作也基本完成.那到目前为止究竟使用了那些技术及实现了什么功能呢?我们先回顾一下. 使用的技术:SpringBoot.Dubbo.Zookeeper.Redi ...
- Spring Boot整合MyBatis(非注解版)
Spring Boot整合MyBatis(非注解版),开发时采用的时IDEA,JDK1.8 直接上图: 文件夹不存在,创建一个新的路径文件夹 创建完成目录结构如下: 本人第一步习惯先把需要的包结构创建 ...
- 【Spring Boot学习之三】Spring Boot整合数据源
环境 eclipse 4.7 jdk 1.8 Spring Boot 1.5.2 一.Spring Boot整合Spring JDBC 1.pom.xml <project xmlns=&quo ...
- 《Spring Boot 入门及前后端分离项目实践》系列介绍
课程计划 课程地址点这里 本课程是一个 Spring Boot 技术栈的实战类课程,课程共分为 3 个部分,前面两个部分为基础环境准备和相关概念介绍,第三个部分是 Spring Boot 项目实践开发 ...
- 《Spring Boot 入门及前后端分离项目实践》目录
开篇词:SpringBoot入门及前后端分离项目实践导读 第02课:快速认识 Spring Boot 技术栈 第03课:开发环境搭建 第04课:快速构建 Spring Boot 应用 第05课:Spr ...
- Spring Boot 项目学习 (四) Spring Boot整合Swagger2自动生成API文档
0 引言 在做服务端开发的时候,难免会涉及到API 接口文档的编写,可以经历过手写API 文档的过程,就会发现,一个自动生成API文档可以提高多少的效率. 以下列举几个手写API 文档的痛点: 文档需 ...
- 使用Spring boot整合Hive,在启动Spring boot项目时,报错
使用Spring boot整合Hive,在启动Spring boot项目时,报出异常: java.lang.NoSuchMethodError: org.eclipse.jetty.servlet.S ...
随机推荐
- css 尾巴
用border制作三角形 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- 使用Consul做服务发现的若干姿势
从2016年起就开始接触Consul,使用的主要目的就是做服务发现,后来逐步应用于生产环境,并总结了少许使用经验.最开始使用Consul的人不多,为了方便交流创建了一个QQ群,这两年微服务越来越火,使 ...
- Java中的集合框架-Collections和Arrays
上一篇<Java中的集合框架-Map>把集合框架中的键值对容器Map中常用的知识记录了一下,本节记录一下集合框架的两个工具类Collections和Arrays 一,Collections ...
- 【Python】01 - 常见用法随见随梳理
1. range() 和 xrange()的区别 for x in range(5): print x for x in xrange(5): print x 这么看,range和xrange返回的值 ...
- 在TextBrowser显示中,如何让最新的数据永远出现在第一行或者是在窗口的最后显示信息
这是第一行,但是随着数据的增多,最新的数据就会在末尾显示,然后就看不到了.可以用 main_ui->ReceiveDatatextBrowser->insertPlainText(strD ...
- S/4 HANA中发票输出切换回NAST
在S/4 HANA中,新的输出管理Output Management叫做SAP S/4HANA output control(输出控制),是基于BRF+的,而不是原来基于NAST的.关于S4新的输出控 ...
- Excel工作表保护的密码破解与清除...假装自己破解密码系列?
有一次我女朋友让我帮忙解一个excel表格的保护密码,然后~用了宏 网上下载来的Excel经常会有工作表保护,也就是无法修改,妄图做任何修改的时候你就会看见这句话: 您试图更改的单元格或图表位于受保护 ...
- HTML标签速记整理W3C
标题 <h1>段落<p>链接< href="">图像<img src="">自关闭元素,不需要结束标记换行标志& ...
- JanusGraph 图数据库安装小记 ——以 JanusGraph 0.3.0 为例
由于近期项目中有使用图数据的需求,经过对比,我们选择尝试使用 JanusGraph.本篇小记记录了我们安装 JanusGraph 以及需要一起集成的 Cassandra + Elasticsearch ...
- PHP 好用第三方库
PHP 好用第三方库 whoops 更好的php错误报告库 [github]:https://github.com/filp/whoops Whoops是一个易于处理和调试错误的PHP库 .它提供基于 ...