From 7fe5bf631d529e9bcac6497ad11213b76d546ed5 Mon Sep 17 00:00:00 2001 From: "Yangkai.Shen" <237497819@qq.com> Date: Mon, 15 Oct 2018 14:36:59 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E9=9B=86=E6=88=90=20Jdbc=20Templa?= =?UTF-8?q?te=EF=BC=8C=E5=B9=B6=E7=AE=80=E6=98=93=E5=B0=81=E8=A3=85?= =?UTF-8?q?=E9=80=9A=E7=94=A8=20Dao=20=E5=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 208 +++++++++--------- spring-boot-demo-orm-jdbctemplate/README.md | 2 + spring-boot-demo-orm-jdbctemplate/pom.xml | 112 ++++++---- ...ingBootDemoOrmJdbctemplateApplication.java | 21 +- .../orm/jdbctemplate/annotation/Auto.java | 24 ++ .../orm/jdbctemplate/annotation/Column.java | 30 +++ .../orm/jdbctemplate/annotation/Ignore.java | 24 ++ .../orm/jdbctemplate/annotation/Table.java | 30 +++ .../orm/jdbctemplate/constant/Const.java | 18 ++ .../controller/UserController.java | 40 ++++ .../orm/jdbctemplate/dao/UserDao.java | 39 ++++ .../orm/jdbctemplate/dao/base/BaseDao.java | 97 ++++++++ .../orm/jdbctemplate/entity/User.java | 81 +++++++ .../jdbctemplate/service/IUserService.java | 26 +++ .../service/impl/UserServiceImpl.java | 49 +++++ .../src/main/resources/application.yml | 29 +++ .../src/main/resources/db/data.sql | 2 + .../src/main/resources/db/schema.sql | 13 ++ 18 files changed, 693 insertions(+), 152 deletions(-) create mode 100644 spring-boot-demo-orm-jdbctemplate/README.md create mode 100644 spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/annotation/Auto.java create mode 100644 spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/annotation/Column.java create mode 100644 spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/annotation/Ignore.java create mode 100644 spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/annotation/Table.java create mode 100644 spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/constant/Const.java create mode 100644 spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/controller/UserController.java create mode 100644 spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/dao/UserDao.java create mode 100644 spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/dao/base/BaseDao.java create mode 100644 spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/entity/User.java create mode 100644 spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/service/IUserService.java create mode 100644 spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/service/impl/UserServiceImpl.java create mode 100644 spring-boot-demo-orm-jdbctemplate/src/main/resources/db/data.sql create mode 100644 spring-boot-demo-orm-jdbctemplate/src/main/resources/db/schema.sql diff --git a/pom.xml b/pom.xml index 46a5c15..52f4edc 100644 --- a/pom.xml +++ b/pom.xml @@ -2,110 +2,116 @@ - 4.0.0 + 4.0.0 - com.xkcoding - spring-boot-demo - 0.0.1-SNAPSHOT - - spring-boot-demo-helloworld - spring-boot-demo-properties - spring-boot-demo-actuator - spring-boot-demo-admin-client - spring-boot-demo-admin-server - spring-boot-demo-logback - spring-boot-demo-log-aop - spring-boot-demo-exception-handler - spring-boot-demo-template-freemarker - spring-boot-demo-template-thymeleaf - spring-boot-demo-template-beetl - spring-boot-demo-template-enjoy - spring-boot-demo-orm-jdbctemplate - - pom + com.xkcoding + spring-boot-demo + 0.0.1-SNAPSHOT + + spring-boot-demo-helloworld + spring-boot-demo-properties + spring-boot-demo-actuator + spring-boot-demo-admin-client + spring-boot-demo-admin-server + spring-boot-demo-logback + spring-boot-demo-log-aop + spring-boot-demo-exception-handler + spring-boot-demo-template-freemarker + spring-boot-demo-template-thymeleaf + spring-boot-demo-template-beetl + spring-boot-demo-template-enjoy + spring-boot-demo-orm-jdbctemplate + + pom - spring-boot-demo - http://xkcoding.com + spring-boot-demo + http://xkcoding.com - - UTF-8 - UTF-8 - 1.8 - 1.8 - 1.8 - 2.0.5.RELEASE - 4.1.17 - 1.20 - + + UTF-8 + UTF-8 + 1.8 + 1.8 + 1.8 + 2.0.5.RELEASE + 8.0.12 + 4.1.17 + 1.20 + - - - - org.springframework.boot - spring-boot-dependencies - ${spring.boot.version} - pom - import - - - - cn.hutool - hutool-all - ${hutool.version} - - - - eu.bitwalker - UserAgentUtils - ${user.agent.version} - - - + + + + org.springframework.boot + spring-boot-dependencies + ${spring.boot.version} + pom + import + + + mysql + mysql-connector-java + ${mysql.version} + + + + cn.hutool + hutool-all + ${hutool.version} + + + + eu.bitwalker + UserAgentUtils + ${user.agent.version} + + + - - - - - maven-clean-plugin - 3.0.0 - - - maven-resources-plugin - 3.0.2 - - - maven-compiler-plugin - 3.7.0 - - - maven-surefire-plugin - 2.20.1 - - - maven-jar-plugin - 3.0.2 - - - maven-install-plugin - 2.5.2 - - - maven-deploy-plugin - 2.8.2 - - - org.springframework.boot - spring-boot-maven-plugin - ${spring.boot.version} - - - - repackage - - - - - - - + + + + + maven-clean-plugin + 3.0.0 + + + maven-resources-plugin + 3.0.2 + + + maven-compiler-plugin + 3.7.0 + + + maven-surefire-plugin + 2.20.1 + + + maven-jar-plugin + 3.0.2 + + + maven-install-plugin + 2.5.2 + + + maven-deploy-plugin + 2.8.2 + + + org.springframework.boot + spring-boot-maven-plugin + ${spring.boot.version} + + + + repackage + + + + + + + \ No newline at end of file diff --git a/spring-boot-demo-orm-jdbctemplate/README.md b/spring-boot-demo-orm-jdbctemplate/README.md new file mode 100644 index 0000000..acc7257 --- /dev/null +++ b/spring-boot-demo-orm-jdbctemplate/README.md @@ -0,0 +1,2 @@ +# spring-boot-demo-orm-jdbctemplate +> 本 demo 主要演示了Spring Boot如何使用 JdbcTemplate 操作数据库,并且简易地封装了一个通用的 Dao 层。 \ No newline at end of file diff --git a/spring-boot-demo-orm-jdbctemplate/pom.xml b/spring-boot-demo-orm-jdbctemplate/pom.xml index a0df7e4..102eae2 100644 --- a/spring-boot-demo-orm-jdbctemplate/pom.xml +++ b/spring-boot-demo-orm-jdbctemplate/pom.xml @@ -1,53 +1,69 @@ - 4.0.0 - - spring-boot-demo-orm-jdbctemplate - 0.0.1-SNAPSHOT - jar - - spring-boot-demo-orm-jdbctemplate - Demo project for Spring Boot - - - com.xkcoding - spring-boot-demo - 0.0.1-SNAPSHOT - - - - UTF-8 - UTF-8 - 1.8 - - - - - org.springframework.boot - spring-boot-starter-jdbc - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - spring-boot-demo-orm-jdbctemplate - - - org.springframework.boot - spring-boot-maven-plugin - - - + 4.0.0 + + spring-boot-demo-orm-jdbctemplate + 0.0.1-SNAPSHOT + jar + + spring-boot-demo-orm-jdbctemplate + Demo project for Spring Boot + + + com.xkcoding + spring-boot-demo + 0.0.1-SNAPSHOT + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + mysql + mysql-connector-java + + + + cn.hutool + hutool-all + + + + org.projectlombok + lombok + true + + + + + spring-boot-demo-orm-jdbctemplate + + + org.springframework.boot + spring-boot-maven-plugin + + + diff --git a/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/SpringBootDemoOrmJdbctemplateApplication.java b/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/SpringBootDemoOrmJdbctemplateApplication.java index 1a2aa24..ab0d2c5 100644 --- a/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/SpringBootDemoOrmJdbctemplateApplication.java +++ b/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/SpringBootDemoOrmJdbctemplateApplication.java @@ -1,12 +1,27 @@ package com.xkcoding.orm.jdbctemplate; +import cn.hutool.core.util.IdUtil; +import cn.hutool.crypto.SecureUtil; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +/** + *

