栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【Spring】三,Spring与JDBC Template

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【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 {

    
    Iterable findAll();

    
    SysUser findOne(String account);

    
    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 findAll() {
        List 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 getUserList(){
        Iterable all = userRepository.findAll();
        List 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 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 map = new HashMap<>();
        map.put("code","200");
        map.put("msg","success");
        return map;
    }

}

后续就可以通过postman对控制器进行测试了。
完整的工程源码请访问:gitee

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/948742.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号