使用JdbcTemplate和RowMapper查询数据库

记得最开始学习使用数据库的时候都是使用底层的JDBC直接访问的,主要分成三个部分,

  1. 通过数据库的配置信息(DRIVER,URL,USERNAME,PASSWORD)去获取数据库连接;
  2. 通过PreparedStatement执行SQL语句;
  3. 通过ResultSet接收查询结果。

JdbcTemplate就是对JDBC的一种封装,使用起来更加的方便,但是JDBC的效率要比JdbcTemplate的效率要高一些,就像数组和List集合一样,毫无疑问,集合使用起来要比数组方便,功能更加的强大,但是数组的效率要比集合高得多。

RowMapper则主要是用来映射实体和数据库表,个人理解和ResultSet有些类似的地方,废话不多说,进入正题。

测试demo是搭建在SpringBoot上的。

首先准备一张用户表(MySQL)

DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user`  (
  `user_id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `gender` int(3) NOT NULL,
  `phone` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `note` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
  PRIMARY KEY (`user_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

UserForm.java

package priv.cwr.model.vo;

import com.fasterxml.jackson.annotation.JsonProperty;

public class UserForm {
    @JsonProperty("user_id")
    private Long userId;
    
    private String name;
    
    private Integer gender;
    
    private String phone;
    
    private String note;

    public String toString(){
        return "user_id:" + this.userId
                + ",name:" + this.name
                + ",gender:" + this.gender
                + ",note:" + this.note;
    }

    /**
     * 省略getter()、setter()
     */
}

UserRowMapper.java

package priv.cwr.rowmapper;
import org.springframework.jdbc.core.RowMapper;
import priv.cwr.model.vo.UserForm;
import java.sql.ResultSet;
import java.sql.SQLException;

public class UserRowMapper implements RowMapper<UserForm> {
    @Override
    public UserForm mapRow(ResultSet resultSet, int i) throws SQLException {
        UserForm user = new UserForm();
        //需要映射的字段
        user.setUserId(resultSet.getLong("user_id"));
        user.setName(resultSet.getString("name"));
        user.setGender(resultSet.getInt("gender"));
        user.setPhone(resultSet.getString("phone"));
        user.setNote(resultSet.getString("note"));
        return user;
    }
}

测试方法

package priv.cwr;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.test.context.junit4.SpringRunner;
import priv.cwr.model.vo.UserForm;
import priv.cwr.rowmapper.UserRowMapper;

import java.util.ArrayList;
import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
public class JpaDemoApplicationTests {
	@Test
	public void contextLoads() {
		DriverManagerDataSource dataSource = new DriverManagerDataSource();
		dataSource.setDriverClassName("com.mysql.jdbc.Driver");
		dataSource.setUrl("jdbc:mysql://localhost:3306/java?characterEncoding=utf-8&useOldAliasMetadataBehavior=true");
		dataSource.setUsername("root");
		dataSource.setPassword("root");
		JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

		//查询单个用户(使用已经定义好的RowMapper,如这里的UserRowMapper)
		UserForm userForm1 = jdbcTemplate.queryForObject("SELECT * FROM t_user WHERE user_id = 1", new UserRowMapper());
		System.out.println("userForm1 -> " + userForm1);

		//使用一次性的RowMapper
		UserForm userForm2 = jdbcTemplate.queryForObject("SELECT * FROM t_user WHERE user_id = 2", new RowMapper<UserForm>() {
			@Override
			public UserForm mapRow(ResultSet resultSet, int rowNum) throws SQLException {
				UserForm user = new UserForm();
				user.setUserId(resultSet.getLong("user_id"));
				user.setName(resultSet.getString("name"));
				user.setGender(resultSet.getInt("gender"));
				user.setPhone(resultSet.getString("phone"));
				user.setNote(resultSet.getString("note"));
				return user;
			}
		});
		System.out.println("userForm2 -> " + userForm2);

		//查询用户列表
		List<UserForm> userForms = new ArrayList<>();
		jdbcTemplate.queryForList("SELECT * FROM t_user").forEach(temp -> {
			//这里的temp其实是一个Map
			UserForm t = new UserForm();
			t.setUserId((Long) temp.get("user_id"));
			t.setName((String) temp.get("name"));
			t.setGender((Integer) temp.get("gender"));
			t.setPhone((String) temp.get("phone"));
			t.setNote((String) temp.get("note"));
			userForms.add(t);
		});
		//输出列表
		userForms.forEach(System.out::println);
	}

}

输出结果如下

特别提醒

在使用RowMapper的时候一定要注意映射的字段一定要是查询出来的字段,举个例子:

SELECT user_id,name FROM t_user WHERE user_id = 1;
@Override
public UserForm mapRow(ResultSet resultSet, int rowNum) throws SQLException {
	UserForm user = new UserForm();
	user.setUserId(resultSet.getLong("user_id"));
	user.setName(resultSet.getString("name"));
	user.setGender(resultSet.getInt("gender"));
	user.setPhone(resultSet.getString("phone"));
	user.setNote(resultSet.getString("note"));
	return user;
}

这样一条SQL,如果在RowMapper中定义成这样,那么就会出现这样的异常

这是因为你根本就没有SELECT gender、phone、note这几个字段,所以当然映射不了,所以就抛出了异常,这条SQL只查询出user_id和name两个字段,所以映射的时候也只能映射这两个字段。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
JdbcTemplate是Spring框架提供的一个用于简化数据库操作的工具类。它封装了JDBC的细节,提供了一组简洁的API来执行SQL语句并处理结果集。下面是使用JdbcTemplate进行数据库操作的基本步骤: 1. 配置数据源:在Spring配置文件中配置数据源,例如使用`org.springframework.jdbc.datasource.DriverManagerDataSource`类配置一个基于驱动程序管理的数据源。 2. 创建JdbcTemplate对象:在Spring配置文件中创建一个`org.springframework.jdbc.core.JdbcTemplate`对象,并将数据源注入到该对象中。 3. 编写SQL语句:根据需求编写SQL语句,可以使用占位符来代替参数。 4. 执行SQL语句:使用JdbcTemplate对象的方法执行SQL语句,例如`update()`方法用于执行INSERT、UPDATE和DELETE语句,`query()`方法用于执行SELECT语句。 5. 处理结果集:根据需要处理查询结果集,可以使用`RowMapper`接口来映射每一行的数据到Java对象。 下面是一个简单的示例代码: ```java import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; public class UserDao { private JdbcTemplate jdbcTemplate; public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public void addUser(User user) { String sql = "INSERT INTO user (id, name, age) VALUES (?, ?, ?)"; jdbcTemplate.update(sql, user.getId(), user.getName(), user.getAge()); } public User getUserById(int id) { String sql = "SELECT * FROM user WHERE id = ?"; RowMapper<User> rowMapper = new UserRowMapper(); return jdbcTemplate.queryForObject(sql, rowMapper, id); } } class User { private int id; private String name; private int age; // 省略getter和setter方法 } class UserRowMapper implements RowMapper<User> { @Override public User mapRow(ResultSet rs, int rowNum) throws SQLException { User user = new User(); user.setId(rs.getInt("id")); user.setName(rs.getString("name")); user.setAge(rs.getInt("age")); return user; } } ``` 以上代码演示了如何使用JdbcTemplate进行数据库操作,包括插入数据和查询数据。你可以根据具体的需求进行扩展和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值