diff --git a/pom.xml b/pom.xml
index 46a5c15..52f4edc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -2,110 +2,116 @@
+ * 启动类 + *
+ * + * @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+ * 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+ * 用户实体类 + *
+ * + * @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 系列示例表';