目录
JdbcTemplate是spring提供的用来操作数据库的一个类,功能十分强大,我们只需传入一个DataSource便可以进行各种crud操作。
要使用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配置文件中指定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);
使用这个方法可以进行增删改操作,可以传入不同参数
这里演示对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可以对数据库进行批处理操作,该方法支持的参数如下
下面演示向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,该方法支持参数如下
下面演示使用该方法查询user表的行数
- @Test
- public void t3() {
- String sql = "select count(*) from user";
- Integer count = jdbcTemplate.queryForObject(sql, Integer.class);
- System.out.println(count);
- }
输出如下,没有问题,上面的queryForObject我们在sql语句后面传入的参数就是查询返回的类型
我们还是使用这个方法进行查询,只不过要传入的参数就是该表对应的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的重载方法特别多,但是我们只需要看返回是一个集合的参数即可,发现也是传入一个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这个类可以通过具名参数进行查询,相当于使用名称来代替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支持的参数
下面我们来使用该方法修改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中使用的含有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对数据库的基本增删改查操作,这个还是比较简单的,很多方法类似的,直接类推即可。