Discuss / Java / 回头再看才有意思,直接注入jdbcTemplate还不满足,继续抽象😂😂

回头再看才有意思,直接注入jdbcTemplate还不满足,继续抽象😂😂

Topic source

Loading...

#1 Created at ... [Delete] [Delete and Lock User]

基础版,dao里面直接注入jdbcTemplate

,public class UserDao  {
    @Autowired
    JdbcTemplate jdbcTemplate;
}

进化版,设置一个抽象类,Dao类直接继承该抽象类

public abstract class AbstractDao extends JdbcDaoSupport {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @PostConstruct
    public void init() {
        super.setJdbcTemplate(jdbcTemplate);
    }
}
public class UserDao extends AbstractDao {
    public User getById(long id) {
        return getJdbcTemplate().queryForObject(
                "SELECT * FROM users WHERE id = ?",
                new BeanPropertyRowMapper<>(User.class),
                id
        );
    }
}
注:Spring提供了一个JdbcDaoSupport类,用于简化DAO的实现。这个JdbcDaoSupport没什么复杂的,核心代码就是持有一个JdbcTemplate:

究极进化版,使用泛型,并提供常用增删改查方法(懒人专属)

public abstract class AbstractDao<T> extends JdbcDaoSupport {

	@Autowired
	private JdbcTemplate jdbcTemplate;

	private String table;
	private Class<T> entityClass;
	private RowMapper<T> rowMapper;

	public AbstractDao() {
		this.entityClass = getParameterizedType();
		this.table = this.entityClass.getSimpleName().toLowerCase() + "s";
		this.rowMapper = new BeanPropertyRowMapper<>(entityClass);
	}

	@PostConstruct
	public void init() {
		super.setJdbcTemplate(jdbcTemplate);
	}

	public T getById(long id) {
		return getJdbcTemplate().queryForObject("SELECT * FROM " + table + " WHERE id = ?", this.rowMapper, id);
	}
}
//使用时每个子类就已经有了这些方法
public class BookDao extends AbstractDao<Book> {
    // 已经有了:
    // Book getById(long)
 
}

  • 1

Reply