【Spring】三,Spring与JDBC Template

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对控制器进行测试了。

完整的工程源码请访问:boot-integrate-jdbc-template

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值