Spring与Jdbc Template
Spring对JDBC的支持要归功于JdbcTemplate类。JdbcTemplate提供了一种特殊的方式,通过这种方式,开发人员在对关系型数据库执行SQL操作的时候能够避免使用JDBC时常见的繁文缛节和样板式代码。
Spring Boot中使用JdbcTemplate
1,创建工程
使用Spring Initializr创建一个Spring Boot工程,并选择如下依赖
2,编辑配置文件
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://127.0.0.1:3306/boot_integrate_other
spring.datasource.username=root
spring.datasource.password=root
3,创建数据库表
CREATE TABLE sys_user(
USER_ID BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键' ,
USER_NAME VARCHAR(255) COMMENT '用户名' ,
GENDER VARCHAR(32) COMMENT '性别' ,
ACCOUNT VARCHAR(255) NOT NULL COMMENT '登录账号' ,
PASSWORD VARCHAR(255) NOT NULL COMMENT '登录密码' ,
CITY VARCHAR(255) COMMENT '所在城市' ,
CREATED_BY VARCHAR(32) COMMENT '创建人' ,
CREATED_TIME DATETIME COMMENT '创建时间' ,
UPDATED_BY VARCHAR(32) COMMENT '更新人' ,
UPDATED_TIME DATETIME COMMENT '更新时间' ,
PRIMARY KEY (USER_ID)
) COMMENT = '系统用户表';
4,创建领域类
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Data
public class SysUser{
private long userId;
private String userName;
private String gender;
private String account;
private String password;
private String city;
private String createdBy;
private Date createdTime;
private String updatedBy;
private Date updatedTime;
}
5,创建Repository
创建UserRepository接口
public interface UserRepository {
/**
* 查询所有系统用户
* @return
*/
Iterable<SysUser> findAll();
/**
* 查询单个系统用户
* @param account
* @return
*/
SysUser findOne(String account);
/**
* 新增用户
* @param sysUser
* @return
*/
SysUser save(SysUser sysUser);
}
UserRepository的实现类
@Repository
public class UserRepositoryImpl implements UserRepository {
private JdbcTemplate jdbcTemplate;
@Autowired
public UserRepositoryImpl(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public Iterable<SysUser> findAll() {
List<SysUser> userList = jdbcTemplate.query("select * from sys_user", this::mapRowToSysUser);
return userList;
}
@Override
public SysUser findOne(String account) {
SysUser sysUser = jdbcTemplate.queryForObject("select * from sys_user where account = ?", this::mapRowToSysUser, account);
return sysUser;
}
@Override
public SysUser save(SysUser sysUser) {
PreparedStatementCreatorFactory factory =
new PreparedStatementCreatorFactory("insert into sys_user(user_name,gender,account,password,city,created_by,created_time,updated_by,updated_time) values(?,?,?,?,?,?,?,?,?)",
Types.VARCHAR,
Types.VARCHAR,
Types.VARCHAR,
Types.VARCHAR,
Types.VARCHAR,
Types.VARCHAR,
Types.TIMESTAMP,
Types.VARCHAR,
Types.TIMESTAMP);
factory.setReturnGeneratedKeys(true);
PreparedStatementCreator psc = factory.newPreparedStatementCreator(Arrays.asList(sysUser.getUserName(),
sysUser.getGender(),
sysUser.getAccount(),
sysUser.getPassword(),
sysUser.getCity(),
sysUser.getCreatedBy(),
new Timestamp(sysUser.getCreatedTime().getTime()),
sysUser.getUpdatedBy(),
new Timestamp(sysUser.getUpdatedTime().getTime())));
//通过KeyHolder获取数据库自增id
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(psc,keyHolder);
long userId = keyHolder.getKey().longValue();
sysUser.setUserId(userId);
return sysUser;
}
private SysUser mapRowToSysUser(ResultSet rs,int rowNum) throws SQLException {
SysUser sysUser = SysUser.builder()
.userId(rs.getLong("USER_ID"))
.userName(rs.getString("USER_NAME"))
.gender(rs.getString("GENDER"))
.account(rs.getString("ACCOUNT"))
.password(rs.getString("PASSWORD"))
.city(rs.getString("CITY"))
.createdBy(rs.getString("CREATED_BY"))
.createdTime(rs.getDate("CREATED_TIME"))
.updatedBy(rs.getString("UPDATED_BY"))
.updatedTime(rs.getDate("UPDATED_TIME")).build();
return sysUser;
}
}
Spring定义了一系列的构造型(stereotype)注解,@Repository是其中之一,其他注解还包括@Controller和@Component。为UserRepositoryImpl添加@Repository注解之后,Spring的组件扫描就会自动发现它,并且会将其初始化为Spring应用上下文中的bean。
当Spring创建UserRepositoryImpl bean的时候,它会通过@Autowired标注的构造器将JdbcTemplate注入进来。这个构造器将JdbcTemplate赋值给一个实例变量,这个变量会被其他方法用来执行数据库查询和插入操作。
query()会接受要执行的SQL以及Spring RowMapper的一个实现(用来将结果集中的每行数据映射为一个对象)。
findAll()和findOne()中的RowMapper参数都是通过对mapRowToSysUser()的方法引用指定的。在使用JdbcTemplate的时候,Java 8的方法引用和lambda表达式非常便利,它们能够替代显式的RowMapper实现。
update()方法需要接受一个PreparedStatementCreator和一个KeyHolder。KeyHolder将会为我们提供生成的数据库的自增ID。
6,创建Controller
@Slf4j
@Controller
@RequestMapping("/user")
public class UserController {
private UserRepository userRepository;
@Autowired
public UserController(UserRepository userRepository) {
this.userRepository = userRepository;
}
@GetMapping("/getUserList")
@ResponseBody
public List<SysUser> getUserList(){
Iterable<SysUser> all = userRepository.findAll();
List<SysUser> userList = new ArrayList<>();
all.forEach(u -> userList.add(u));
return userList;
}
@GetMapping("/getUserByAccount")
@ResponseBody
public SysUser getUserByAccount(@RequestParam("account") String account){
SysUser sysUser = userRepository.findOne(account);
return sysUser;
}
@PostMapping("/save")
@ResponseBody
public Map<String,String> save(@RequestBody SysUser sysUser){
//默认值
sysUser.setCreatedBy("system");
sysUser.setCreatedTime(new Date());
sysUser.setUpdatedBy("system");
sysUser.setUpdatedTime(new Date());
//执行保存
SysUser saved = userRepository.save(sysUser);
log.info("saved sysUser={}", JSON.toJSONString(saved));
Map<String, String> map = new HashMap<>();
map.put("code","200");
map.put("msg","success");
return map;
}
}
后续就可以通过postman对控制器进行测试了。