SpringBoot----利用JdbcTemplate实现增删查改操作
1、新建一个Maven项目,使用jdk1.8,在pom.xml中添加如下依赖:
<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>com.etc</groupId>
<artifactId>springboot3</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springboot3</name>
<url>http://maven.apache.org</url>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.7.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- SpringBoot web开发包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- SpringBoot 测试包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- freemarker模版 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!-- jdbc -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.35</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.0</version>
</dependency>
</dependencies>
</project>
2、在com.etc.springboot3包下新建一个Application.java启动类:
package com.etc.springboot3;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
/**
* @Description:启动类
* @author zoey
* @date:2018年3月9日
*/
@SpringBootApplication
@ComponentScan(basePackages="com.etc.*")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
System.out.println("启动完成");
}
}
3、在数据库中新建一个表t_user,添加一些简单的数据,如下:
4、新建src/main/resource源文件夹,在该文件夹下新建application.properties文件,配置一些参数如下:
###############################数据库配置:连接本地数据库###############################
spring.datasource.name=test
spring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driverClassName=com.mysql.jdbc.Driver
5、在com.etc.vo包下新建一个User.java类如下:
package com.etc.vo;
/**
* @Description:用户实体类:包含用户的基本信息
* 表中的字段:user_id、user_name、user_age、user_sex
* @author zoey
* @date:2018年3月9日
*/
public class User {
private int userId;
private String userName;
private int userAge;
private String userSex;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getUserAge() {
return userAge;
}
public void setUserAge(int userAge) {
this.userAge = userAge;
}
public String getUserSex() {
return userSex;
}
public void setUserSex(String userSex) {
this.userSex = userSex;
}
public User(String userName, int userAge, String userSex) {
super();
this.userName = userName;
this.userAge = userAge;
this.userSex = userSex;
}
public User() {
super();
}
@Override
public String toString() {
return "User [userId=" + userId + ", userName=" + userName + ", userAge=" + userAge + ", userSex=" + userSex
+ "]";
}
}
6、在com.etc.service包下新建一个UserService.java类如下:
package com.etc.service;
import java.util.List;
import com.etc.vo.User;
/**
* @Description:用户接口:定义增删查改的方法
* @author zoey
* @date:2018年3月9日
*/
public interface UserService {
List<User> findAll();
User findById(int userId);
int create(String userName,int userAge,String userSex);
int update(String userName, int userAge, String userSex, int userId);
int delete(int userId);
}
7、在com.etc.jdbcTemplate包下新建一个MyRowMapper.java类如下:
package com.etc.jdbcTemplate;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;
import com.etc.vo.User;
/**
* @Description:实现RowMapper接口,返回User对象
* @author zoey
* @date:2018年3月9日
*/
public class MyRowMapper implements RowMapper<User>{
@Override
public User mapRow(ResultSet resultSet, int i) throws SQLException {
//此处要使用表中的字段,不能使用属性
int userId = resultSet.getInt("user_id");
String userName = resultSet.getString("user_name");
int userAge = resultSet.getInt("user_age");
String userSex = resultSet.getString("user_sex");
User user = new User();
user.setUserId(userId);
user.setUserName(userName);
user.setUserAge(userAge);
user.setUserSex(userSex);
return user;
}
/**
* 报错:java.sql.SQLException: Column 'userName' not found.
* 原因: String userName = resultSet.getString("userName");使用了User类的属性userName
* 此处要使用表中的字段,不能使用属性
* 解决方法:String userName = resultSet.getString("user_name");
*/
}
8、在com.etc.service.imple包下新建一个UserServiceImpl.java类如下:
package com.etc.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import com.etc.jdbcTemplate.MyRowMapper;
import com.etc.service.UserService;
import com.etc.vo.User;
/**
* @Description:用户实现类:具体实现用户的增删查改操作
* @author zoey
* @date:2018年3月9日
*/
@Service
public class UserServiceImpl implements UserService{
@Autowired
private JdbcTemplate jdbcTemplate;
/**
* @Description:查询所有用户
* @return 返回一个列表
* @author:zoey
* @date:2018年3月9日
*/
@Override
public List<User> findAll() {
String sql = "select * from t_user";
List<User> userList = jdbcTemplate.query(sql,new MyRowMapper() );
return userList;
}
/**
* @Description:根据用户ID查询用户信息
* @param userId
* @return 返回单个对象
* @author:zoey
* @date:2018年3月9日
*/
@Override
public User findById(int userId) {
String sql = "select * from t_user where user_id = ?";
User user = jdbcTemplate.queryForObject(sql,new MyRowMapper(),userId);
return user;
}
/**
* @Description:新增用户
* @param userName
* @param userAge
* @param userSex
* @return 返回更新行数
* @author:zoey
* @date:2018年3月9日
*/
@Override
public int create(String userName, int userAge, String userSex) {
String sql = "insert into t_user(user_name,user_age,user_sex) values(?,?,?)";
return jdbcTemplate.update(sql,userName,userAge,userSex);
}
/**
* @Description:根据用户ID修改用户信息
* @param userName
* @param userAge
* @param userSex
* @param userId
* @return 返回更新行数
* @author:zoey
* @date:2018年3月9日
*/
@Override
public int update(String userName, int userAge, String userSex,int userId) {
String sql = "update t_user set user_name = ? , user_age = ? , user_sex = ? where user_id = ?";
return jdbcTemplate.update(sql, userName,userAge,userSex,userId);
}
/**
报错:com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value: 'zoey修改'
解决方法:将sql语句中的and修改为逗号,
update t_user set user_name = ? and user_age = ? and user_sex = ? where user_id = ?
修改如下:
update t_user set user_name = ? , user_age = ? , user_sex = ? where user_id = ?
*/
/**
* @Description:根据用户ID删除用户信息
* @param userId
* @return 返回更新行数
* @author:zoey
* @date:2018年3月9日
*/
@Override
public int delete(int userId) {
String sql = "delete from t_user where user_id = ?";
return jdbcTemplate.update(sql,userId);
}
}
/**
JdbcTemplate知识点补充:
JdbcTemplate就是Spring对jdbc的封装,通俗点说就是Spring对jdbc的封装的模板
JdbcTemplate主要提供以下几种方法:
execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
query方法及queryForXXX方法:用于执行查询相关语句;
call方法:用于执行存储过程、函数相关语句。
JdbcTemplate和Mybatis不一样:
Mybatis的sql语句放在了mapper.xml文件里面.相当于配置在了环境当中,随时都可以使用.
JDBCTemplate则是写在了实现类里面,使用的时候还要进行重新调用配置之类的. 以后的工作中可能对多个表进行操作,配置在环境中使用起来非常方便.
*/
9、在com.etc.controller包下新建一个UserController.java类如下:
package com.etc.controller;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.etc.service.UserService;
import com.etc.vo.User;
/**
* @Description:用户控制类:对用户信息信息进行增删查改
* @author zoey
* @date:2018年3月9日
*/
@Controller
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
/**
* @Description:查询所有用户信息
* 访问地址:http://localhost:8080/users/findAll
* @param request
* @return
* @author:zoey
* @date:2018年3月9日
*/
@RequestMapping("/findAll")
public String findAll(HttpServletRequest request) {
System.out.println("查询所有用户信息");
List<User> userList = userService.findAll();
if(userList.size()>0) {
System.out.println("查询用户信息成功");
}
request.setAttribute("userList", userList);
return "list";
}
/**
* @Description:根据用户ID查询用户信息
* 访问地址:http://localhost:8080/users/findById?userId=xx
* @param request
* @param userId
* @return 返回用户详情页面
* @author:zoey
* @date:2018年3月9日
*/
@RequestMapping("/findById")
public String findById(HttpServletRequest request,@RequestParam("userId") int userId) {
System.out.println("根据用户ID查询用户信息");
User user = userService.findById(userId);
if(user!=null) {
System.out.println("查询用户成功!");
request.setAttribute("user", user);
request.setAttribute("message", "查询");
return "details";
}else {
System.out.println("查询用户失败!");
return "error";
}
}
/**
* @Description:转向新增页面
* 访问地址:http://localhost:8080/users/insert
* @return
* @author:zoey
* @date:2018年3月9日
*/
@RequestMapping("/insert")
public String insert() {
System.out.println("转页面");
return "insert";
}
/**
* @Description:新增用户
* 访问地址:http://localhost:8080/users/create
* @param request
* @param user 传递用户对象参数,在前台页面具体填写了用户的信息(用户名、年龄、性别)
* @return 返回成功或者失败页面
* @author:zoey
* @date:2018年3月9日
*/
@RequestMapping("/create")
public String create(HttpServletRequest request,User user) {
System.out.println("新增用户");
int result = userService.create(user.getUserName(), user.getUserAge(), user.getUserSex());
if(result == 1) {
System.out.println("新增用户成功!");
request.setAttribute("message","新增");
return "success";
}else {
System.out.println("新增用户失败!");
return "error";
}
}
/**
* @Description:转向修改页面,获取列表页面传递过来的用户参数,然后保存,在修改页面获取展示,然后再进行修改
* 访问地址:http://localhost:8080/users/toUpdate?userId=xx&userName=xx&userAge=xx&userSex=xx
* @param request
* @param userId
* @param userName
* @param userAge
* @param userSex
* @return 返回修改页面
* @author:zoey
* @date:2018年3月9日
*/
@RequestMapping("/toUpdate")
public String toUpdate(HttpServletRequest request,@RequestParam("userId") int userId,@RequestParam("userName") String userName,
@RequestParam("userAge") String userAge,@RequestParam("userSex") String userSex) {
System.out.println("转向更新页面");
//保存用户信息,传递到更新页面
request.setAttribute("userId", userId);
request.setAttribute("userName", userName);
request.setAttribute("userAge", userAge);
request.setAttribute("userSex", userSex);
return "update";
}
/**
* @Description:修改用户,获取用户的信息,先展示在页面上,然后用户进行修改
* 访问地址:http://localhost:8080/users/update
* @param user 获取页面的用户信息参数
* @return 返回成功或者失败页面
* @author:zoey
* @date:2018年3月9日
*/
@RequestMapping("/update")
public String update(HttpServletRequest request,User user) {
System.out.println("修改用户"+user);
int result = userService.update(user.getUserName(), user.getUserAge(), user.getUserSex(),user.getUserId());
if(result == 1) {
System.out.println("修改用户成功!");
request.setAttribute("message","修改");
return "success";
}else {
System.out.println("修改用户失败!");
return "error";
}
}
/**
* @Description:根据用户ID删除用户信息
* 访问地址:http://localhost:8080/users/delete?userId=xx
* @param request
* @param userId
* @return
* @author:zoey
* @date:2018年3月9日
*/
@RequestMapping("/delete")
public String delete(HttpServletRequest request,@RequestParam("userId") int userId) {
int result = userService.delete(userId);
if(result == 1) {
System.out.println("删除用户成功!");
request.setAttribute("message","删除");
return "success";
}else {
System.out.println("删除用户失败!");
return "error";
}
}
}
/**
* @Controller和@RestController注解的区别:
@RestController注解相当于@ResponseBody + @Controller合在一起的作用。
1)如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,
配置的视图解析器InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。
例如:本来应该到success.jsp页面的,则其显示success.
2)如果需要返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行。
3)如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。
*/
10、在src/main/resources文件夹下新建templates文件夹,新建list.ftl如下:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>列表页面</title>
<style>
body{
text-align:center;
}
p{
font-size:24px;
background-color:#ccc;
text-align:center;
}
tr{
width:400px;
height:70px;
}
td{
width:100px;
}
</style>
</head>
<body>
<center>
<table border="1" cellspacing="0" cellpadding="0">
<caption><h2>用户列表</h11></caption>
<tr>
<th width="200px;">操作</th>
<th>用户ID</th>
<th>用户名</th>
<th>年龄</th>
<th>性别</th>
</tr>
<#list userList as item>
<tr align="center">
<td>
<a href="/users/findById?userId=${item.userId}">查看</a>
<a href="/users/toUpdate?userId=${item.userId}&userName=${item.userName}&userAge=${item.userAge}&userSex=${item.userSex}">修改</a>
<a href="/users/delete?userId=${item.userId}">删除</a>
</td>
<td>${item.userId}</td>
<td>${item.userName}</td>
<td>${item.userAge}</td>
<td>${item.userSex}</td>
</tr>
</#list>
</table>
</center>
</body>
</html>
11、新建details.ftl如下:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>详情页面</title>
</head>
<body>
<center>
<p>
${user.userId}
${user.userName}
${user.userAge}
${user.userSex}
</p>
</center>
</body>
</html>
12、新建insert.ftl如下:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>新增页面</title>
</head>
<body>
<center>
<h2>新增用户</h2>
<form action="/users/create" method="post">
用户名:<input type="text" name="userName" value=""/><br/>
年龄 :<input type="text" name="userAge" value=""/><br/>
性别 :<input type="text" name="userSex" value=""/><br/><br/>
<input type="submit" value="新增"/>
</form>
</center>
</body>
</html>
13、新建update.ftl如下:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>修改页面</title>
</head>
<body>
<center>
<h2>修改用户</h2>
<form action="/users/update" method="post">
<input type="hidden" name="userId" value="${userId}"/>
用户名:<input type="text" name="userName" value="${userName}"/><br/>
年龄 :<input type="text" name="userAge" value="${userAge}"/><br/>
性别 :<input type="text" name="userSex" value="${userSex}"/><br/><br/>
<input type="submit" value="修改"/>
</form>
</center>
</body>
</html>
14、新建success.ftl如下:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>成功页面</title>
</head>
<body>
<center>
<p>
${message}用户成功!
</p>
</center>
</body>
</html>
15、新建error.ftl如下:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>失败页面</title>
</head>
<body>
<center>
<p>
不好意思,报错了!
</p>
</center>
</body>
</html>
16、在src/test/java文件夹下,com.etc.springboot2下面新建ApplicationTest.java测试类:
package com.etc.springboot3;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import com.etc.service.UserService;
import com.etc.vo.User;
//要作为SpringBoot的测试类,必须要添加这两个注解
@RunWith(SpringRunner.class)//指定使用的单元测试执行类,SpringRunner是spring-test提供的测试执行单元类
@SpringBootTest //类似springboot程序的测试引导入口
public class ApplicationTest {
@Autowired
private UserService userService;
@Test
public void create() throws Exception {
// 插入5个用户
userService.create("a", 1,"男");
userService.create("b", 2,"男");
userService.create("c", 3,"男");
userService.create("d", 4,"男");
userService.create("e", 5,"男");
}
@Test
public void findAll() {
List<User> userList = userService.findAll();
for(User user:userList) {
System.out.println("用户:"+user);
}
}
/* 运行结果:
用户:User [userId=1, userName=zoey222, userAge=18, userSex=女]
用户:User [userId=2, userName=小白xiaobai, userAge=19, userSex=男]
用户:User [userId=3, userName=小鱼, userAge=20, userSex=女]
用户:User [userId=4, userName=小黑, userAge=21, userSex=男]
用户:User [userId=5, userName=a, userAge=1, userSex=男]
用户:User [userId=6, userName=b, userAge=2, userSex=男]
用户:User [userId=7, userName=c, userAge=3, userSex=男]
用户:User [userId=8, userName=d, userAge=4, userSex=男]
用户:User [userId=10, userName=新增, userAge=1, userSex=男]
*/
@Test
public void findById() {
User user = userService.findById(1);
System.out.println("用户:"+user);
}
/* 运行结果:
用户:User [userId=1, userName=zoey222, userAge=18, userSex=女]
*/
@Test
public void update() {
int result = userService.update("修改", 100, "男",3);
if(result == 1) {
System.out.println("修改成功!");
User user = userService.findById(3);
System.out.println(user);
}else {
System.out.println("修改失败!");
}
}
/* 运行结果:
修改成功!
User [userId=3, userName=修改, userAge=100, userSex=男]
*/
@Test
public void delete() {
int result = userService.delete(8);
if(result == 1) {
System.out.println("删除成功!");
}else {
System.out.println("删除失败!");
}
}
/* 运行结果:
删除成功!
*/
}
/**
* 报错如下:Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.etc.service.UserService' available
* 原因:在启动类中没有添加注解@ComponentScan(basePackages="com.etc.*"),所以无法找到UserService类
*
* */
运行工程如下:
1、启动:Run As-->Application.java
2、访问地址:http://localhost:8080/users/findAll,进入列表页面:
3、点击新增,进入新增页面:
4、点击查看,进入详情页面:
5、点击修改,进入修改页面:
7、点击删除,删除之后,进入成功页面:
总结:
1、JdbcTemplate操作数据库:
不需要利用mapper.xml文件,编写SQL语句,而是直接在java类中编写sql语句,然后利用JdbcTemplate的方法进行增删查改操作。
2、JdbcTemplate主要提供以下几种方法:
execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
query方法及queryForXXX方法:用于执行查询相关语句;
call方法:用于执行存储过程、函数相关语句。