如何使用 Java 8 个 lambda 特性在 Spring MVC Spring JDBC 示例中获取联系人模型?

How to use Java 8 lambda features to get Contact Model in Spring MVC Spring JDBC example?

我正在处理 Spring MVC + Spring JDBC 示例。我也在使用 Java 8。在这个例子中,我在将 new ResultSetExtractor<Contact>() 转换为使用 Java 8 的 lambda 功能时遇到了问题,就像我在 List<Contact> 使用 this::mapContact 的情况下能够做到的那样。我们如何为 public Contact get(int contactId) 做到这一点?

ContactDAOImpl.java

public class ContactDAOImpl implements ContactDAO {

    private JdbcTemplate jdbcTemplate;

    public ContactDAOImpl(DataSource dataSource) {
        jdbcTemplate = new JdbcTemplate(dataSource);
    }

    @Override
    public void saveOrUpdate(Contact contact) {
        if (contact.getId() > 0) {
            // update
            String sql = "UPDATE contact SET name=?, email=?, address=?, telephone=? WHERE contact_id=?";

            jdbcTemplate.update(sql, contact.getName(), contact.getEmail(), contact.getAddress(),
                    contact.getTelephone(), contact.getId());
        } else {
            // insert
            String sql = "INSERT INTO contact (name, email, address, telephone) VALUES (?, ?, ?, ?)";
            jdbcTemplate.update(sql, contact.getName(), contact.getEmail(), contact.getAddress(),
                    contact.getTelephone());
        }

    }

    @Override
    public void delete(int contactId) {
        String sql = "DELETE FROM contact WHERE contact_id=?";
        jdbcTemplate.update(sql, contactId);
    }

    @Override
    public List<Contact> list() {
        String sql = "SELECT * FROM contact";
        List<Contact> listContact = jdbcTemplate.query(sql, this::mapContact);

        return listContact;
    }

    @Override
    public Contact get(int contactId) {
        String sql = "SELECT * FROM contact WHERE contact_id=" + contactId;
        return jdbcTemplate.query(sql, new ResultSetExtractor<Contact>() {

            @Override
            public Contact extractData(ResultSet rs) throws SQLException, DataAccessException {
                if (rs.next()) {
                    Contact contact = new Contact();
                    contact.setId(rs.getInt("contact_id"));
                    contact.setName(rs.getString("name"));
                    contact.setEmail(rs.getString("email"));
                    contact.setAddress(rs.getString("address"));
                    contact.setTelephone(rs.getString("telephone"));
                    return contact;
                }

                return null;
            }

        });
    }


    private Contact mapContact(ResultSet rs, int row) throws SQLException{
        Contact contact = new Contact();
        contact.setId(rs.getInt("contact_id"));
        contact.setName(rs.getString("name"));
        contact.setEmail(rs.getString("email"));
        contact.setAddress(rs.getString("address"));
        contact.setTelephone(rs.getString("telephone"));
        return contact;
    }
}

当我将上面更改为下面时,我似乎无法在此处使用 lamba 表达式。

public class ContactDAOImpl implements ContactDAO {

    private JdbcTemplate jdbcTemplate;

    public ContactDAOImpl(DataSource dataSource) {
        jdbcTemplate = new JdbcTemplate(dataSource);
    }

    @Override
    public void saveOrUpdate(Contact contact) {
        if (contact.getId() > 0) {
            // update
            String sql = "UPDATE contact SET name=?, email=?, address=?, telephone=? WHERE contact_id=?";

            jdbcTemplate.update(sql, contact.getName(), contact.getEmail(), contact.getAddress(),
                    contact.getTelephone(), contact.getId());
        } else {
            // insert
            String sql = "INSERT INTO contact (name, email, address, telephone) VALUES (?, ?, ?, ?)";
            jdbcTemplate.update(sql, contact.getName(), contact.getEmail(), contact.getAddress(),
                    contact.getTelephone());
        }

    }

    @Override
    public void delete(int contactId) {
        String sql = "DELETE FROM contact WHERE contact_id=?";
        jdbcTemplate.update(sql, contactId);
    }

    @Override
    public List<Contact> list() {
        String sql = "SELECT * FROM contact";
        List<Contact> listContact = jdbcTemplate.query(sql, this::mapContact);

        return listContact;
    }

    @Override
    public Contact get(int contactId) {
        String sql = "SELECT * FROM contact WHERE contact_id=" + contactId;
        return jdbcTemplate.query(sql, this::mapContact);
    }


    private Contact mapContact(ResultSet rs, int row) throws SQLException{
        Contact contact = new Contact();
        contact.setId(rs.getInt("contact_id"));
        contact.setName(rs.getString("name"));
        contact.setEmail(rs.getString("email"));
        contact.setAddress(rs.getString("address"));
        contact.setTelephone(rs.getString("telephone"));
        return contact;
    }
}

下面 Java 8 中的替换是什么?

return jdbcTemplate.query(sql, new ResultSetExtractor<Contact>() {

            @Override
            public Contact extractData(ResultSet rs) throws SQLException, DataAccessException {
                if (rs.next()) {
                    Contact contact = new Contact();
                    contact.setId(rs.getInt("contact_id"));
                    contact.setName(rs.getString("name"));
                    contact.setEmail(rs.getString("email"));
                    contact.setAddress(rs.getString("address"));
                    contact.setTelephone(rs.getString("telephone"));
                    return contact;
                }

                return null;
            }

        });

我认为您只需要使用 queryForObject。完毕 !! 您需要像下面这样更改您的代码:

@Override
    public Contact get(int contactId) {
        String sql = "SELECT * FROM contact WHERE contact_id=" + contactId;
        return jdbcTemplate.queryForObject(sql, this::mapContact);
    }