+ * 启动类 + *

+ * + * @package: com.xkcoding.orm.jdbctemplate + * @description: 启动类 + * @author: yangkai.shen + * @date: Created in 2018/10/15 9:50 AM + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ @SpringBootApplication public class SpringBootDemoOrmJdbctemplateApplication { - public static void main(String[] args) { - SpringApplication.run(SpringBootDemoOrmJdbctemplateApplication.class, args); - } + public static void main(String[] args) { + SpringApplication.run(SpringBootDemoOrmJdbctemplateApplication.class, args); + } } diff --git a/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/annotation/Auto.java b/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/annotation/Auto.java new file mode 100644 index 0000000..2f71566 --- /dev/null +++ b/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/annotation/Auto.java @@ -0,0 +1,24 @@ +package com.xkcoding.orm.jdbctemplate.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + *

+ * 自增列注解 + *

+ * + * @package: com.xkcoding.orm.jdbctemplate.annotation + * @description: 自增列注解 + * @author: yangkai.shen + * @date: Created in 2018/10/15 11:23 AM + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD}) +public @interface Auto { +} diff --git a/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/annotation/Column.java b/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/annotation/Column.java new file mode 100644 index 0000000..4dd5245 --- /dev/null +++ b/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/annotation/Column.java @@ -0,0 +1,30 @@ +package com.xkcoding.orm.jdbctemplate.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + *

