针对不同的DAO处理,Spring分别提供了各自的封装。
处理的模式是将DAO类进行了一个扩展,必须在编写DAO实现类时继承一个XxxxDaoSupport,该类提供了对于事务处理,连接关闭等功能(由此可以看出JDBCtemplate的每个dao方法都有事务处理和数据库连接打开和关闭,所以后期如果是复杂的业务逻辑,需要整合多个dao'进行事务处理),而且在里面还包含一个 XxxTemplate类,该类对数据库操作对象进行了封装(JDBC中指的是PreparedStatement,Hibernate中指的是Session + Query)
下面完成新闻表的CRUD。
建立项目,并加入Spring支持。
一共5个类库
完成DataBaseConnection的配置,该类已经由apache提供的BasicDataSource进行了管理,只需要将其配置到spring配置文件中即可。
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="org.gjt.mm.mysql.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/test"></property> <property name="username" value="root"></property> <property name="password" value="mysqladmin"></property> </bean> |
编写vo类以及DAO接口,这里与之前没有区别。
建立DAO实现类
一定注意,继承jdbcDaoSupport
package cn.mldn.springjdbc.dao.impl;
import java.sql.Timestamp; import java.util.List;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import cn.mldn.springjdbc.dao.NewsDAO; import cn.mldn.springjdbc.mapper.NewsMapper; import cn.mldn.springjdbc.vo.News;
publicclass NewsDAOImpl extends JdbcDaoSupport implements NewsDAO {
publicboolean doCreate(News vo) throws Exception { // 使用Spring提供的JdbcTemplate来完成数据库操作 String sql = "INSERT INTO news (title,keyword,content,post_date,important,img) VALUES (?,?,?,?,?,?)"; // 该方法替代了PreparedStatement中的executeUpdate() if (this.getJdbcTemplate().update(sql, vo.getTitle(), vo.getKeyword(), vo.getContent(), new Timestamp(vo.getPostDate().getTime()), vo.getImportant(), vo.getImg()) > 0) { returntrue; } returnfalse; }
publicboolean doRemove(Object id) throws Exception { String sql = "DELETE FROM news WHERE id = ?"; if (this.getJdbcTemplate().update(sql, id) > 0) { returntrue; } returnfalse; }
publicboolean doUpdate(News vo) throws Exception { String sql = "UPDATE news SET title = ?,keyword = ? WHERE id = ?"; if (this.getJdbcTemplate().update(sql, vo.getTitle(), vo.getKeyword(), vo.getId()) > 0) { returntrue; } returnfalse; }
public List<News> findAll(String kw) throws Exception { String sql = "SELECT * FROM news WHERE keyword LIKE ?"; Object[] args = { "%" + kw + "%" }; // List all = this.getJdbcTemplate().query(sql, args, // new RowMapper<News>() { // public News mapRow(ResultSet rs, int rows) // throws SQLException { // News news = new News(); // news.setId(rs.getInt(1)); // news.setTitle(rs.getString(2)); // news.setKeyword(rs.getString(3)); // news.setContent(rs.getString(4)); // news.setPostDate(rs.getTimestamp(5)); // news.setImportant(rs.getString(6)); // news.setImg(rs.getString(7)); // return news; // } // }); List all = this.getJdbcTemplate().query(sql, args, new NewsMapper()); return all; }
public List<News> findAll(int cp, int ls, String kw) throws Exception { String sql = "SELECT * FROM news WHERE keyword LIKE ? LIMIT ?,?"; Object[] args = { "%" + kw + "%", (cp - 1) * ls, ls }; List all = this.getJdbcTemplate().query(sql, args, new NewsMapper()); return all; }
public News findById(Object id) throws Exception { String sql = "SELECT * FROM news WHERE id = ?"; Object[] args = { id }; News news = this.getJdbcTemplate().queryForObject(sql, args, new NewsMapper()); return news; }
publicint getCount(String kw) throws Exception { String sql = "SELECT count(id) FROM news WHERE keyword LIKE ?"; Object[] args = {"%"+kw+"%"}; int count= this.getJdbcTemplate().queryForInt(sql, args); return count; }
}
|
必须掌握JdbcTemplate里的常用方法以及RowMapper的使用。
JdbcTemplate的方法:
1) 添加,修改,删除à update(String sql, Object… args),返回int,如果为0表示失败,否则成功
2) 查询返回集合(集合中保存vo对象)à query(String sql,Object[] args,RowMapper<vo类型>),需要传入RowMapper规则,返回List集合。
3) 查询返回vo对象à queryForObject(String sql,Object[] args,RowMapper<vo类型>)
4) 查询返回int值à queryForInt(String sql ,Object… args),一般在查询全部记录数时使用
要使用这个JdbcTemplate,需要在spring配置中加入对这个对象的注入。
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="org.gjt.mm.mysql.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/test"></property> <property name="username" value="root"></property> <property name="password" value="mysqladmin"></property> </bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> //模板类直接注入数据源类 <property name="dataSource"> <ref bean="dataSource" /> </property> </bean>
<bean id="newsdaoimpl" class="cn.mldn.springjdbc.dao.impl.NewsDAOImpl">//DAO类注入模板类,进行数据库操作 <property name="jdbcTemplate"> <ref bean="jdbcTemplate"></ref> </property> </bean> //说明下,NewsDAOImpl是没有jdbcTemplate属性的,但确依赖注入了,因为此类继承了JdbcDaoSupport,而JdbcDaoSupport有jdbcTemplate属性 public abstract class JdbcDaoSupport extends DaoSupport { private JdbcTemplate jdbcTemplate; |
编写Service服务类
package cn.mldn.springjdbc.service.impl;
import java.util.HashMap; import java.util.Map;
import cn.mldn.springjdbc.dao.NewsDAO; import cn.mldn.springjdbc.service.NewsService; import cn.mldn.springjdbc.vo.News;
publicclass NewsServiceImpl implements NewsService {
private NewsDAO newsdao;
publicboolean doCreate(News news) throws Exception { returnnewsdao.doCreate(news); }
public Map findAll(int cp, int ls, String kw) throws Exception { Map map = new HashMap(); map.put("all", this.newsdao.findAll(cp, ls, kw)); map.put("count", this.newsdao.getCount(kw)); return map; }
publicvoid setNewsdao(NewsDAO newsdao) { this.newsdao = newsdao; }
}
|
也需要将服务类配置到spring配置文件中。
<bean id="newsserviceimpl" class="cn.mldn.springjdbc.service.impl.NewsServiceImpl"> <property name="newsdao"> <ref bean="newsdaoimpl"></ref> </property> </bean> |
测试没问题。