SpringBoot----利用JdbcTemplate实现增删查改操作

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方法:用于执行存储过程、函数相关语句。


猜你喜欢

转载自blog.csdn.net/zz2713634772/article/details/79496596
今日推荐