+ * 列注解 + *

+ * + * @package: com.xkcoding.orm.jdbctemplate.annotation + * @description: 列注解 + * @author: yangkai.shen + * @date: Created in 2018/10/15 11:23 AM + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD}) +public @interface Column { + /** + * 列名 + * + * @return 列名 + */ + String name(); +} diff --git a/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/annotation/Ignore.java b/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/annotation/Ignore.java new file mode 100644 index 0000000..7a84f3d --- /dev/null +++ b/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/annotation/Ignore.java @@ -0,0 +1,24 @@ +package com.xkcoding.orm.jdbctemplate.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + *

+ * 需要忽略的字段 + *

+ * + * @package: com.xkcoding.orm.jdbctemplate.annotation + * @description: 需要忽略的字段 + * @author: yangkai.shen + * @date: Created in 2018/10/15 1:25 PM + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD}) +public @interface Ignore { +} diff --git a/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/annotation/Table.java b/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/annotation/Table.java new file mode 100644 index 0000000..b509548 --- /dev/null +++ b/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/annotation/Table.java @@ -0,0 +1,30 @@ +package com.xkcoding.orm.jdbctemplate.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + *

+ * 表注解 + *

+ * + * @package: com.xkcoding.orm.jdbctemplate.annotation + * @description: 表注解 + * @author: yangkai.shen + * @date: Created in 2018/10/15 11:23 AM + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE}) +public @interface Table { + /** + * 表名 + * + * @return 表名 + */ + String name(); +} diff --git a/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/constant/Const.java b/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/constant/Const.java new file mode 100644 index 0000000..8d4881d --- /dev/null +++ b/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/constant/Const.java @@ -0,0 +1,18 @@ +package com.xkcoding.orm.jdbctemplate.constant; + +/** + *

+ * 常量池 + *

+ * + * @package: com.xkcoding.orm.jdbctemplate.constant + * @description: 常量池 + * @author: yangkai.shen + * @date: Created in 2018/10/15 10:59 AM + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +public interface Const { + String SALT_PREFIX = "::SpringBootDemo::"; +} diff --git a/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/controller/UserController.java b/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/controller/UserController.java new file mode 100644 index 0000000..72829bb --- /dev/null +++ b/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/controller/UserController.java @@ -0,0 +1,40 @@ +package com.xkcoding.orm.jdbctemplate.controller; + +import cn.hutool.core.lang.Dict; +import com.xkcoding.orm.jdbctemplate.entity.User; +import com.xkcoding.orm.jdbctemplate.service.IUserService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * User Controller + *

+ * + * @package: com.xkcoding.orm.jdbctemplate.controller + * @description: User Controller + * @author: yangkai.shen + * @date: Created in 2018/10/15 1:58 PM + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@RestController +@Slf4j +public class UserController { + private final IUserService userService; + + @Autowired + public UserController(IUserService userService) { + this.userService = userService; + } + + @PostMapping("/user") + public Dict save(@RequestBody User user) { + Boolean save = userService.save(user); + return Dict.create().set("code", save ? 200 : 500).set("msg", save ? "成功" : "失败").set("data", save ? user : null); + } +} diff --git a/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/dao/UserDao.java b/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/dao/UserDao.java new file mode 100644 index 0000000..a114008 --- /dev/null +++ b/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/dao/UserDao.java @@ -0,0 +1,39 @@ +package com.xkcoding.orm.jdbctemplate.dao; + +import com.xkcoding.orm.jdbctemplate.dao.base.BaseDao; +import com.xkcoding.orm.jdbctemplate.entity.User; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +/** + *

+ * User Dao + *

+ * + * @package: com.xkcoding.orm.jdbctemplate.dao + * @description: User Dao + * @author: yangkai.shen + * @date: Created in 2018/10/15 11:15 AM + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Repository +public class UserDao extends BaseDao { + + @Autowired + public UserDao(JdbcTemplate jdbcTemplate) { + super(jdbcTemplate); + } + + /** + * 保存用户 + * + * @param user 用户对象 + * @return 操作影响行数 + */ + public Integer insert(User user) { + return super.insert(user, true); + } +} diff --git a/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/dao/base/BaseDao.java b/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/dao/base/BaseDao.java new file mode 100644 index 0000000..f9e8dfc --- /dev/null +++ b/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/dao/base/BaseDao.java @@ -0,0 +1,97 @@ +package com.xkcoding.orm.jdbctemplate.dao.base; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Dict; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.xkcoding.orm.jdbctemplate.annotation.Auto; +import com.xkcoding.orm.jdbctemplate.annotation.Column; +import com.xkcoding.orm.jdbctemplate.annotation.Ignore; +import com.xkcoding.orm.jdbctemplate.annotation.Table; +import lombok.extern.slf4j.Slf4j; +import org.springframework.jdbc.core.JdbcTemplate; + +import java.lang.reflect.Field; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + *

