基本介绍
JdbcTemplate是spring提供的用来操作数据库的一个类,功能十分强大,我们只需传入一个DataSource便可以进行各种crud操作。
准备工作
导入相应jar包
要使用JdbcTemplate第一步就是要先引入相应的jar包,由于要操作数据库,也要引入连接数据库的jar包,还有就是数据库连接池技术的包,下面我用的是c3p0。
前缀为spring的包都在spring的那个文件夹中,直接复制过来即可。
创建配置数据库配置文件
在src下面创建一个properties配置文件,将数据库的配置信息写入该配置文件
#数据库登录的用户名
jdbc.name=root
#数据库登录的密码
jdbc.password=root
#连接驱动
jdbc.driver=com.mysql.jdbc.Driver
#要连接的数据库
jdbc.url=jdbc:mysql://localhost:3306/study
spring配置文件中配置
需要在spring配置文件中指定c3p0连接数据库所需的配置信息,以及要注入JdbcTemplate的DataSource
<!--引入外部配置文件-->
<context:property-placeholder location="mysql_info.properties"/>
<!--配置数据库源信息-->
<bean class="com.mchange.v2.c3p0.ComboPooledDataSource" id="dataSource">
<property name="user" value="${jdbc.name}"/>
<property name="password" value="${jdbc.password}"/>
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
</bean>
<!--将数据源注入JdbcTemplate-->
<bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
创建一个测试表
下面为表的字段以及表信息
然后再创建一个User类来和该表对应,如下
public class User {
private Integer uid;
private String username;
private String password;
public User(Integer uid, String username, String password) {
this.uid = uid;
this.username = username;
this.password = password;
}
@Override
public String toString() {
return "User{" +
"uid=" + uid +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
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;
}
public User() {
}
}
下一步就是创建一个测试类,将JdbcTemplate定义为成员属性
ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
JdbcTemplate jdbcTemplate = ioc.getBean(JdbcTemplate.class);
JdbcTemplate常见方法
update增删改操作
使用这个方法可以进行增删改操作,可以传入不同参数
这里演示对user表插入一条数据,update返回值就是影响的行数,update里面sql后面的参数就是填充在sql语句中的?位置
@Test
public void t1() {
String sql = "insert into user value(null,?,?)";
int affected = jdbcTemplate.update(sql, "lufei", "lufei456");
System.out.println(affected);
}
执行后的数据库如下,插入没有问题,删除和修改类似的
batchUpdate进行批量操作
上面对数据库的增删改是一条语言,我们使用batchUpdate可以对数据库进行批处理操作,该方法支持的参数如下
下面演示向user表批量插入2条数据,我们只需传入sql语句和一个list集合即可,list集合存放参数数组,返回值就是每条语句影响的行数
@Test
public void t2() {
String sql = "insert into user value(null,?,?)";
List<Object[]> list = new ArrayList<>();
list.add(new Object[]{"luck", "luck888"});
list.add(new Object[]{"waysn", "ysnyyds"});
int[] batchUpdate = jdbcTemplate.batchUpdate(sql, list);
System.out.println(Arrays.toString(batchUpdate));
}
运行后user表如下
selectForObject查询单行单列
查询单行单列就是使用selectForObject,该方法支持参数如下
下面演示使用该方法查询user表的行数
@Test
public void t3() {
String sql = "select count(*) from user";
Integer count = jdbcTemplate.queryForObject(sql, Integer.class);
System.out.println(count);
}
输出如下,没有问题,上面的queryForObject我们在sql语句后面传入的参数就是查询返回的类型
selectForObject查询单行
我们还是使用这个方法进行查询,只不过要传入的参数就是该表对应的bean的class,这里就是要传入User.class。(注意:bean的属性名要和数据库表的字段名相对应)。并且由于JdbcTemplate要求传入的是一个RowMapper接口,我们需要传入一个该接口的具体实现类。该接口的实现类如下
我们这里选择第一个,因为看起来最有可能是,查看源码,发现构造器有以下注释
注释说明会对表字段进行映射,那么就是这个类了,将User对象通过构造器构建这个类即可,最终代码如下
@Test
public void t4() {
String sql = "select * from user where uid = ?";
User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(User.class), 1);
System.out.println(user);
}
控制台输出如下
query查询多行
上面是查询单行,这里使用query就是查询多行了,首先还是看看query方法支持的参数
可以看见,query的重载方法特别多,但是我们只需要看返回是一个集合的参数即可,发现也是传入一个RowMapper,那么通过上面的queryForObject我们知道传入一个BeanPropertyRowmapper即可,将表对应的bean通过构造器传入。
下面就是查询user表中的所有记录
@Test
public void t5() {
String sql = "select * from user";
List<User> users = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
for (User user : users) {
System.out.println(user);
}
}
输出如下
扩展(NameParameterJdbcTemplate)
NameParameterJdbcTemplate这个类可以通过具名参数进行查询,相当于使用名称来代替sql语言中的?,能够更直观的知道sql语句的意义。
使用前准备工作
和JdbcTemplate一样,使用该类,也需要配置这个类的DataSource,下面在spring配置文件中配置NameParameterJdbcTemplate,注入所需的DataSource
<bean class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate" id="namedParameterJdbcTemplate">
<constructor-arg ref="dataSource"/>
</bean>
由于我使用的是单元测试,为了方法,将NameParameterJdbcTemplate定义为成员属性
NamedParameterJdbcTemplate namedParameterJdbcTemplate = ioc.getBean(NamedParameterJdbcTemplate.class);
具名update增删改操作(Map)
先来看一下update支持的参数
下面我们来使用该方法修改id的3的user的username和password
@Test
public void t6() {
String sql = "update user set username=:name,password=:pwd where uid=:id";
Map<String, Object> map = new HashMap<>();
map.put("id", 3);
map.put("name", "ttpfx");
map.put("pwd", "ttpfx123");
int affected = namedParameterJdbcTemplate.update(sql, map);
System.out.println(affected);
}
对上面的代码进行解释,在sql语句中的:name,:pwd,:id就相当于?占位符,在对数据库进行操作时会进行替换,而具名参数就是使用相同的参数进行替换,例如:name就会使用name对应的值进行替换,而:pwq就会使用pwd对应的值进行替换。在上面代码中,对应的值的意思就是在map中该参数对应的value。相当于:name会用ttpfx进行替换,:pwd会用ttpfx123进行替换。
运行代码,下面展示的是运行前和运行后的user表
具名update增删改操作(Object)
上面我们在update中使用的含有Map参数的方法,但是还有其他的方法是传入一个SqlParameterSource,这里来进行演示。
由于SqlParameterSource是一个接口,所以我们传入的肯定是该接口的实现类,下面展示该接口的实现类
我们选择的是BeanPropertyParameterSource,该类的构造器如下,根据注释推测应该就是我们要寻找的类
下面使用对象的方式,往user表添加一条记录
@Test
public void t7() {
String sql = "insert into user value (:id,:username,:password)";
User user = new User(null, "lufei", "lufei123");
int affected = namedParameterJdbcTemplate.update(sql, new BeanPropertySqlParameterSource(user));
System.out.println(affected);
}
上面代码中的sql语句中的:id,:username,:password就相当于?占位符,最终会替换为我们我们定义的user中的相应值(注意属性名要相同),执行代码,下面展示user执行前和执行后的截图
总结
上面就讲解了使用spring的JdbcTemplate和NameParameterJdbcTemplate对数据库的基本增删改查操作,这个还是比较简单的,很多方法类似的,直接类推即可。