直接在 Java 程序中使⽤ JDBC ⽐较复杂,需要 7 步才能完成数据库的操作:
关键代码如下:
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;
添加依赖
在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());
}
}
}