Spring中怎么操作JDBC
创始人
2024-12-23 05:20:56
0次

获取数据库连接

在这之前,我们首先通过Spring获得对数据库的连接,创建一个Java项目,导入Spring、c3p0、数据库驱动的jar包即可,然后创建一个数据表做测试:

create table user( id integer primary key auto_increment, name varchar(20), password varchar(20) );

接下来创建Spring的配置文件并作如下配置:

测试数据库连接是否能够成功获取:

public class SpringJDBCTest { private ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); @Test public void testConnection() throws SQLException { DataSource dataSource = ctx.getBean(DataSource.class); System.out.println(dataSource.getConnection()); }}

运行结果:

com.mchange.v2.c3p0.impl.NewProxyConnection@5d47c63f

能够成功获取到数据库连接。

对数据表进行更新操作

传统的JDBC用法相信大家都很熟悉,在Spring中并没有什么特别的,无非是将Bean的生命周期交给了IOC容器管理,而Spring框架独立出了一套API用于数据库操作(JDBCTemplate)。接下来分别测试一下常见的数据库操作,先将JDBCTemplate类放入容器:

该类需要一个参数,参数值指向刚才配置的dataSource即可,这样我们就能够使用JDBCTemplate类了,先测试一下插入操作:

@Test public void testInsert() { JdbcTemplate jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate"); String sql = "insert into user(name,password) values(?,?)"; Object[] args = {"zhangsan","12345"}; jdbcTemplate.update(sql,args); }

执行代码,查询表结果,插入成功。

mysql> select * from user;+----+----------+----------+| id | name  | password |+----+----------+----------+| 1 | zhangsan | 12345 |+----+----------+----------+1 row in set (0.00 sec)

接着测试一下数据表的修改操作:

@Test public void testUpdate() { JdbcTemplate jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate"); String sql = "update user set password = ? where id = ?"; Object[] args = {"admin","1"}; jdbcTemplate.update(sql,args); }

执行代码,查询表结果,修改成功。

mysql> select * from user;+----+----------+----------+| id | name  | password |+----+----------+----------+| 1 | zhangsan | admin |+----+----------+----------+1 row in set (0.00 sec)

数据表的删除操作与其类似,不做重复测试,接下来我们测试一下批量操作:

@Test public void testBatchInsert() { JdbcTemplate jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate"); String sql = "insert into user(name,password) values(?,?)"; List batchArgs = new ArrayList(); batchArgs.add(new Object[]{"lisi","123"}); batchArgs.add(new Object[]{"wangwu","1234"}); batchArgs.add(new Object[]{"zhaoliu","12345"}); jdbcTemplate.batchUpdate(sql, batchArgs); }

此时的一个对象数组即为一条记录,批量操作则需要泛型为Object数组的集合。

执行代码,查询表结果,批量插入成功。

mysql> select * from user;+----+----------+----------+| id | name  | password |+----+----------+----------+| 1 | zhangsan | admin || 2 | lisi  | 123  || 3 | wangwu | 1234  || 4 | zhaoliu | 12345 |+----+----------+----------+4 rows in set (0.00 sec)

最后是数据表的查询操作,首先创建数据表对应的User类:

package com.wwj.spring.jdbc;public class User { private Integer id; private String name; private String password; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", password=" + password + "]"; }}

编写测试代码:

@Test public void testGet() { JdbcTemplate jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate"); String sql = "select id,name,password from user where id = ?"; RowMapper rowMapper = new BeanPropertyRowMapper(User.class); User user = jdbcTemplate.queryForObject(sql, rowMapper,1); System.out.println(user); }

运行结果如下:

User [id=1, name=zhangsan, password=admin]

在Spring中,查询的结果是交给了RowMapper来处理的,RowMapper用来指定映射结果集行数据的方式,相对于传统的ResultSet来说,RowMapper省去了遍历结果集的重复操作,从而使查询变得更简单。

而查询多条数据的方式如下:

@Test public void testGetMore() { JdbcTemplate jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate"); String sql = "select id,name,password from user where id > ?"; RowMapper rowMapper = new BeanPropertyRowMapper<>(User.class); List userList = jdbcTemplate.query(sql, rowMapper,2); System.out.println(userList); }

运行结果:

[User [id=3, name=wangwu, password=1234], User [id=4, name=zhaoliu, password=12345]]

有些同学可能会想当然地认为,查询多条数据要调用queryForList()方法,事实上,调用的是query()方法。需要注意的是,JDBCTemplate提供的API不支持级联属性。

获取数据表单列的值:

@Test public void testSingleValue() { JdbcTemplate jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate"); String sql = "select name from user where id = ?"; String name = jdbcTemplate.queryForObject(sql, String.class,1); System.out.println(name); }

运行结果如下:

zhangsan

整个增删改查的过程其实都没有任何难度,这和之前学的数据库操作API区别并不大,所以也没有特别需要讲解的地方,通过一些测试代码应该就能够理解了。

使用具名参数

在经典的JDBC用法中,sql参数是用占位符"?"表示,并且受到位置的限制,定位参数的问题在于,一旦改变参数的顺序,就必须改变参数的绑定方式。

为了解决这个问题,Spring为我们提供了另一种选择:使用具名参数。

使用具名参数后,sql将按名称而不是位置进行指定,具名参数更易于后期维护,也提升了代码的可读性,具名参数只在NamedParameterJdbcTemplate类中得到支持。

要想使用具名参数,首先将NamedParameterJdbcTemplate放入容器:

该类没有无参的构造器,通常使用参数为DataSource类型的构造器。

这里以插入数据举例具名参数的使用:

@Test public void testNamedParameterJdbcTemplate() { NamedParameterJdbcTemplate namedParameterJdbcTemplate = (NamedParameterJdbcTemplate) ctx.getBean("namedParameterJdbcTemplate"); String sql = "insert into user(name,password) values(:name,:psd)"; Map map = new HashMap(); map.put("name", "wangweijun"); map.put("psd", "112233"); namedParameterJdbcTemplate.update(sql,map); }

执行代码,查询表结果,插入成功。

mysql> select * from user;+----+------------+----------+| id | name  | password |+----+------------+----------+| 1 | zhangsan | admin || 2 | lisi  | 123  || 3 | wangwu  | 1234  || 4 | zhaoliu | 12345 || 5 | wangweijun | 112233 |+----+------------+----------+5 rows in set (0.00 sec)

虽然具名参数有很多好处,但无形中也增加了很多代码,可以说比之前的方式更加复杂。

当然,它还有更简单的实现方式:

@Test public void testSimpleNamedParameterJdbcTemplate() { NamedParameterJdbcTemplate namedParameterJdbcTemplate = (NamedParameterJdbcTemplate) ctx.getBean("namedParameterJdbcTemplate"); String sql = "insert into user(name,password) values(:name,:password)"; User user = new User(); user.setName("zhaoliu"); user.setPassword("223344"); SqlParameterSource paramSource = new BeanPropertySqlParameterSource(user); namedParameterJdbcTemplate.update(sql, paramSource); }

执行代码,查询表结果,插入成功。

mysql> select * from user;+----+------------+----------+| id | name  | password |+----+------------+----------+| 1 | zhangsan | admin || 2 | lisi  | 123  || 3 | wangwu  | 1234  || 4 | zhaoliu | 12345 || 5 | wangweijun | 112233 || 6 | zhaoliu | 223344 |+----+------------+----------+6 rows in set (0.00 sec)

这种方式实现了通过对象自动匹配具名参数,前提是具名参数的参数名要和类中的属性名相同,该方式相对于第一种方式要更合理一些,因为从前台传递过来的就是对象,这样就可以直接通过对象进行处理而无需其它操作。

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...