如果JDBC使用的好,那么代码的性能肯定是最好的,但是太多的try…catch…finally语句需要处理,数据库资源的打开和关闭都是定性的,这些都是比较固定的模式,许多开发者使用JDBC时滥用try…catch…finally语句,使得代码的可读性和可维护性很差,所以,Spring提供了自己的方案:JdbcTemplate,在Hibernate和Mybatis出现之后这是一个不经常使用的技术,今天可以了解一下用法。
首先引入依赖:
<!--Spring 的JDBC模板操作-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.2.8.RELEASE</version>
</dependency>
需要配置数据源和JdbcTemplate,这里采用xml的形式将这两个类交给Spring进行管理
<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC"/>
<property name="username" value="用户名"/>
<property name="password" value="密码"/>
</bean>
<bean id="jdbcTempalte" class="org.springframework.jdbc.core.JdbcTemplate">
<constructor-arg name="dataSource" ref="datasource"/>
</bean>
这里采用的setter方法进行依赖注入,四个核心配置要根据自己进行配置
看一下pojo类:
public class Student3 {
private Integer sid;
private String sname;
private String ssex;
private Integer sage;
public Student3(Integer sid, String sname, String ssex, Integer sage) {
this.sid = sid;
this.sname = sname;
this.ssex = ssex;
this.sage = sage;
}
public Student3() {
}
@Override
public String toString() {
return "Student3{" +
"sid=" + sid +
", sname='" + sname + '\'' +
", ssex='" + ssex + '\'' +
", sage=" + sage +
'}';
}
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getSsex() {
return ssex;
}
public void setSsex(String ssex) {
this.ssex = ssex;
}
public Integer getSage() {
return sage;
}
public void setSage(Integer sage) {
this.sage = sage;
}
}
测试query查询的功能:
public class JDBCTempalte {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-config1.xml");
JdbcTemplate jdbcTempalte = (JdbcTemplate) context.getBean("jdbcTempalte");
String sql = "select * from student3";
List<Student3> query = jdbcTempalte.query(sql, new Student3Mapper());
Iterator<Student3> iterator = query.iterator();
while (iterator.hasNext()) {
Student3 student3 = iterator.next();
System.out.println(student3);
}
}
}
class Student3Mapper implements RowMapper<Student3> {
@Override
public Student3 mapRow(ResultSet resultSet, int i) throws SQLException {
classes.bean.Student3 student3 = new classes.bean.Student3();
student3.setSage(resultSet.getInt("sid"));
student3.setSname(resultSet.getString("sname"));
student3.setSsex(resultSet.getString("ssex"));
student3.setSage(resultSet.getInt("sage"));
return student3;
}
}
需要注意的是这里的方法:
这里的query是JdbcTemplate封装好的方法,所以我们只需要对方法的作用以及参数熟悉即可,参数大致可以分为几类
- String sql:传入sql语句
- RowMapper< T > rowMapper:将从数据库中获取到的值转换为pojo类进行映射返回
- Object… args:可变参数,这里用于插入,多条件查询时,有可能需要传入多个参数
下面演示一下其他的功能
增加:
String sql2 = "insert into student3 values(?,?,?,?)";
int updateNum = jdbcTempalte.update(sql2, 10, "小明", "男", 14);
System.out.println("影响的个数:"+updateNum);
执行完这些代码后,再进行查询整个表中的数据,打印结果:
修改:
这里将小明的sid改为3
String sql4 = "update student3 set sid=? where sid=?";
int update = jdbcTempalte.update(sql4, 3, 10);
System.out.println(update);
查看打印结果:
删除:
通过sid删除小明该条记录
String sql3 = "delete from student3 where sid=?";
int updateNum2 = jdbcTempalte.update(sql3, 3);
System.out.println("影响的个数:"+updateNum2);
打印结果:
实际上,JdbcTemplate的增删改查方法远远不止这些,而且随着功能的复杂需要注意更多的东西,但是由于它并不是当前常用的持久层技术,所以今天这篇文章只是了解,就不做深入研究了。
之前有评论说这个i是什么意思?
我在下面进行了打印,看一下结果:
发现,这个i就是用来标识是第几条记录的,我们的业务代码不会用到,但是在JdbcTemplate的内部进行了调用。