目录
01、写在前面
02、项目依赖
03、创建模型脚本
04、读取数据库
05、Controller
06、开始测试
本文由bingo创作,授权我原创发布。
Tiger和他朋友们的原创技术文章,请关注wx “跟哥一起学python”,ID “tiger-python”。不止Python!!
在大多数的项目开发中,我们都有把数据存入数据库和从数据库中读取的操作,所以与数据库打交道是必不可少的。
众所周知,spring提供了很多工具,我们拿来就可以用,使我们的项目开发更方便、快捷(作为一个拿来主义者,很稀饭这种方式),今天我们就来看看springboot中如何从数据库中读取数据的。
一般来说,springboot中读取数据库的方式主要有两种:JdbcTemplate和Jpa,今天我们先讲讲JdbcTemplate。
首先,我们理一下数据库操作的一般流程。通常我们操作数据库都需要创建连接和资源、从数据库中读取数据、异常处理和关闭资源的流程,代码大概如下:
public Student findOne(String name) throws SQLException {
Connection connection = null;
PreparedStatementstatement = null;
ResultSet resultSet= null;
try {
//1. 创建连接和各种资源
connection =dataSource.getConnection();
statement =connection.prepareStatement(
"select id,name, grade from student");
statement.setString(1, id);
resultSet =statement.executeQuery();
//2. 从resultSet中取出数据库中数据来初始化Student
Student Student = null;
if(resultSet.next()){
resultSet = new Student(
resultSet.getString("id"),
resultSet.getString("name"),
resultSet.getString("grade"),));
}
return Student;
} catch (SQLException e){
//3.处理异常
}
finally {
//4.释放资源
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e){}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e){}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e){}
}
}
return null;
}
但是,看看上面那么大篇幅的代码,我们真正业务相关的就只有从数据库中读取那4行代码,其它的代码都是一些辅助和善后操作。
而JdbcTemplate就是对上面代码的封装,我们就只关心我们的业务代码啦,其它的创建资源,释放资源这些操作就由JdbcTemplate代我们效劳了。
本来还想说点啥,但是有位大神说过:talk is cheap, show me the code,所以......我还是shutup,直接撸代码吧。
先上项目依赖:
com.fasterxml.jackson.core
jackson-databind
2.11.0
org.springframework.boot
spring-boot-starter-thymeleaf
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-data-jdbc
org.springframework.boot
spring-boot-starter-data-jpa
com.h2database
h2
runtime
作为一个web项目,使用了spring-boot-starter-web和thymeleaf,使用了jackson-databind的ObjectMapper把类对象转换城json串,本节讲的是JdbcTemplate方式,所以spring-boot-starter-data-jdbc必不可少,数据库测试我们使用了h2,嵌入式的内存数据库。
今天的主角是一张学生表,我们的操作就是从学生表中读取学生数据并呈现。
我们先创建学生表schema.sql并放入resources目录下,这样项目启动的时候就会执行这个sql脚本。
CREATE TABLE IF NOT EXISTS STUDENT(id bigint identity primary key,
name varchar(20) not null,
grade varchar(20) not null
);
然后再创建data.sql,插入初始数据,同样放入resources目录下,这个脚本在项目启动的时候也会执行。
delete fromstudent;
insert into student(name, grade) values ('bb', '01');
insert into student(name, grade) values ('cc', '02');
创建好后目录结构像这样:
同样,代码中也需要一个student的模型,内部数据和数据库的一样:
public class Student { private Long ID;
private String name;
private String grade;
public Student(Long ID, String name, String grade) {
this.ID = ID;
this.name = name;
this.grade = grade;
}
public Long getID() {
return ID;
}
public void setID(Long ID) {
this.ID = ID;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGrade() {
return grade;
}
}
作为一个拿来主义者,最不爽的就是看别人文章时,只有部分代码,看的我云里雾里,晕头转向。所以我一点不能做那个自己讨厌的人。
下面是从数据库读取的代码,也是本篇文章的核心部分:
@Repositorypublic class StudentRepository{
@Autowired
private JdbcTemplate jdbcTemplate;
public Student findStudentByName(String name) {
return jdbcTemplate.queryForObject("select * from student where name = ?", new RowMapper() {
@Override
public Student mapRow(ResultSet resultSet, int i) throws SQLException {
return new Student(resultSet.getLong("id"),
resultSet.getString("name"),
resultSet.getString("grade"));
}
}, name);
}
}
@Reponsitory标识这是一个跟数据库相关的Bean,会被自动扫描和实例化,JdbcTemplate添加上Autowired注解后拿来就可以用,这里我们使用的是它的queryForObject方法来从数据库中获取数据。可以看到,queryForObject方法的参数除了接收一条sql语句外,还需要一个RowMapper的实现类,在实现类中去读取数据。对比之前代码中的那一大段,这儿就浓缩成了几行,代码简洁了很多。
Web项目肯定要写controller来进行测试咯,下面是controller代码:
@Controllerpublic class JdbcController {
@Autowired
private StudentRepository responsitory;
@Autowired
private ObjectMapper mapper;
@GetMapping("/jdbc")
public String queryStudent(@RequestParam("name") String name, Model model) {
Student student = responsitory.findStudentByName(name);
try {
model.addAttribute("student", mapper.writeValueAsString(student));
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return "index";
}
}
Controller中从url参数中获取学生姓名,然后调用上面提供的接口来获取student,再把student转换成json串,放入model中,然后返回前端视图index。
好啦,我们来测试一下,运行程序,访问http://localhost:8080/h2-console,看下数据是否真的插入进数据库了。
正常!
作为拿来主义者,必须要告诉你,h2console必须要配置spring.h2.console.enabled=true才可访问。
再访问http://localhost:8080/jdbc?name=cc,看下从数据库查询数据是否正常?
完美!
但是你可能会好奇前端是怎么显示的,所以,拿走不谢:
示例
ID
姓名
年级
{{student.id}}
{{student.name}}
{{student.grade}}
这里用了一点Vue的东西,俺最近也在学。
下次我们讲讲Jpa是怎么做的。
本文由bingo创作,授权我原创发布。
Tiger和他朋友们的原创技术文章,请关注wx “跟哥一起学python”,ID “tiger-python”。不止Python!!