diff --git a/spring-boot-demo-orm-jdbctemplate/README.md b/spring-boot-demo-orm-jdbctemplate/README.md
index acc7257..26578b3 100644
--- a/spring-boot-demo-orm-jdbctemplate/README.md
+++ b/spring-boot-demo-orm-jdbctemplate/README.md
@@ -1,2 +1,359 @@
# spring-boot-demo-orm-jdbctemplate
-> 本 demo 主要演示了Spring Boot如何使用 JdbcTemplate 操作数据库,并且简易地封装了一个通用的 Dao 层。
\ No newline at end of file
+> 本 demo 主要演示了Spring Boot如何使用 JdbcTemplate 操作数据库,并且简易地封装了一个通用的 Dao 层,包括增删改查。
+
+## pom.xml
+
+```xml
+
+
+ 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
+
+
+
+
+
+```
+
+## BaseDao.java
+
+```java
+package com.xkcoding.orm.jdbctemplate.dao.base;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.Dict;
+import cn.hutool.core.util.ArrayUtil;
+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.Column;
+import com.xkcoding.orm.jdbctemplate.annotation.Ignore;
+import com.xkcoding.orm.jdbctemplate.annotation.Pk;
+import com.xkcoding.orm.jdbctemplate.annotation.Table;
+import com.xkcoding.orm.jdbctemplate.constant.Const;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.RowMapper;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.ParameterizedType;
+import java.util.List;
+import java.util.Map;
+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;
+ private Class clazz;
+
+ @SuppressWarnings(value = "unchecked")
+ public BaseDao(JdbcTemplate jdbcTemplate) {
+ this.jdbcTemplate = jdbcTemplate;
+ clazz = (Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
+ }
+
+ /**
+ * 通用插入,自增列需要添加 {@link Pk} 注解
+ *
+ * @param t 对象
+ * @param ignoreNull 是否忽略 null 值
+ * @return 操作的行数
+ */
+ protected Integer insert(T t, Boolean ignoreNull) {
+ String table = getTableName(t);
+
+ List filterField = getField(t, ignoreNull);
+
+ List columnList = getColumns(filterField);
+
+ String columns = StrUtil.join(Const.SEPARATOR_COMMA, columnList);
+
+ // 构造占位符
+ String params = StrUtil.repeatAndJoin("?", columnList.size(), Const.SEPARATOR_COMMA);
+
+ // 构造值
+ 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);
+ }
+
+ /**
+ * 通用根据主键删除
+ *
+ * @param pk 主键
+ * @return 影响行数
+ */
+ protected Integer deleteById(P pk) {
+ String tableName = getTableName();
+ String sql = StrUtil.format("DELETE FROM {table} where id = ?", Dict.create().set("table", tableName));
+ log.debug("【执行SQL】SQL:{}", sql);
+ log.debug("【执行SQL】参数:{}", JSONUtil.toJsonStr(pk));
+ return jdbcTemplate.update(sql, pk);
+ }
+
+ /**
+ * 通用根据主键更新,自增列需要添加 {@link Pk} 注解
+ *
+ * @param t 对象
+ * @param pk 主键
+ * @param ignoreNull 是否忽略 null 值
+ * @return 操作的行数
+ */
+ protected Integer updateById(T t, P pk, Boolean ignoreNull) {
+ String tableName = getTableName(t);
+
+ List filterField = getField(t, ignoreNull);
+
+ List columnList = getColumns(filterField);
+
+ List columns = columnList.stream().map(s -> StrUtil.appendIfMissing(s, " = ?")).collect(Collectors.toList());
+ String params = StrUtil.join(Const.SEPARATOR_COMMA, columns);
+
+ // 构造值
+ List