Spring Boot 从入门到精通(四)Spring Boot 使⽤ JDBC 操作数据库

直接在 Java 程序中使⽤ JDBC ⽐较复杂,需要 7 步才能完成数据库的操作:

  • 加载数据库驱动
  • 建⽴数据库连接
  • 创建数据库操作对象
  • 定义操作的 SQL 语句
  • 执⾏数据库操作
  • 获取并操作结果集
  • 关闭对象,回收资源

关键代码如下:

try {
// 1、加载数据库驱动
Class.forName(driver);
// 2、获取数据库连接
conn = DriverManager.getConnection(url, username, password);
// 3、获取数据库操作对象
stmt = conn.createStatement();
// 4、定义操作的 SQL 语句
String sql = "select * from user where id = 6";
// 5、执⾏数据库操作
rs = stmt.executeQuery(sql);
// 6、获取并操作结果集
while (rs.next()) {
// 解析结果集
}
} catch (Exception e) {
// ⽇志信息
} finally {
// 7、关闭资源
}

Spring Boot 针对 JDBC 的使⽤提供了对应的 Starter 包: spring-boot-starter-jdbc,它其实就是在 SpringJDBC 上做了进⼀步的封装,⽅便在 Spring Boot ⽣态中更好的使⽤ JDBC

一、创建用户表

Spring Boot 集成 JDBC 很简单,需要引⼊依赖并做基础配置即可,在开发项⽬之前需要先创建表,作为项⽬演示使⽤。设计⼀个 User ⽤户表,有 id、 name、 password、 age 等字段,对应的 SQL 脚本如下:

DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`name` varchar(32) DEFAULT NULL COMMENT '⽤户名',
`password` varchar(32) DEFAULT NULL COMMENT '密码',
`age` int DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

二、在springboot中添加配置

添加依赖

在pom.xml中添加如下依赖

	<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

演示中使⽤ MySQL 作为数据库,因此项⽬中需要引⼊ MySQL 驱动包,同时引⼊ spring-boot-starterjdbc。

添加配置
在application.properties添加数据源

spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnico
de=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

值得注意的是,在 Spring Boot 2.1.0 中, com.mysql.jdbc.Driver 已经过期,推荐使⽤com.mysql.cj.jdbc.Driver

创建实体类和用户逻辑

创建userMysql类

public class userMysql {
    private long id;
    private String name;
    private String password;
    private int age;

    public userMysql(String name, String password, int age) {
        this.name = name;
        this.password = password;
        this.age = age;
    }
	// 省略 getter setter
}

创建 UserRepository 定义我们常⽤的增删改查接⼝:

public interface IUserRepositry {
    int add(userMysql user);
    int delete(userMysql user);
    int update(userMysql user);
    List<userMysql> findAll();
    userMysql findById(long id);
}

创建UserRepositoryImpl类实现接口:

@Repository
public class userRepositoryImpl implements IUserRepositry {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public int add(userMysql user) {
        return jdbcTemplate.update(
                "INSERT INTO users(name, password, age) values(?, ?, ?)"
                ,user.getName()
                ,user.getPassword()
                ,user.getAge());
    }

    @Override
    public int delete(long id) {
        return jdbcTemplate.update(
                "DELETE FROM users from where id = ?",id);
    }

    @Override
    public int update(userMysql user) {
        return jdbcTemplate.update(
                "UPDATE INTO users(name, password, age) values(?, ?, ?)"
                ,user.getName()
                ,user.getPassword()
                ,user.getAge());
    }

    @Override
    public List<userMysql> findAll() {
        return jdbcTemplate.query(
                "select * from users",new userRowMapper());
    }

    @Override
    public userMysql findById(long id) {
        return jdbcTemplate.queryForObject(
                "select * from users where id = ?"
                ,new Object []{id}
                ,new BeanPropertyRowMapper<userMysql>(userMysql.class));
        /**
         * 这⾥使⽤了 new BeanPropertyRowMapper(User.class)
         * 对返回的数据进⾏封装,它可⾃动将⼀⾏数据映射到指定类的实例中,
         * ⾸先将这个类实例化,然后通过名称匹配的⽅式,映射到属性中去。
         * */
    }

    class userRowMapper implements RowMapper<userMysql> {

        @Override
        public userMysql mapRow(ResultSet resultSet, int i) throws SQLException {
            userMysql user = new userMysql();
            user.setId(resultSet.getLong("id"));
            user.setAge(resultSet.getInt("age"));
            user.setPassword(resultSet.getString("password"));
            user.setName(resultSet.getString("name"));
            return user;
        }
    }
}

@Repository (value=“userDao”) 注解是告诉 Spring,让 Spring 创建一个名字叫 “userDao” 的 UserDaoImpl 实例。

当 Service层 需要使用 Spring 创建的名字叫 “userDao” 的 UserDaoImpl 实例时,就可以使用 @Resource (name = “userDao”) 注解告诉 Spring,Spring 把创建好的 userDao 注入给 Service层 即可

而@Autowired实现的是自动注入,不需要指定实例,自动生成实例来实现相应的服务。

测试

在test/java中创建测试类mysqlTest.java,进行测试
降IUserRepository注入

 @RunWith(SpringRunner.class)
@SpringBootTest
public class mysqlTest {

    @Autowired
    private IUserRepositry userRepositry;

    @Test
    public void add(){
        userMysql user = new userMysql(
                "xsj",
                "123",
                18);
        userRepositry.add(user);
    }

    @Test
    public void findAll(){
        List<userMysql> users = new ArrayList<>();
        users = userRepositry.findAll();
        for(userMysql user : users){
            System.out.println("name="+user.getName());
            System.out.println("age="+user.getAge());
            System.out.println("password="+user.getPassword());
        }
    }

}

你可能感兴趣的:(java,数据库,SpringBoot)