+ * Dao基类 + *

+ * + * @package: com.xkcoding.orm.jdbctemplate.dao.base + * @description: Dao基类 + * @author: yangkai.shen + * @date: Created in 2018/10/15 11:28 AM + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Slf4j +public class BaseDao { + private JdbcTemplate jdbcTemplate; + + public BaseDao(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + /** + * 通用插入 + * + * @param t 对象 + * @param ignoreNull 是否忽略 null 值 + * @return 操作的行数 + */ + public Integer insert(T t, Boolean ignoreNull) { + Table tableAnnotation = t.getClass().getAnnotation(Table.class); + String table; + if (ObjectUtil.isNotNull(tableAnnotation)) { + table = tableAnnotation.name(); + } else { + table = t.getClass().getName().toLowerCase(); + } + + // 获取所有字段,包含父类中的字段 + Field[] fields = ReflectUtil.getFields(t.getClass()); + + // 过滤数据库中不存在的字段,以及自增列 + List filterField; + Stream fieldStream = CollUtil.toList(fields).stream().filter(field -> ObjectUtil.isNull(field.getAnnotation(Ignore.class)) || ObjectUtil.isNull(field.getAnnotation(Auto.class))); + + // 是否过滤字段值为null的字段 + if (ignoreNull) { + filterField = fieldStream.filter(field -> ObjectUtil.isNotNull(ReflectUtil.getFieldValue(t, field))).collect(Collectors.toList()); + } else { + filterField = fieldStream.collect(Collectors.toList()); + } + + // 构造列 + List columnList = CollUtil.newArrayList(); + for (Field field : filterField) { + Column columnAnnotation = field.getAnnotation(Column.class); + String columnName; + if (ObjectUtil.isNotNull(columnAnnotation)) { + columnName = columnAnnotation.name(); + } else { + columnName = field.getName(); + } + columnList.add(StrUtil.format("`{}`", columnName)); + } + String columns = StrUtil.join(",", columnList); + + // 构造占位符 + String params = StrUtil.repeatAndJoin("?", columnList.size(), ","); + + // 构造值 + Object[] values = filterField.stream().map(field -> ReflectUtil.getFieldValue(t, field)).toArray(); + + String sql = StrUtil.format("INSERT INTO `{table}`({columns}) VALUES ({params})", Dict.create().set("table", table).set("columns", columns).set("params", params)); + log.debug("【执行SQL】SQL:{}", sql); + log.debug("【执行SQL】参数:{}", JSONUtil.toJsonStr(values)); + return jdbcTemplate.update(sql, values); + } +} diff --git a/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/entity/User.java b/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/entity/User.java new file mode 100644 index 0000000..1dfe56b --- /dev/null +++ b/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/entity/User.java @@ -0,0 +1,81 @@ +package com.xkcoding.orm.jdbctemplate.entity; + +import com.xkcoding.orm.jdbctemplate.annotation.Auto; +import com.xkcoding.orm.jdbctemplate.annotation.Column; +import com.xkcoding.orm.jdbctemplate.annotation.Table; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 用户实体类 + *

+ * + * @package: com.xkcoding.orm.jdbctemplate.entity + * @description: 用户实体类 + * @author: yangkai.shen + * @date: Created in 2018/10/15 10:45 AM + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Data +@Table(name = "orm_user") +public class User implements Serializable { + /** + * 主键 + */ + @Auto + private Long id; + + /** + * 用户名 + */ + private String name; + + /** + * 加密后的密码 + */ + private String password; + + /** + * 加密使用的盐 + */ + private String salt; + + /** + * 邮箱 + */ + private String email; + + /** + * 手机号码 + */ + @Column(name = "phone_number") + private String phoneNumber; + + /** + * 状态,-1:逻辑删除,0:禁用,1:启用 + */ + private Integer status; + + /** + * 创建时间 + */ + @Column(name = "create_time") + private Date createTime; + + /** + * 上次登录时间 + */ + @Column(name = "last_login_time") + private Date lastLoginTime; + + /** + * 上次更新时间 + */ + @Column(name = "last_update_time") + private Date lastUpdateTime; +} diff --git a/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/service/IUserService.java b/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/service/IUserService.java new file mode 100644 index 0000000..332e4cf --- /dev/null +++ b/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/service/IUserService.java @@ -0,0 +1,26 @@ +package com.xkcoding.orm.jdbctemplate.service; + +import com.xkcoding.orm.jdbctemplate.entity.User; + +/** + *

+ * User Service + *

+ * + * @package: com.xkcoding.orm.jdbctemplate.service + * @description: User Service + * @author: yangkai.shen + * @date: Created in 2018/10/15 1:51 PM + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +public interface IUserService { + /** + * 保存用户 + * + * @param user 用户实体 + * @return 保存成功 {@code true} 保存失败 {@code false} + */ + Boolean save(User user); +} diff --git a/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/service/impl/UserServiceImpl.java b/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..3163870 --- /dev/null +++ b/spring-boot-demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/service/impl/UserServiceImpl.java @@ -0,0 +1,49 @@ +package com.xkcoding.orm.jdbctemplate.service.impl; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.crypto.SecureUtil; +import com.xkcoding.orm.jdbctemplate.constant.Const; +import com.xkcoding.orm.jdbctemplate.dao.UserDao; +import com.xkcoding.orm.jdbctemplate.entity.User; +import com.xkcoding.orm.jdbctemplate.service.IUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + *

+ * User Service Implement + *

+ * + * @package: com.xkcoding.orm.jdbctemplate.service.impl + * @description: User Service Implement + * @author: yangkai.shen + * @date: Created in 2018/10/15 1:53 PM + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Service +public class UserServiceImpl implements IUserService { + private final UserDao userDao; + + @Autowired + public UserServiceImpl(UserDao userDao) { + this.userDao = userDao; + } + + /** + * 保存用户 + * + * @param user 用户实体 + * @return 保存成功 {@code true} 保存失败 {@code false} + */ + @Override + public Boolean save(User user) { + String rawPass = user.getPassword(); + String salt = IdUtil.simpleUUID(); + String pass = SecureUtil.md5(rawPass+ Const.SALT_PREFIX+salt); + user.setPassword(pass); + user.setSalt(salt); + return userDao.insert(user) > 0; + } +} diff --git a/spring-boot-demo-orm-jdbctemplate/src/main/resources/application.yml b/spring-boot-demo-orm-jdbctemplate/src/main/resources/application.yml index e69de29..1577d7b 100644 --- a/spring-boot-demo-orm-jdbctemplate/src/main/resources/application.yml +++ b/spring-boot-demo-orm-jdbctemplate/src/main/resources/application.yml @@ -0,0 +1,29 @@ +server: + port: 8080 + servlet: + context-path: /demo +spring: + datasource: + url: jdbc:mysql://127.0.0.1:3306/spring-boot-demo?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT%2B8 + username: root + password: root + driver-class-name: com.mysql.cj.jdbc.Driver + type: com.zaxxer.hikari.HikariDataSource + initialization-mode: always + continue-on-error: true + schema: + - "classpath:db/schema.sql" + data: + - "classpath:db/data.sql" + hikari: + minimum-idle: 5 + connection-test-query: SELECT 1 FROM DUAL + maximum-pool-size: 20 + auto-commit: true + idle-timeout: 30000 + pool-name: SpringBootDemoHikariCP + max-lifetime: 60000 + connection-timeout: 30000 +logging: + level: + com.xkcoding: debug \ No newline at end of file diff --git a/spring-boot-demo-orm-jdbctemplate/src/main/resources/db/data.sql b/spring-boot-demo-orm-jdbctemplate/src/main/resources/db/data.sql new file mode 100644 index 0000000..3ab2b59 --- /dev/null +++ b/spring-boot-demo-orm-jdbctemplate/src/main/resources/db/data.sql @@ -0,0 +1,2 @@ +INSERT INTO `orm_user`(`id`,`name`,`password`,`salt`,`email`,`phone_number`) VALUES (1, 'user_1', 'ff342e862e7c3285cdc07e56d6b8973b', '412365a109674b2dbb1981ed561a4c70', 'user1@xkcoding.com', '17300000001'); +INSERT INTO `orm_user`(`id`,`name`,`password`,`salt`,`email`,`phone_number`) VALUES (2, 'user_2', '6c6bf02c8d5d3d128f34b1700cb1e32c', 'fcbdd0e8a9404a5585ea4e01d0e4d7a0', 'user2@xkcoding.com', '17300000002'); \ No newline at end of file diff --git a/spring-boot-demo-orm-jdbctemplate/src/main/resources/db/schema.sql b/spring-boot-demo-orm-jdbctemplate/src/main/resources/db/schema.sql new file mode 100644 index 0000000..22804e5 --- /dev/null +++ b/spring-boot-demo-orm-jdbctemplate/src/main/resources/db/schema.sql @@ -0,0 +1,13 @@ +DROP TABLE IF EXISTS `orm_user`; +CREATE TABLE `orm_user` ( + `id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主键', + `name` VARCHAR(32) NOT NULL UNIQUE COMMENT '用户名', + `password` VARCHAR(32) NOT NULL COMMENT '加密后的密码', + `salt` VARCHAR(32) NOT NULL COMMENT '加密使用的盐', + `email` VARCHAR(32) NOT NULL UNIQUE COMMENT '邮箱', + `phone_number` VARCHAR(15) NOT NULL UNIQUE COMMENT '手机号码', + `status` INT(2) NOT NULL DEFAULT 1 COMMENT '状态,-1:逻辑删除,0:禁用,1:启用', + `create_time` DATETIME NOT NULL DEFAULT NOW() COMMENT '创建时间', + `last_login_time` DATETIME DEFAULT NULL COMMENT '上次登录时间', + `last_update_time` DATETIME NOT NULL DEFAULT NOW() COMMENT '上次更新时间' +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Spring Boot Demo Orm 系列示例表';