Spring Boot 入門示例(六):Spring Boot 集成 JdbcTemplate 操作數據庫

Spring Boot 集成 JdbcTemplate 操作數據庫

本示例使用 Spring Boot 集成 Druid 數據庫連接池和 JdbcTemplate 操作數據庫,包括對數據的增刪改查操作。

添加相關依賴

添加 spring-boot-starter-jdbc 依賴、MySQL 依賴、Druid 數據庫連接池依賴。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.35</version>
</dependency>
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.0.14</version>
</dependency>

配置數據源

添加配置信息

# 數據源
spring.datasource.druid.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.druid.url=jdbc:mysql://localhost:3306/game?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
spring.datasource.druid.username=root
spring.datasource.druid.password=root
# 配置阿里巴巴提供的 Druid 數據庫連接池
spring.datasource.druid.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.initial-size=1
spring.datasource.druid.min-idle=1
spring.datasource.druidmax-active=20
spring.datasource.druid.test-on-borrow=true
spring.datasource.druid.stat-view-servlet.allow=true

創建 DataSource 和 JdbcTemplate

@Configuration
public class DatabaseConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.druid")
    public DataSource dataSource(){
        return new DruidDataSource();
    }

    @Bean
    public JdbcTemplate jdbcTemplate() {
        // 這裏要將配置的 DruidDataSource 數據源注入 JdbcTemplate 中,不然默認注入 Spring Boot 自帶的 HikariDatasource。
        return new JdbcTemplate(dataSource());
    }
}

使用 JdbcTemplate 操作數據庫

User 實體類

實體類的字段名要和數據庫的字段名一一對應。

public class User {

    private Long id;

    private String username;

    private String password;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    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;
    }
}

創建 DAO 層

@Repository
public class UserRepository {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public User getUser(String username) {
        String sql = "SELECT id, username, password FROM user WHERE username = ?";
        Map<String, Object> resultMap = jdbcTemplate.queryForMap(sql, username);
        User user = new User();
        user.setId(DataConvertUtils.getLong(resultMap.get("id")));
        user.setUsername(DataConvertUtils.getString(resultMap.get("username")));
        user.setPassword(DataConvertUtils.getString(resultMap.get("password")));

        return user;
    }

    public List<User> listUser() {
        String sql = "SELECT id, username, password FROM user";
        List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
        List<User> users = maps.stream().map(e -> {
            User user = new User();
            user.setId(DataConvertUtils.getLong(e.get("id")));
            user.setUsername(DataConvertUtils.getString(e.get("username")));
            user.setPassword(DataConvertUtils.getString(e.get("password")));
            return user;
        }).collect(Collectors.toList());
        return users;
    }

    /**
     * 不存在則插入,存在則更新
     * 注:被插入的數據中需要存在 UNIQUE 索引或 PRIMARY KEY 字段,這裏使用 username 字段作爲唯一索引 (UNIQUE)
     *
     * @param user
     */
    public int saveOrUpdateUser(User user) {
        String sql = "INSERT INTO user(username, password) VALUES(?,?)" +
                " ON DUPLICATE KEY" +
                " UPDATE password = ?";
        int count = jdbcTemplate.update(sql, user.getUsername(), user.getPassword(), user.getPassword());

        return count;
    }

    public int deleteUser(String username) {
        String sql = "DELETE FROM user WHERE username = ?";
        int count = jdbcTemplate.update(sql, username);

        return count;
    }
}

創建 Service 層

@Service
public class UserService {

    private static final Logger logger = LoggerFactory.getLogger(UserService.class);

    @Autowired
    private UserRepository userRepository;

    public User getUser(String username) {
        User user = userRepository.getUser(username);

        return user;
    }

    public List<User> listUser() {
        List<User> users = userRepository.listUser();

        return users;
    }

    public void saveOrUpdateUser(User user) {
        userRepository.saveOrUpdateUser(user);
        logger.debug("Update user success");
    }

    public void deleteUser(String username) {
        userRepository.deleteUser(username);
        logger.debug("Delete user for username: {}", username);
    }
}

後記

由於自身能力有限,若有錯誤或者不當之處,還請大家批評指正,一起學習交流!

GitHub 源碼地址:springboot-jdbctemplate

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章