2、配置基本属性。
在src/main/resources下找到application.properties文件,在该配置文件中配置数据源。
#数据源信息配置
#数据库地址,jpa数据库名,需要在数据库中先建一个jdbctemplate数据库
spring.datasource.url=jdbc:mysql://localhost:3306/jdbctemplate?serverTimezone=GMT%2B8
#用户名
spring.datasource.username=root
#密码
spring.datasource.password=root
#链接数据库驱动
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
编写代码
在项目中新建4个包,分别为entity(放置持久化类)、controller(控制器)、repository(定义数据访问接口的包)、service(业务逻辑处理类)
1、创建持久化类。
在entity包中创建一个持久化类User.java,其代码如下。
public class User {
private Integer id;
private String loginName;
private String username;
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
2、定义数据访问层接口
在repository包下新建一个接口,命名为UserRepository.java完整代码结构如下(包含使用JDBCTemplate的增删改查方法)。
import com.mcy.jdbctemplate.entity.User;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Repository;
import javax.annotation.Resource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
/**
- @Repository注解:标注这是一个持久化操作对象
*/
@Repository
public class UserRepository {
//注入JdbcTemplate模板对象
@Resource
private JdbcTemplate jdbcTemplate;
/**
-
插入数据
-
@return 插入影响的行数
*/
public Integer insertUser(){
String sql = “insert into tb_user(login_name, username, password) values(?, ?, ?), (?, ?, ?)”;
Object args[] = new Object[]{“张三”, “admin”, “123456”, “李四”, “123456”, “123456”};
//参数一:插入数据的SQL语句,参数二:对应SQL语句中占位符?的参数
return jdbcTemplate.update(sql, args);
}
/***
-
根据userName查询数据
-
@param username
-
@return User对象
*/
public User selectByUsername(String username){
//定义SQL语句
String sql = “select * from tb_user where username = ?”;
//定义一个RowMapper
RowMapper rowMapper = new BeanPropertyRowMapper<>(User.class);
//执行查询方法
User user = jdbcTemplate.queryForObject(sql, new Object[]{username}, rowMapper);
return user;
}
/**
-
根据id查询数据
-
@param id
-
@return User对象
*/
public User findUserById(Integer id){
//定义SQL语句
String sql = “select * from tb_user where id = ?”;
RowMapper rowMapper = new BeanPropertyRowMapper<>(User.class);
//执行查询方法
return jdbcTemplate.queryForObject(sql, new Object[]{id}, rowMapper);
}
/**
-
查询所有数据
-
@return 包含User对象的List集合
*/
public List findAll(){
//定义SQL语句
String sql = “select * from tb_user”;
//声明结果集的映射rowMapper,将结果集的数据映射成User对象数据
RowMapper rowMapper = new BeanPropertyRowMapper<>(User.class);
return jdbcTemplate.query(sql, rowMapper);
}
/**
-
根据id删除数据
-
@param id
*/
public void delete(final Integer id){
//定义SQL语句
String sql = “delete from tb_user where id=?”;
//执行
jdbcTemplate.update(sql, new Object[]{id});
}
/**
-
修改数据
-
@param user
*/
public void update(final User user){
//定义SQL语句
String sql = “update tb_user set username=?, login_name=?, where id=?”;
//执行
jdbcTemplate.update(sql, new Object[]{user.getUsername(),user.getLoginName(), user.getId()});
}
/**
-
插入数据,获取被插入数据的主键
-
@param user
-
@return
*/
public User insertGetKey(User user){
//声明插入的SQL语句
String sql = “insert into tb_user(username, login_name, password) values(?, ?, ?)”;
//定义插入数据后获取主键的对象
KeyHolder holder = new GeneratedKeyHolder();
jdbcTemplate.update(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
//插入数据后,将被插入数据的主键返回
PreparedStatement ps = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
ps.setString(1, user.getUsername());
ps.setString(2, user.getLoginName());
ps.setString(3, user.getPassword());
return ps;
}
}, holder);
//获取被插入数据库的主键,注入到user对象
Integer newUserId = holder.getKey().intValue();
user.setId(newUserId);
return user;
}
}
UserRepository类需要通过@Repository注解声明这是一个数据访问层对象,这样在业务层就可以通过注解注入UserRepository对象。在UserRepository类中最关键的是通过注解@Resource将JDBCTemplate对象注入进来,后续就可以通过JDBCTemplate对象提供的方法对数据库进行相关的CRUD操作了,JDBCTemplate对象是由SpringBoot项目的自动配置和自动创建Bean完成的,所以使用起来十分方便。
3、定义业务层类。
在service包下新建一个UserService类,代码如下。
import com.mcy.jdbctemplate.entity.User;
import com.mcy.jdbctemplate.repository.UserRepository;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class UserService {
//注入UserRepository
@Resource
private UserRepository userRepository;
public Integer insertUser(){
return userRepository.insertUser();
}
public User selectByUsername(String username){
return userRepository.selectByUsername(username);
}
public List findAll(){
return userRepository.findAll();
}
public User insertGetKey(User user){
return userRepository.insertGetKey(user);
}
public void update(User user){
userRepository.update(user);
}
public void delete(Integer id){
userRepository.delete(id);
}
}
在业务层中需要注入数据访问层对象UserRepository,在上述代码中是通过@Resource注解将UserRepository接口对应的实现类对象注入进来的。
测试应用
1、编写测试控制器
在controller包下新建一个UserController类,代码如下。
import com.mcy.jdbctemplate.entity.User;
import com.mcy.jdbctemplate.service.UserService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
@RestController
@RequestMapping(“/user”)
public class UserController {
@Resource
private UserService userService;
@RequestMapping(“/insertUser”)
public String insertUser(){
return “插入数据[”+userService.insertUser()+“]条”;
}
@RequestMapping(“/insertGetKey”)
public User insertGetKey(User user){
return userService.insertGetKey(user);
}
@RequestMapping(“/selectByUsername”)
public User selectByUsername(String username){
return userService.selectByUsername(username);
}
@RequestMapping(“/findAll”)
public List findAll(){
return userService.findAll();
}
@RequestMapping(“/update”)
public void update(User user){
userService.update(user);
}
@RequestMapping(“/delete”)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://i-blog.csdnimg.cn/blog_migrate/dfb493b955c01f9284e063e735d3b462.jpeg)
写在最后
为了这次面试,也收集了很多的面试题!
以下是部分面试题截图
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
3291)]
[外链图片转存中…(img-JqjSdhau-1712683763292)]
[外链图片转存中…(img-x0j2gUVA-1712683763292)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://i-blog.csdnimg.cn/blog_migrate/dfb493b955c01f9284e063e735d3b462.jpeg)
写在最后
为了这次面试,也收集了很多的面试题!
以下是部分面试题截图
[外链图片转存中…(img-D71KFJxk-1712683763292)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!