创建项目:file-->new -->project --->next-->填写包名、项目名-->选择相应的模块和版本-->完成
在生成的pom.xml文件中导入需要的依赖,直接在Maven官网拿。
一、使用jdbcTmplate
是Spring对JDBC的封装,旨在使JDBC更加易于使用。并且JdbcTemplate处理了资源的建立和释放。需要配置数据源,但是spring boot已经自动帮我们初始化好了jdbcTemplate对象,并且默认采用tomcat数据源dataSource
这是所需要的依赖,mysql-connector-java不要使用过高版本,容易出问题。
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>2.1.6.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
在里面我使用了lombok,lombok是一个可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java 代码的工具 。效果看后面实体类。如果想要使用lombok,还需要安装一个插件。file-->Setttings-Plugins
接下来就是配置数据源,在application.properties或者新建一个application.yml中。我是在.yml文件中,看起来有层次感。
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/springboot
username: root
password: root
数据库建表
建立对应实体类
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author Administrator
* @description $
* @date 2019/12/25
*/
@Data //包含了get,set和toString
@AllArgsConstructor //生成一个有参构造器
@NoArgsConstructor //生成一个无参构造器
public class User {
private Integer userId;
private String userName;
private String passWord;
private String address;
}
dao层(一个接口,一个实现类)
import java.util.List;
public interface UserDaoI {
public List<User> findAll();
public User findById(Integer userId);
public boolean addUser(User user);
public boolean deleteById(Integer userId);
public boolean updateById(Integer userId,String userName);
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author Administrator
* @description $
* @date 2019/12/25
*/
@Repository("userDao")
public class UserDaoImpl implements UserDaoI {
@Autowired
private JdbcTemplate jdbcTemplate;
/**
* 功能描述:查询所有数据
* @Param: []
* @Return: java.util.List<com.example.pojo.User>
* @Author: Administrator
* @Date: 2019/12/25 17:50
*/
@Override
public List<User> findAll() {
String sql = "SELECT userId,userName,passWord,address from User";
return jdbcTemplate.query(sql,new BeanPropertyRowMapper<User>(User.class));
}
/**
* 功能描述: 由userId查询数据
* @Param: [userId]
* @Return: com.example.pojo.User
* @Author: Administrator
* @Date: 2019/12/25 17:50
*/
@Override
public User findById(Integer userId) {
String sql = "select userId,userName,passWord,address from User where userId=?";
Object[] params = {userId};
return jdbcTemplate.queryForObject(sql,params,new BeanPropertyRowMapper<User>(User.class));
}
/**
* 功能描述: 添加数据
* @Param: [user]
* @Return: boolean
* @Author: Administrator
* @Date: 2019/12/25 17:51
*/
@Override
public boolean addUser(User user) {
String sql = "insert into User(userName,passWord,address)values(?,?,?)";
Object[] params = {user.getUserName(),user.getPassWord(),user.getAddress()};
return jdbcTemplate.update(sql,params)>0;
}
/**
* 功能描述: 由userId删除数据
* @Param: [userId]
* @Return: boolean
* @Author: Administrator
* @Date: 2019/12/25 17:51
*/
@Override
public boolean deleteById(Integer userId) {
String sql = "delete from User where userId=?";
Object[] params = {userId};
return jdbcTemplate.update(sql,params)>0;
}
/**
* 功能描述:由userId修改数据
* @Param: [userId, userName]
* @Return: boolean
* @Author: Administrator
* @Date: 2019/12/25 17:51
*/
@Override
public boolean updateById(Integer userId,String userName) {
String sql = "update User set userName=? where userId=?";
Object[] params = {userName,userId};
return jdbcTemplate.update(sql,params)>0;
}
}
service层
mport org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* @author Administrator
* @description $
* @date 2019/12/25
*/
@Service("userService")
public class UserService {
@Autowired
@Qualifier("userDao")
private UserDaoI userDaoI;
/**
* 功能描述: <br>
* 〈〉
* @Param: []
* @Return: java.util.List<com.example.pojo.User>
* @Author: Administrator
* @Date: 2019/12/25 16:10
*/
public List<User> findAll(){
List<User> list = userDaoI.findAll();
return list;
}
/**
* 功能描述: <br>
* 〈〉
* @Param: [userId]
* @Return: com.example.pojo.User
* @Author: Administrator
* @Date: 2019/12/25 16:16
*/
public User findById(Integer userId){
return userDaoI.findById(userId);
}
/**
* 功能描述: <br>
* 〈〉
* @Param: [user]
* @Return: boolean
* @Author: Administrator
* @Date: 2019/12/25 16:26
*/
public boolean add(User user){
return userDaoI.addUser(user);
}
public boolean deleteById(Integer userId){
return userDaoI.deleteById(userId);
}
public boolean update(Integer userId,String userName){
return userDaoI.updateById(userId,userName);
}
}
Controller
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
/**
* @author Administrator
* @description $
* @date 2019/12/25
*/
@Controller
public class UserController {
@Autowired
@Qualifier("userService")
private UserService service;
@RequestMapping(value = "/all",method = RequestMethod.GET)
@ResponseBody
public String findAll(){
List<User> list = service.findAll();
for (User user : list) {
System.out.println(user.getUserId()+" "+user.getUserName());
}
return "查询所有!";
}
@ResponseBody
@RequestMapping(value = "/this",method = RequestMethod.GET)
public String findById(Integer userId){
User user = new User();
user = service.findById(userId);
System.out.println(user.getUserId()+" "+user.getUserName());
return "传参查询";
}
@ResponseBody
@RequestMapping(value = "add",method = RequestMethod.GET)
public String add(User user){//@ModelAttribute("user") User user
System.out.println(user.getPassWord()+"接收参数.....");
boolean flag = service.add(user);
System.out.println("......"+flag+".....");
return "添加";
}
@ResponseBody
@RequestMapping(value = "/del",method = RequestMethod.GET)
public String deleteById(Integer userId){
boolean flag = service.deleteById(userId);
System.out.println(flag);
return "根据id删除";
}
@ResponseBody
@RequestMapping(value = "/update",method = RequestMethod.GET)
public String update(Integer userId,String userName){
System.out.println(service.findById(userId).getUserName());
System.out.println(service.update(userId,userName));
System.out.println(service.findById(userId).getUserName());
return "修改数据";
}
}
现在就可以进行测试了,在浏览器地址栏输入:localhost:8080/all 看后台是否打印出表中数据(前提是表中有数据),如果想修改端口号8080,可以在属性文件中配置:server.port=8081。将8080改为8081
在我进行测试的时候顺便试了试不同的接收参数方式,一共有如下几种,有兴趣可以试一试
1.通过实体Bean接收请求参数
public String login(Student stu, Model model)
2.通过方法的参数接收
public String login(String name, String password, Model model)
3.通过HttpServletRequest接收请求参数
public String login(HttpServletRequest req,Model model)
4.通过@PathVariable接收URL中的请求参数
public String test4(@PathVariable String name)
5.通过@RequestParam接收请求参数
public String test5(@RequestParam String name,@RequestParam String passwd)
6.通过@ModelAttribute接收请求参数
public String test6(@ModelAttribute("stu") Student stu)
在上面的代码中,明显没有事务管理,可以使用注解@Transactional
使用方法:在application类添加注解:@EnableTransactionManagement(开启支持事务),然后在相应的方法或类上注解@Transactional,就这么简单。
service层从新写一个测试方法
@Transactional
public void addTest(User user){
System.out.println("........>");
userDaoI.addTest(user);
System.out.println("<........");
throw new RuntimeException("exception");
}
但是,默认的只对RuntimeException异常回滚,所以还需要通过属性进行设置。
指定回滚 @Transactional(rollbackFor=Exception.class) 指定不回滚 @Transactional(noRollbackFor=Exception.class)
还有一些其他属性:propagation 、isolation、 readOnly 、tlmeoUt 、roIlbackFor 、rollbackForClassName 、noRollbackFor noRollbackForClassName 这些属性的具体作用就不一一说了。