Spring jdbcTemplete查询

来源:互联网 发布:推荐高中数学视频软件 编辑:程序博客网 时间:2024/06/04 19:41

近日在工作中需要使用jdbcTemplete进行查询的操作,查了一些资料,解决了在项目中碰到的几个问题。

贴上代码:

实体类

public class User{    // id    protected Long  id;    // 姓名    protected String  name;    // 家庭    protected List<Home> home;    public void setId(Long id)    {        this.id = id;    }    /**     * 返回 id     * @return     */    public Long getId()    {        return this.id;    }    public void setName (String name)    {        this.name = name;    }    /**     * 返回 性别     * @return     */    public String getName()    {        return this.name;    }    public void setHome(List<Home> home)    {        this.home = home;    }    /**     * 返回 家庭信息     * @return     */    public List<Home> getHome()    {        return this.home;    }}

其中家庭信息类如下:

public class Home {    private String address;    private String phone;    public String getAddress() {        return address;    }    public void setAddress(String address) {        this.address = address;    }    public String getPhone() {        return phone;    }    public void setPhone(String phone) {        this.phone = phone;    }}

使用jdbcTemplete根据id值查询:

//使用jackson序列化ColumnDesc对象private  ObjectMapper objectMapper = new ObjectMapper();/** * 根据ID查询 * @param primaryKey ID的值 * @return User 自定义列表对象 */public User getById(Long primaryKey) {    String sql = "SELECT ID, NAME, HOME  FROM TABLE WHERE ID=? ";  //查询CLOB字段,HOME字段存储为CLOB    final LobHandler lobHandler = new DefaultLobHandler();    final User user =        jdbcTemplate.queryForObject(sql, new Object[]{primaryKey}, new RowMapper<User>() {            @Override            public User mapRow(ResultSet resultSet, int i) throws SQLException {                User user1 = new User();                user1.setId(resultSet.getLong("ID"));                user1.setName(resultSet.getString("NAME"));                //从数据库中获取CLOB字段                String content = lobHandler.getClobAsString(resultSet, "HOME");                //将该字段的内容序列化                List<Home> home = null;                try {                    home = objectMapper.readValue(content, new TypeReference<List<Home>>(){});                } catch (IOException e) {                    e.printStackTrace();                };                user1.setHome(home);                return user1;            }        });    return user;}

查询使用queryForObject(sql,new Object[]{param...}, new RowMapper())方法,在内部建立内联类实现RowMapper接口。

这段代码有两个需要注意的地方。
1. 在数据库中,Home字段存储的格式为CLOB大字段的方式,为了能够读取CLOB字段,使用 LobHandler 实例,它负责简化大字段的读取。它的API可参照下图:

2. 从数据库中获取到的Home字段现在是字符串的形式,需要将其反序列为Home对象,数据库中我们用Json格式存储Home字段,所以引入jackson这个工具来进行反序列化。jackson的使用可以参考这篇博客jackson序列化与反序列化,博客里详细介绍了如何将对单个对象以及列表进行序列化与反序列化。

参考文章:
* 使用Spring JdbcTemplate实现CLOB和BLOB的存取
* jackson序列化和反序列化(单个对象、列表)
* Jackson序列化和反序列化Json数据完整示例
* jackson 官方文档