使用JDBCTemplate更新数据库
使用sql语句和参数更新数据库(update)
public int update(String sql, Object ...args){
throw DataAccessException;
}
批量更新数据库(batchUpdate)
public int[] batchUpdate(String sql, List<Object[]>batchArgs)
查询单行(queryForObject)
public <T> T queryForObject(String sql, ParameterizedRowMapper<T> rm, Object ...args){
throw DataAccessException;
}
便利的BeanPropertyRowMapper实现
Class ParameterizedBeanPropertyRowMapper<T>
查询多行(query)
public <T> List<T> query(String sql, ParameterizedRowMapper<T> rm, Object ...args){
throw DataAccessException;
}
单值查询(queryForObject)
public <T> queryForObject(String sql, Class<T> requiredType, Object ...args){
throw DataAccessException;
}
通过JDBC连接数据库
首先引入相关的jar包
数据配置文件(db.properties)
jdbc.user=postgres
jdbc.password=******
jdbc.driverClass=org.postgresql.Driver
jdbc.jdbcUrl=jdbc:postgresql://localhost:5432/database
jdbc.initPoolSize=5
jdbc.maxPoolSize=10
之后是Spring配置文件
<context:property-placeholder location="classpath:db.properties"/>
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
<property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
</bean>
测试类(检测我们是否可以得到数据库连接对象)
public class JDBCTest {
private ApplicationContext ctx = null;
{
ctx = new ClassPathXmlApplicationContext("application-context.xml");
}
@Test
public void test() throws SQLException {
DataSource dataSource = ctx.getBean(DataSource.class);
System.out.println(dataSource.getConnection());
}
}
测试修改操作
首先在数据库中建立两个表
department数据属性:
employee数据属性:
更改操作的代码
@Test
public void testUpdate(){
String sql = "update employees set email=? where id=? ";
jdbcTemplate.update(sql, "rhf0410@gmail.com", 1);
}
批量更改操作
@Test
public void testBatchUpdate(){
String sql = "insert into employees(id, last_name, email, dept_id) values(?, ?, ?, ?) ";
List<Object[]>args = new ArrayList<>();
args.add(new Object[]{2, "Xu", "test0409@test.com", 1});
args.add(new Object[]{3, "Li", "test0410@test.com", 1});
args.add(new Object[]{4, "Hu", "test0411@test.com", 1});
jdbcTemplate.batchUpdate(sql, args);
}
从数据库中获取其中的一个对象
@Test
public void testQueryForObject(){
String sql = "select id, last_name, email from employees where id=? ";
RowMapper<Employee>rowMapper = new BeanPropertyRowMapper<>(Employee.class);
Employee employee = jdbcTemplate.queryForObject(sql, rowMapper, 1);
System.out.println(employee);
}
- RowMapper指定如何去映射结果集的行,常用的实现类为BeanPropertyRowMapper。
- 使用SQL中列的别名完成列名和类的属性名映射,例如last_name, lastName。
- 不支持级联属性。JdbcTemplate只是JDBC的工具,不是ORM框架。
查询数据库中的对象集合
@Test
public void testQueryForList(){
String sql = "select id, last_name, email from employees where id > ? ";
RowMapper<Employee>rowMapper = new BeanPropertyRowMapper<>(Employee.class);
List<Employee>employees = jdbcTemplate.query(sql, rowMapper, 1);
System.out.println(employees);
}
获取单个列的值或者做统计查询
@Test
public void testQueryForList2(){
String sql = "select count(id) from employees ";
long count = jdbcTemplate.queryForObject(sql, Long.class);
System.out.println(count);
}
在JDBC模板中使用具名参数
配置文件
<bean id="namedParameterJdbcTemplate"
class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg ref="dataSource"></constructor-arg>
</bean>
测试类
@Test
public void testNamedParameterJdbcTemplate(){
String sql = "insert into employees(id, last_name, email, dept_id) values(:id, :ln, :email, :deptId) ";
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("id", 5);
paramMap.put("ln", "Zhang");
paramMap.put("email", "Zhang0413@test.com");
paramMap.put("deptId", 1);
namedParameterJdbcTemplate.update(sql, paramMap);
}
使用具名参数的优点:
有多个参数,则不用再去对应配置。直接对应参数名,便于维护。
使用具名参数的缺点:
较为麻烦。
使用具名参数时可以使用update(String sql, SqlParameterSource paramSource)方法进行更新操作。好处是可以通过SqlParameterSource的实现类直接传入一个对象。语句中的参数名要和类的属性一致。使用SqlParameterSource的BeanPropertySqlParameterSource实现类作为参数。
网友评论