@@ -0,0 +1,193 @@ | |||
# spring-boot-demo-orm-jdbctemplate | |||
依赖 [spring-boot-demo-parent](../spring-boot-demo-parent)、spring-boot-starter-jdbc | |||
## pom.xml | |||
```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> | |||
<artifactId>spring-boot-demo-orm-jdbctemplate</artifactId> | |||
<version>0.0.1-SNAPSHOT</version> | |||
<packaging>jar</packaging> | |||
<name>spring-boot-demo-orm-jdbctemplate</name> | |||
<description>Demo project for Spring Boot</description> | |||
<parent> | |||
<groupId>com.xkcoding</groupId> | |||
<artifactId>spring-boot-demo-parent</artifactId> | |||
<version>0.0.1-SNAPSHOT</version> | |||
<relativePath>../spring-boot-demo-parent/pom.xml</relativePath> | |||
</parent> | |||
<dependencies> | |||
<dependency> | |||
<groupId>org.springframework.boot</groupId> | |||
<artifactId>spring-boot-starter-jdbc</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>com.alibaba</groupId> | |||
<artifactId>druid-spring-boot-starter</artifactId> | |||
<version>1.1.9</version> | |||
</dependency> | |||
</dependencies> | |||
<build> | |||
<finalName>spring-boot-demo-orm-jdbctemplate</finalName> | |||
</build> | |||
</project> | |||
``` | |||
## application.yml | |||
```yaml | |||
server: | |||
port: 8080 | |||
context-path: /demo | |||
spring: | |||
datasource: | |||
# 启动时自动运行的 SQL 文件 | |||
schema: classpath:init-sql/schema.sql | |||
continue-on-error: true | |||
druid: | |||
url: jdbc:mysql://localhost:3306/spring-boot-demo?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false | |||
username: root | |||
password: root | |||
driver-class-name: com.mysql.jdbc.Driver | |||
# 连接池配置 | |||
# 初始化大小,最小,最大 | |||
initialSize: 5 | |||
minIdle: 5 | |||
maxActive: 20 | |||
# 配置获取连接等待超时的时间 | |||
maxWait: 60000 | |||
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 | |||
timeBetweenEvictionRunsMillis: 60000 | |||
# 配置一个连接在池中最小生存的时间,单位是毫秒 | |||
minEvictableIdleTimeMillis: 300000 | |||
validationQuery: SELECT 1 FROM DUAL | |||
testWhileIdle: true | |||
testOnBorrow: false | |||
testOnReturn: false | |||
# 打开PSCache,并且指定每个连接上PSCache的大小 | |||
poolPreparedStatements: true | |||
maxPoolPreparedStatementPerConnectionSize: 20 | |||
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 | |||
filters: stat,wall,log4j | |||
# 监控配置 | |||
web-stat-filter: | |||
enabled: true | |||
url-pattern: /* | |||
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" | |||
stat-view-servlet: | |||
enabled: true | |||
url-pattern: /sys/druid/* | |||
reset-enable: fasle | |||
login-username: xkcoding | |||
login-password: 123456 | |||
filter: | |||
stat: | |||
log-slow-sql: true | |||
slow-sql-millis: 5000 | |||
merge-sql: true | |||
``` | |||
## schema.sql | |||
```mysql | |||
SET FOREIGN_KEY_CHECKS=0; | |||
DROP TABLE IF EXISTS `jdbctemplate_user`; | |||
CREATE TABLE `jdbctemplate_user` ( | |||
`id` int(11) NOT NULL AUTO_INCREMENT, | |||
`name` varchar(32) DEFAULT NULL, | |||
`tel` varchar(11) DEFAULT NULL, | |||
`create_time` datetime DEFAULT NULL, | |||
PRIMARY KEY (`id`) | |||
) ENGINE=InnoDB DEFAULT CHARSET=utf8; | |||
INSERT INTO `jdbctemplate_user` VALUES (1, 'klay', '13799008800', '2017-11-13 16:04:39'); | |||
INSERT INTO `jdbctemplate_user` VALUES (2, 'Tome', '18988991234', '2017-11-13 16:13:28'); | |||
``` | |||
## UserServiceImpl.java | |||
```java | |||
/** | |||
* <p> | |||
* UserServiceImpl | |||
* </p> | |||
* | |||
* @package: com.xkcoding.springbootdemoormjdbctemplate.service.impl | |||
* @description: UserServiceImpl | |||
* @author: yangkai.shen | |||
* @date: Created in 2018/5/11 下午3:27 | |||
* @copyright: Copyright (c) 2018 | |||
* @version: V1.0 | |||
* @modified: yangkai.shen | |||
*/ | |||
@Service | |||
public class UserServiceImpl implements UserService { | |||
@Autowired | |||
private JdbcTemplate jdbcTemplate; | |||
@Override | |||
public Integer save(User user) { | |||
String sql = "INSERT INTO jdbctemplate_user (name,tel,create_time) VALUES(?,?,?)"; | |||
return jdbcTemplate.update(sql, user.getName(), user.getTel(), user.getCreateTime()); | |||
} | |||
@Override | |||
public Integer update(User user) { | |||
String sql = "UPDATE jdbctemplate_user SET name = ?,tel = ? where id = ?"; | |||
return jdbcTemplate.update(sql, user.getName(), user.getTel(), user.getId()); | |||
} | |||
@Override | |||
public Integer delete(User user) { | |||
String sql = "DELETE FROM jdbctemplate_user where id = ?"; | |||
return jdbcTemplate.update(sql, user.getId()); | |||
} | |||
@Override | |||
public User findById(Integer id) { | |||
String sql = "SELECT * FROM jdbctemplate_user where id = ?"; | |||
RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class); | |||
return jdbcTemplate.queryForObject(sql, new Object[]{id}, rowMapper); | |||
} | |||
@Override | |||
public User findByName(String name) { | |||
String sql = "SELECT * FROM jdbctemplate_user where name = ?"; | |||
RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class); | |||
return jdbcTemplate.queryForObject(sql, new Object[]{name}, rowMapper); | |||
} | |||
@Override | |||
public List<User> findAll() { | |||
String sql = "SELECT * FROM jdbctemplate_user"; | |||
List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql); | |||
List<User> ret = Lists.newArrayList(); | |||
maps.forEach(map -> ret.add(BeanUtil.fillBeanWithMap(map, new User(), true, false))); | |||
return ret; | |||
} | |||
@Override | |||
public List<User> findUserByPage(Integer pageNum, Integer pageSize) { | |||
String sql = "SELECT * FROM jdbctemplate_user LIMIT ?,?"; | |||
Integer offset = (pageNum - 1) * pageSize; | |||
List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql, new Object[]{offset, pageSize}); | |||
List<User> ret = Lists.newArrayList(); | |||
maps.forEach(map -> ret.add(BeanUtil.fillBeanWithMap(map, new User(), true, false))); | |||
return ret; | |||
} | |||
} | |||
``` | |||
## 其余代码 | |||
详情请参见本demo。 |
@@ -0,0 +1,36 @@ | |||
<?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> | |||
<artifactId>spring-boot-demo-orm-jdbctemplate</artifactId> | |||
<version>0.0.1-SNAPSHOT</version> | |||
<packaging>jar</packaging> | |||
<name>spring-boot-demo-orm-jdbctemplate</name> | |||
<description>Demo project for Spring Boot</description> | |||
<parent> | |||
<groupId>com.xkcoding</groupId> | |||
<artifactId>spring-boot-demo-parent</artifactId> | |||
<version>0.0.1-SNAPSHOT</version> | |||
<relativePath>../spring-boot-demo-parent/pom.xml</relativePath> | |||
</parent> | |||
<dependencies> | |||
<dependency> | |||
<groupId>org.springframework.boot</groupId> | |||
<artifactId>spring-boot-starter-jdbc</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>com.alibaba</groupId> | |||
<artifactId>druid-spring-boot-starter</artifactId> | |||
<version>1.1.9</version> | |||
</dependency> | |||
</dependencies> | |||
<build> | |||
<finalName>spring-boot-demo-orm-jdbctemplate</finalName> | |||
</build> | |||
</project> |
@@ -0,0 +1,12 @@ | |||
package com.xkcoding.springbootdemoormjdbctemplate; | |||
import org.springframework.boot.SpringApplication; | |||
import org.springframework.boot.autoconfigure.SpringBootApplication; | |||
@SpringBootApplication | |||
public class SpringBootDemoOrmJdbctemplateApplication { | |||
public static void main(String[] args) { | |||
SpringApplication.run(SpringBootDemoOrmJdbctemplateApplication.class, args); | |||
} | |||
} |
@@ -0,0 +1,94 @@ | |||
package com.xkcoding.springbootdemoormjdbctemplate.controller; | |||
import com.xiaoleilu.hutool.util.StrUtil; | |||
import com.xkcoding.springbootdemoormjdbctemplate.model.User; | |||
import com.xkcoding.springbootdemoormjdbctemplate.service.UserService; | |||
import com.xkcoding.springbootdemoormjdbctemplate.vo.R; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.web.bind.annotation.*; | |||
import java.util.Date; | |||
import java.util.List; | |||
/** | |||
* <p> | |||
* UserController | |||
* </p> | |||
* | |||
* @package: com.xkcoding.springbootdemoormjdbctemplate.controller | |||
* @description: UserController | |||
* @author: yangkai.shen | |||
* @date: Created in 2018/5/11 下午3:52 | |||
* @copyright: Copyright (c) 2018 | |||
* @version: V1.0 | |||
* @modified: yangkai.shen | |||
*/ | |||
@RestController | |||
@RequestMapping("/user") | |||
public class UserController { | |||
@Autowired | |||
private UserService userService; | |||
@GetMapping("/save") | |||
public R save() { | |||
User user = new User(); | |||
user.setName("xkcoding"); | |||
user.setTel("18600000000"); | |||
user.setCreateTime(new Date()); | |||
Integer save = userService.save(user); | |||
if (save > 0) { | |||
return R.builder().code(200).msg("添加成功").data(user).build(); | |||
} | |||
return R.builder().code(500).msg("添加失败").data(null).build(); | |||
} | |||
@GetMapping("/update") | |||
public R update() { | |||
User user = new User(); | |||
user.setId(2); | |||
user.setName(" 修改后的名字 "); | |||
user.setTel("17300000000"); | |||
Integer update = userService.update(user); | |||
if (update > 0) { | |||
return R.builder().code(200).msg("修改成功").data(userService.findById(2)).build(); | |||
} | |||
return R.builder().code(500).msg("修改失败").data(null).build(); | |||
} | |||
@GetMapping("/delete") | |||
public R delete() { | |||
User user = new User(); | |||
user.setId(1); | |||
Integer delete = userService.delete(user); | |||
if (delete > 0) { | |||
return R.builder().code(200).msg("删除成功").data(null).build(); | |||
} | |||
return R.builder().code(500).msg("删除失败").data(null).build(); | |||
} | |||
@GetMapping("/find/{id}") | |||
public R findById(@PathVariable Integer id) { | |||
User user = userService.findById(id); | |||
return R.builder().code(user == null ? 404 : 200).msg(user == null ? StrUtil.format("没有ID为{}的用户", id) : "查询成功").data(user).build(); | |||
} | |||
@GetMapping("/find") | |||
public R findByName(@RequestParam String name) { | |||
User user = userService.findByName(name); | |||
return R.builder().code(user == null ? 404 : 200).msg(user == null ? StrUtil.format("没有姓名为{}的用户", name) : "查询成功").data(user).build(); | |||
} | |||
@GetMapping({"", "/"}) | |||
public R findAll() { | |||
List<User> userList = userService.findAll(); | |||
return R.builder().code(userList.isEmpty() ? 404 : 200).msg(userList.isEmpty() ? "暂无用户" : "查询成功").data(userList).build(); | |||
} | |||
@GetMapping("/page") | |||
public R findByPage(@RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "5") Integer pageSize) { | |||
List<User> userList = userService.findUserByPage(pageNum, pageSize); | |||
return R.builder().code(userList.isEmpty() ? 404 : 200).msg(userList.isEmpty() ? "暂无用户" : "查询成功").data(userList).build(); | |||
} | |||
} |
@@ -0,0 +1,27 @@ | |||
package com.xkcoding.springbootdemoormjdbctemplate.model; | |||
import lombok.Data; | |||
import java.io.Serializable; | |||
import java.util.Date; | |||
/** | |||
* <p> | |||
* 实体类 | |||
* </p> | |||
* | |||
* @package: com.xkcoding.springbootdemoormjdbctemplate.model | |||
* @description: 实体类 | |||
* @author: yangkai.shen | |||
* @date: Created in 2018/5/11 下午3:24 | |||
* @copyright: Copyright (c) 2018 | |||
* @version: V1.0 | |||
* @modified: yangkai.shen | |||
*/ | |||
@Data | |||
public class User implements Serializable { | |||
private int id; | |||
private String name; | |||
private String tel; | |||
private Date createTime; | |||
} |
@@ -0,0 +1,34 @@ | |||
package com.xkcoding.springbootdemoormjdbctemplate.service; | |||
import com.xkcoding.springbootdemoormjdbctemplate.model.User; | |||
import java.util.List; | |||
/** | |||
* <p> | |||
* UserService | |||
* </p> | |||
* | |||
* @package: com.xkcoding.springbootdemoormjdbctemplate.service | |||
* @description: UserService | |||
* @author: yangkai.shen | |||
* @date: Created in 2018/5/11 下午3:26 | |||
* @copyright: Copyright (c) 2018 | |||
* @version: V1.0 | |||
* @modified: yangkai.shen | |||
*/ | |||
public interface UserService { | |||
Integer save(User user); | |||
Integer update(User user); | |||
Integer delete(User user); | |||
User findById(Integer id); | |||
User findByName(String name); | |||
List<User> findAll(); | |||
List<User> findUserByPage(Integer pageNum, Integer pageSize); | |||
} |
@@ -0,0 +1,84 @@ | |||
package com.xkcoding.springbootdemoormjdbctemplate.service.impl; | |||
import com.google.common.collect.Lists; | |||
import com.xiaoleilu.hutool.bean.BeanUtil; | |||
import com.xkcoding.springbootdemoormjdbctemplate.model.User; | |||
import com.xkcoding.springbootdemoormjdbctemplate.service.UserService; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.jdbc.core.BeanPropertyRowMapper; | |||
import org.springframework.jdbc.core.JdbcTemplate; | |||
import org.springframework.jdbc.core.RowMapper; | |||
import org.springframework.stereotype.Service; | |||
import java.util.List; | |||
import java.util.Map; | |||
/** | |||
* <p> | |||
* UserServiceImpl | |||
* </p> | |||
* | |||
* @package: com.xkcoding.springbootdemoormjdbctemplate.service.impl | |||
* @description: UserServiceImpl | |||
* @author: yangkai.shen | |||
* @date: Created in 2018/5/11 下午3:27 | |||
* @copyright: Copyright (c) 2018 | |||
* @version: V1.0 | |||
* @modified: yangkai.shen | |||
*/ | |||
@Service | |||
public class UserServiceImpl implements UserService { | |||
@Autowired | |||
private JdbcTemplate jdbcTemplate; | |||
@Override | |||
public Integer save(User user) { | |||
String sql = "INSERT INTO jdbctemplate_user (name,tel,create_time) VALUES(?,?,?)"; | |||
return jdbcTemplate.update(sql, user.getName(), user.getTel(), user.getCreateTime()); | |||
} | |||
@Override | |||
public Integer update(User user) { | |||
String sql = "UPDATE jdbctemplate_user SET name = ?,tel = ? where id = ?"; | |||
return jdbcTemplate.update(sql, user.getName(), user.getTel(), user.getId()); | |||
} | |||
@Override | |||
public Integer delete(User user) { | |||
String sql = "DELETE FROM jdbctemplate_user where id = ?"; | |||
return jdbcTemplate.update(sql, user.getId()); | |||
} | |||
@Override | |||
public User findById(Integer id) { | |||
String sql = "SELECT * FROM jdbctemplate_user where id = ?"; | |||
RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class); | |||
return jdbcTemplate.queryForObject(sql, new Object[]{id}, rowMapper); | |||
} | |||
@Override | |||
public User findByName(String name) { | |||
String sql = "SELECT * FROM jdbctemplate_user where name = ?"; | |||
RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class); | |||
return jdbcTemplate.queryForObject(sql, new Object[]{name}, rowMapper); | |||
} | |||
@Override | |||
public List<User> findAll() { | |||
String sql = "SELECT * FROM jdbctemplate_user"; | |||
List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql); | |||
List<User> ret = Lists.newArrayList(); | |||
maps.forEach(map -> ret.add(BeanUtil.fillBeanWithMap(map, new User(), true, false))); | |||
return ret; | |||
} | |||
@Override | |||
public List<User> findUserByPage(Integer pageNum, Integer pageSize) { | |||
String sql = "SELECT * FROM jdbctemplate_user LIMIT ?,?"; | |||
Integer offset = (pageNum - 1) * pageSize; | |||
List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql, new Object[]{offset, pageSize}); | |||
List<User> ret = Lists.newArrayList(); | |||
maps.forEach(map -> ret.add(BeanUtil.fillBeanWithMap(map, new User(), true, false))); | |||
return ret; | |||
} | |||
} |
@@ -0,0 +1,29 @@ | |||
package com.xkcoding.springbootdemoormjdbctemplate.vo; | |||
import lombok.AllArgsConstructor; | |||
import lombok.Builder; | |||
import lombok.Data; | |||
import lombok.NoArgsConstructor; | |||
/** | |||
* <p> | |||
* 统一返回结果类型 | |||
* </p> | |||
* | |||
* @package: com.xkcoding.springbootdemoormjdbctemplate.vo | |||
* @description: 统一返回结果类型 | |||
* @author: yangkai.shen | |||
* @date: Created in 2018/5/11 下午3:53 | |||
* @copyright: Copyright (c) 2018 | |||
* @version: V1.0 | |||
* @modified: yangkai.shen | |||
*/ | |||
@Data | |||
@NoArgsConstructor | |||
@AllArgsConstructor | |||
@Builder | |||
public class R { | |||
private int code; | |||
private String msg; | |||
private Object data; | |||
} |
@@ -0,0 +1,49 @@ | |||
server: | |||
port: 8080 | |||
context-path: /demo | |||
spring: | |||
datasource: | |||
# 启动时自动运行的 SQL 文件 | |||
schema: classpath:init-sql/schema.sql | |||
continue-on-error: true | |||
druid: | |||
url: jdbc:mysql://localhost:3306/spring-boot-demo?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false | |||
username: root | |||
password: root | |||
driver-class-name: com.mysql.jdbc.Driver | |||
# 连接池配置 | |||
# 初始化大小,最小,最大 | |||
initialSize: 5 | |||
minIdle: 5 | |||
maxActive: 20 | |||
# 配置获取连接等待超时的时间 | |||
maxWait: 60000 | |||
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 | |||
timeBetweenEvictionRunsMillis: 60000 | |||
# 配置一个连接在池中最小生存的时间,单位是毫秒 | |||
minEvictableIdleTimeMillis: 300000 | |||
validationQuery: SELECT 1 FROM DUAL | |||
testWhileIdle: true | |||
testOnBorrow: false | |||
testOnReturn: false | |||
# 打开PSCache,并且指定每个连接上PSCache的大小 | |||
poolPreparedStatements: true | |||
maxPoolPreparedStatementPerConnectionSize: 20 | |||
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 | |||
filters: stat,wall,log4j | |||
# 监控配置 | |||
web-stat-filter: | |||
enabled: true | |||
url-pattern: /* | |||
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" | |||
stat-view-servlet: | |||
enabled: true | |||
url-pattern: /sys/druid/* | |||
reset-enable: fasle | |||
login-username: xkcoding | |||
login-password: 123456 | |||
filter: | |||
stat: | |||
log-slow-sql: true | |||
slow-sql-millis: 5000 | |||
merge-sql: true |
@@ -0,0 +1,13 @@ | |||
SET FOREIGN_KEY_CHECKS=0; | |||
DROP TABLE IF EXISTS `jdbctemplate_user`; | |||
CREATE TABLE `jdbctemplate_user` ( | |||
`id` int(11) NOT NULL AUTO_INCREMENT, | |||
`name` varchar(32) DEFAULT NULL, | |||
`tel` varchar(11) DEFAULT NULL, | |||
`create_time` datetime DEFAULT NULL, | |||
PRIMARY KEY (`id`) | |||
) ENGINE=InnoDB DEFAULT CHARSET=utf8; | |||
INSERT INTO `jdbctemplate_user` VALUES (1, 'klay', '13799008800', '2017-11-13 16:04:39'); | |||
INSERT INTO `jdbctemplate_user` VALUES (2, 'Tome', '18988991234', '2017-11-13 16:13:28'); |
@@ -0,0 +1,16 @@ | |||
package com.xkcoding.springbootdemoormjdbctemplate; | |||
import org.junit.Test; | |||
import org.junit.runner.RunWith; | |||
import org.springframework.boot.test.context.SpringBootTest; | |||
import org.springframework.test.context.junit4.SpringRunner; | |||
@RunWith(SpringRunner.class) | |||
@SpringBootTest | |||
public class SpringBootDemoOrmJdbctemplateApplicationTests { | |||
@Test | |||
public void contextLoads() { | |||
} | |||
} |
@@ -32,6 +32,7 @@ | |||
<module>../spring-boot-demo-elasticsearch</module> | |||
<module>../spring-boot-demo-template-beetl</module> | |||
<module>../spring-boot-demo-task-schedule</module> | |||
<module>../spring-boot-demo-orm-jdbctemplate</module> | |||
</modules> | |||
<parent> | |||