来源:蜘蛛抓取(WebSpider)
时间:2017-08-03 13:48
标签:
今日3d藏机图
JdbcTemplate详解
1、JdbcTemplate操作数据库
Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中。同时,为了支持对properties文件的支持,spring提供了类似于EL表达式的方式,把dataSource.properties的文件参数引入到参数配置之中,&context:property-placeholder
location="classpath:jdbc.properties" /&。
实例代码如下:
提供数据源的相关配置信息:jdbc.properties
driverClassName=org.gjt.mm.mysql.Driver
url=jdbc\:mysql\://localhost\:3306/stanley?useUnicode\=true&characterEncoding\=UTF-8
username=root
password=123456
initialSize=1
maxActive=500
提供spring的配置文件,将jdbc.properties与JdbcTemplate粘合起来的配置文件:beans.xml
&?xml version="1.0"
encoding="UTF-8"?&
&beans xmlns="http://www.springframework.org/schema/beans"
&&&&&&&&&&&&
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
&&&&&&&&&&&&
xmlns:context="http://www.springframework.org/schema/context"
&&&&&&&&&&&&
xmlns:aop="http://www.springframework.org/schema/aop"
&&&&&&&&&&&&
xmlns:tx="http://www.springframework.org/schema/tx"
&&&&&&&&&&&&
xsi:schemaLocation="http://www.springframework.org/schema/beans
&&&&&&&&&&&&&&&&&&&&
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
&&&&&&&&&&&&&&&&&&&&
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
&&&&&&&&&&&&&&&&&&&&
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
&&&&&&&&&&&&&&&&&&&&
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"&
&&&&&context:property-placeholder
location="classpath:jdbc.properties"/&
id="dataSource" class="mons.dbcp.BasicDataSource"
destroy-method="close"&
&property name="driverClassName" value="${driverClassName}"/&
&property name="url"
value="${url}"/&
&property name="username"
value="${username}"/&
&property name="password"
value="${password}"/&
&&&&&&&&&&&&&!--
连接池启动时的初始值 --&
&property name="initialSize"
value="${initialSize}"/&
&!-- 连接池的最大值
&property name="maxActive"
value="${maxActive}"/&
&!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止
&property name="maxIdle"
value="${maxIdle}"/&
&!--&&&&最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请
&property name="minIdle"
value="${minIdle}"/&
&&&&&/bean&
id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&
&&&&&&&&&&&&&property
name="dataSource" ref="dataSource"/&
&&&&&&&&&/bean&
&&&aop:config&
&&&&&&&&&aop:pointcut
id="transactionPointcut" expression="execution(*
cn.comp.service..*.*(..))"/&
&&&&&&&&&aop:advisor
advice-ref="txAdvice" pointcut-ref="transactionPointcut"/&
&&&/aop:config&
&&&tx:advice id="txAdvice"
transaction-manager="txManager"&
&&&&&&&&&tx:attributes&
&&&&&&&&&&&&&tx:method
name="get*" read-only="true"
propagation="NOT_SUPPORTED"/&
&&&&&&&&&&&&&tx:method
name="*"/&
&&&&&&&&&/tx:attributes&
&&&/tx:advice&
id="personService" class="cn.comp.service.impl.PersonServiceBean"&
&&&&&property
name="dataSource" ref="dataSource"/&
提供POJO的java类:Person.java
public class Person {
&&private I
&&private S
&&public Person(){}
&&public Person(String name) {
&&&&this.name
&&public Integer getId() {
&&&&return
&&public void
setId(Integer id) {
&&&&this.id
&&public String getName() {
&&&&return
&&public void
setName(String name) {
&&&&this.name
提供对Person的操作接口:PersonService.java
public interface PersonService {
&&public void
save(Person person);
&&public void
update(Person person);
&&public Person getPerson(Integer personid);
&&public List&Person&
getPersons();
&&public void
delete(Integer personid) throws
提供对接口的实现类:PersonServiceBean.java
public class PersonServiceBean implements PersonService {
&&private JdbcTemplate jdbcT
&&public void
setDataSource(DataSource dataSource) {
&&&&this.jdbcTemplate
= new JdbcTemplate(dataSource);
&&public void
delete(Integer personid) throws
Exception{
&&&&jdbcTemplate.update("delete
from person where id=?", new
Object[]{personid},
&&&&&&&&new
int[]{java.sql.Types.INTEGER});
&&public Person getPerson(Integer personid)
&&&&return
(Person)jdbcTemplate.queryForObject("select *
from person where id=?", new
Object[]{personid},
&&&&&&&&new
int[]{java.sql.Types.INTEGER},
new PersonRowMapper());
&&@SuppressWarnings("unchecked")
&&public List&Person&
getPersons() {
&&&&return
(List&Person&)jdbcTemplate.query("select
* from person", new
PersonRowMapper());
&&public void
save(Person person) {
&&&&jdbcTemplate.update("insert
into person(name) values(?)", new Object[]{person.getName()},
&&&&&&&&new
int[]{java.sql.Types.VARCHAR});
&&public void
update(Person person) {
&&&&jdbcTemplate.update("update
person set name=? where id=?", new Object[]{person.getName(),
person.getId()},
&&&&&&&&new
int[]{java.sql.Types.VARCHAR,
java.sql.Types.INTEGER});
提供在查询对象时,记录的映射回调类:PersonRowMapper.java
public class PersonRowMapper implements RowMapper {
&&public Object mapRow(ResultSet rs, int index) throws
SQLException {
&&&&Person
person = new
Person(rs.getString("name"));
&&&&person.setId(rs.getInt("id"));
&&&&return
【注意】:由于dbcp的jar包对common-pool和commons-collections的jar包有依赖,所有需要把他们一起引入到工程中。【&commons-dbcp-1.2.1.jar,
commons-pool-1.2.jar, commons-collections-3.1.jar】,
参考文档《JDBC高级部分》:
2、JdbcTemplate事务
事务的操作首先要通过配置文件,取得spring的支持,
再在java程序中显示的使用@Transactional注解来使用事务操作。
在xml配置文件中增加对事务的支持:
&bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&
&&&&&&&&&&&&&property
name="dataSource" ref="dataSource"/&
&&&&&&&&&/bean&
&&&tx:annotation-driven transaction-manager="txManager"/&
id="personService" class="cn.comp.service.impl.PersonServiceBean"&
&&&&&property
name="dataSource" ref="dataSource"/&
在java程序中显示的指明是否需要事务,当出现运行期异常Exception或一般的异常Exception是否需要回滚
@Transactional
public class PersonServiceBean implements PersonService {
&&private JdbcTemplate jdbcT
&&public void
setDataSource(DataSource dataSource) {
&&&&this.jdbcTemplate
= new JdbcTemplate(dataSource);
unchecked ,
&&@Transactional(noRollbackFor=RuntimeException.class)
&&public void
delete(Integer personid) throws
Exception{
&&&&jdbcTemplate.update("delete
from person where id=?", new
Object[]{personid},
&&&&&&&&new
int[]{java.sql.Types.INTEGER});
new RuntimeException("运行期例外");
&&@Transactional(propagation=Propagation.NOT_SUPPORTED)
&&public Person getPerson(Integer personid)
&&&&return
(Person)jdbcTemplate.queryForObject("select *
from person where id=?", new
Object[]{personid},
&&&&&&&&new
int[]{java.sql.Types.INTEGER},
new PersonRowMapper());
&&@Transactional(propagation=Propagation.NOT_SUPPORTED)
&&@SuppressWarnings("unchecked")
&&public List&Person&
getPersons() {
&&&&return
(List&Person&)jdbcTemplate.query("select
* from person", new
PersonRowMapper());
&&public void
save(Person person) {
&&&&jdbcTemplate.update("insert
into person(name) values(?)", new Object[]{person.getName()},
&&&&&&&&new
int[]{java.sql.Types.VARCHAR});
&&public void
update(Person person) {
&&&&jdbcTemplate.update("update
person set name=? where id=?", new Object[]{person.getName(),
person.getId()},
&&&&&&&&new
int[]{java.sql.Types.VARCHAR,
java.sql.Types.INTEGER});
在默认情况下,Spring会对RuntimeException异常进行回滚操作,而对Exception异常不进行回滚。可以显示的什么什么样的异常需要回滚,什么样的异常不需要回滚,
通过&@Transactional(noRollbackFor=RuntimeException.class)设置要求运行时异常不回滚
或者通过RollbackFor=Exception.class来要求需要捕获的异常回滚。
【注意】Spring对数据库的操作提供了强大的功能,比如RowMapper接口封装数据库字段与Java属性的映射、查询返回List的函数等,但是里面还要写一堆SQL语句还是比较烦人的,在这部分建议使用ibatis或hibernate来代替,
不知道Spring后期的版本会不会把这个整合到里面。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。用Spring的JdbcTemplate实现分页功能
用Spring的JdbcTemplate实现分页功能
最近使用了spring中的JdbcTemplate实现数据库的查询和插入操作,发现spring的JdbcTemplate 不象HibernateTemplate那么好,已经实现了分页功能。所以要自己实现,使用getJdbcTemplate().queryForList(string sql)得到的结果集是所有的。 如果你的查询有10000条记录,或者更多,速度肯定慢了,当然你可以通过resultset中的游标控制查询的起始和结束。我这里用的是Oracle数据库,使用伪列ROWNUM来实现分页。我的分页代码如下: package com.deity.ranking.import java.util.L import org.sprire.JdbcT import org.sprire.support.JdbcDaoS /** * 分页函数 * * @author allenpan */public class Pagination extends JdbcDaoSupport{ public static final int NUMBERS_PER_PAGE = 10; //一页显示的记录数 private int numPerP //记录总数 private int totalR //总页数 private int totalP //当前页码 private int currentP //起始行数 private int startI //结束行数 private int lastI //结果集存放List private List resultL //JdbcTemplate jTemplate private JdbcTemplate jT /** * 每页显示10条记录的构造函数,使用该函数必须先给Pagination设置currentPage,jTemplate初值 * @param sql oracle语句 */ public Pagination(String sql){ if(jTemplate == null){ throw new IllegalArgumentException("com.deity.ranking.util.Pagination.jTemplate is null,please initial it first. "); }else if(sql.equals("")){ throw new IllegalArgumentException("com.deity.ranking.util.Pagination.sql is empty,please initial it first. "); } new Pagination(sql,currentPage,NUMBERS_PER_PAGE,jTemplate); } /**分页构造函数 * @param sql 根据传入的sql语句得到一些基本分页信息 * @param currentPage 当前页 * @param numPerPage 每页记录数 * @param jTemplate JdbcTemplate实例 */ public Pagination(String sql,int currentPage,int numPerPage,JdbcTemplate jTemplate){ if(jTemplate == null){ throw new IllegalArgumentException("com.deity.ranking.util.Pagination.jTemplate is null,please initial it first. "); }else if(sql == null || sql.equals("")){ throw new IllegalArgumentException("com.deity.ranking.util.Pagination.sql is empty,please initial it first. "); } //设置每页显示记录数 setNumPerPage(numPerPage); //设置要显示的页数 setCurrentPage(currentPage); //计算总记录数 StringBuffer totalSQL = new StringBuffer(" SELECT count(*) FROM ( "); totalSQL.append(sql); totalSQL.append(" ) totalTable "); //给JdbcTemplate赋值 setJdbcTemplate(jTemplate); //总记录数 setTotalRows(getJdbcTemplate().queryForInt(totalSQL.toString())); //计算总页数 setTotalPages(); //计算起始行数 setStartIndex(); //计算结束行数 setLastIndex(); System.out.println("lastIndex="+lastIndex);////////////////// //构造oracle数据库的分页语句 StringBuffer paginationSQL = new StringBuffer(" SELECT * FROM ( "); paginationSQL.append(" SELECT temp.* ,ROWNUM num FROM ( "); paginationSQL.append(sql); paginationSQL.append(" ) temp where ROWNUM &= " + lastIndex); paginationSQL.append(" ) WHERE num > " + startIndex); //装入结果集 setResultList(getJdbcTemplate().queryForList(paginationSQL.toString())); } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } public int getCurrentPage() { return currentP } public void setCurrentPage(int currentPage) { this.currentPage = currentP } public int getNumPerPage() { return numPerP } public void setNumPerPage(int numPerPage) { this.numPerPage = numPerP } public List getResultList() { return resultL } public void setResultList(List resultList) { this.resultList = resultL } public int getTotalPages() { return totalP } //计算总页数 public void setTotalPages() { if(totalRows % numPerPage == 0){ this.totalPages = totalRows / numPerP }else{ this.totalPages = (totalRows / numPerPage) + 1; } } public int getTotalRows() { return totalR } public void setTotalRows(int totalRows) { this.totalRows = totalR } public int getStartIndex() { return startI } public void setStartIndex() { this.startIndex = (currentPage - 1) * numPerP } public int getLastIndex() { return lastI } public JdbcTemplate getJTemplate() { return jT } public void setJTemplate(JdbcTemplate template) { jTemplate = } //计算结束时候的索引 public void setLastIndex() { System.out.println("totalRows="+totalRows);/////////// System.out.println("numPerPage="+numPerPage);/////////// if( totalRows & numPerPage){ this.lastIndex = totalR }else if((totalRows % numPerPage == 0) || (totalRows % numPerPage != 0 && currentPage & totalPages)){ this.lastIndex = currentPage * numPerP }else if(totalRows % numPerPage != 0 && currentPage == totalPages){//最后一页 this.lastIndex = totalR } }}在我的业务逻辑代码中: /** * find season ranking list from DC * @param areaId 选手区域id * @param rankDate 赛季 * @param category 类别 * @param characterName 角色名 * @return List */ public List findSeasonRankingList(Long areaId, int rankYear,int rankMonth, Long categoryId,String characterName) { //SQL语句 StringBuffer sql = new StringBuffer(" SELECT C.USERID userid,D.POSNAME posname,C.GAMEID gameid,C.AMOUNT amount,C.RANK rank FROM "); //表 sql.append(" (SELECT B.USERID USERID,"); sql.append(" B.POSID POSID,"); sql.append(" A.DISTRICT_CODE DISTRICTCODE,"); sql.append(" A.GAMEID GAMEID,"); sql.append(" AMOUNT AMOUNT,"); sql.append(" RANK RANK "); sql.append(" FROM TB_FS_RANK A "); sql.append(" LEFT JOIN TB_CHARACTER_INFO B "); sql.append(" ON A.DISTRICT_CODE = B.DISTRICT_CODE "); sql.append(" AND A.GAMEID = B.GAMEID "); //附加条件 if(areaId != null && areaId.intValue() != 0){ sql.append(" and A.DISTRICT_CODE = " + areaId.intValue()); } if( rankYear > 1970 && rankMonth > 0){ //hql.append(" and sas.id.dt >= to_date('" + rankYear + "-" + rankMonth + "-01 00:00:00'," + "YYYY-MM-DD HH24:MI:SS"); //hql.append(" and sas.id.dt &= to_date('" + rankYear + "-" + rankMonth + "-" + TimeTool.findMaxDateInMonth(rankYear,rankMonth) + " 23:59:59'," + "YYYY-MM-DD HH24:MI:SS"); sql.append(" and A.DT = fn_time_convert(to_date('" + rankYear + "-" + rankMonth + "'," + "'YYYY-MM')) "); } if(categoryId != null && categoryId.intValue() != 0){ sql.append(" and A.CID = " + categoryId.intValue()); } if(characterName != null && !characterName.trim().equals("")){ sql.append(" and A.GAMEID = '" + characterName.trim()+"' "); } sql.append(" ORDER BY RANK ASC) C "); sql.append(" LEFT JOIN TB_FS_POSITION D "); sql.append(" ON C.POSID = D.POSID "); sql.append(" ORDER BY C.RANK "); System.out.println("hql="+sql.toString());//////////////// //使用自己的分页程序控制结果集 Pagination pageInfo = new Pagination(sql.toString(),1,10,getJdbcTemplate()); return pageInfo.getResultList(); //return getJdbcTemplate().queryForList(sql.toString()); }
H3C认证Java认证Oracle认证
基础英语软考英语项目管理英语职场英语
.NETPowerBuilderWeb开发游戏开发Perl
二级模拟试题一级模拟试题一级考试经验四级考试资料
软件测试软件外包系统分析与建模敏捷开发
法律法规历年试题软考英语网络管理员系统架构设计师信息系统监理师
高级通信工程师考试大纲设备环境综合能力
路由技术网络存储无线网络网络设备
CPMP考试prince2认证项目范围管理项目配置管理项目管理案例项目经理项目干系人管理
职称考试题目
招生信息考研政治
网络安全安全设置工具使用手机安全
生物识别传感器物联网传输层物联网前沿技术物联网案例分析
Java核心技术J2ME教程
Linux系统管理Linux编程Linux安全AIX教程
Windows系统管理Windows教程Windows网络管理Windows故障
数据库开发Sybase数据库Informix数据库
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&Spring之SimpleJdbcTemplate的使用 - 精益求精&化繁为简 - ITeye技术网站
博客分类:
1.数据库脚本
create table user
int not null,
name varchar(20),
primary key(id)
package org.monday.
public class User {
public User() {
public User(int id, String name) {
this.name =
public int getId() {
public void setId(int id) {
public String getName() {
public void setName(String name) {
this.name =
public String toString() {
return "User [id=" + id + ", name=" + name + "]";
package org.monday.
import java.util.L
public interface UserDao {
public void insert(User user);
public void update(User user);
public void delete(User user);
public void delete(int id);
public User findById(int id);
public int findByName(String name);
public List&User& findAll();
public int count();
public void batchInsert(List&User& users);
4.Dao的实现类
package org.monday.
import java.util.ArrayL
import java.util.L
import org.springframework.jdbc.core.simple.ParameterizedBeanPropertyRowM
import org.springframework.jdbc.core.simple.SimpleJdbcDaoS
public class UserDaoImpl extends SimpleJdbcDaoSupport implements UserDao {
public void insert(User user) {
String sql = "insert into user(id,name)values(?,?)";
getSimpleJdbcTemplate().update(sql, user.getId(), user.getName());
public void update(User user) {
String sql = "update user set name=? where id=?";
getSimpleJdbcTemplate().update(sql, user.getName(), user.getId());
public void delete(User user) {
String sql = "delete from user where id=?";
getSimpleJdbcTemplate().update(sql, user.getId());
public void delete(int id) {
String sql = "delete from user where id=?";
getSimpleJdbcTemplate().update(sql, id);
public User findById(int id) {
String sql = "select * from user where id=?";
return getSimpleJdbcTemplate().queryForObject(sql,
ParameterizedBeanPropertyRowMapper.newInstance(User.class), id);
// 下面的方法只能返回一列,所以行不通
// return getSimpleJdbcTemplate().queryForObject(sql, User.class, id);
public int findByName(String name){
String sql = "select id from user where name=?";
return getSimpleJdbcTemplate().queryForObject(sql, Integer.class, name);
// Integer.class 改成int.class 不行
// 貌似只能用包装类
public List&User& findAll() {
String sql = "select * from user";
return getSimpleJdbcTemplate().query(sql,
ParameterizedBeanPropertyRowMapper.newInstance(User.class));
public int count() {
String sql = "select count(*) from user";
return getSimpleJdbcTemplate().queryForInt(sql);
public void batchInsert(List&User& users) {
String sql = "insert into user(id,name)values(?,?)";
List&Object[]& parameters = new ArrayList&Object[]&();
for (User u : users) {
parameters.add(new Object[] { u.getId(), u.getName() });
getSimpleJdbcTemplate().batchUpdate(sql, parameters);
5.beans.xml
&?xml version="1.0" encoding="UTF-8"?&
&beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"&
&!-- 引入外部文件 --&
&context:property-placeholder location="classpath:jdbc.properties"/&
&!-- 配置数据源 --&
&bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"&
&property name="driverClassName" value="${jdbc.driverClassName}"/&
&property name="url" value="${jdbc.url}"/&
&property name="username" value="${jdbc.username}"/&
&property name="password" value="${jdbc.password}"/&
&!-- 配置DAO --&
&bean id="userDao" class="org.monday.springjdbc.UserDaoImpl"&
&property name="dataSource" ref="dataSource"/&
6.jdbc.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring
jdbc.username=root
jdbc.password=root
package org.monday.
import java.util.ArrayL
import java.util.L
import org.junit.T
import org.springframework.context.ApplicationC
import org.springframework.context.support.ClassPathXmlApplicationC
public class Main {
private ApplicationContext ctx = new ClassPathXmlApplicationContext(
"beans.xml");
private UserDao userDao=(UserDao) ctx.getBean("userDao");
public void testInsert() {
User user = new User(1,"zy_1");
userDao.insert(user);
public void testUpdate() {
User user = new User(5,"zy_test");
userDao.update(user);
public void testDeleteUser() {
User user =new User();
user.setId(5);
userDao.delete(user);
public void testDeleteInt() {
userDao.delete(4);
public void testFindById() {
User user=userDao.findById(1);
System.out.println(user);
public void testFindByName() {
int id=userDao.findByName("zy_1");
System.out.println(id);
public void testFindAll() {
List&User& list=userDao.findAll();
System.out.println(list);
public void testCount() {
int count = userDao.count();
System.out.println(count);
public void testBatchInsert() {
List&User& users = new ArrayList&User&();
users.add(new User(2,"zy_2"));
users.add(new User(3,"zy_3"));
users.add(new User(4,"zy_4"));
users.add(new User(5,"zy_5"));
userDao.batchInsert(users);
附:自己写这篇文章的时候,用的是Spring2.5.而今天用了Spring3.1后发现,SimpleJdbcTemplate和SimpleJdbcDaoSupport都被标记为@Deprecated (过时了),后来一看源码,有这么一句话,就明白了。
@deprecated since Spring 3.1 in favor of
org.springframework.jdbc.core.JdbcTemplate} and
org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate}. The JdbcTemplate and
NamedParameterJdbcTemplate now provide all the functionality of the SimpleJdbcTemplate.
大意就是: 从Spring 3.1开始,JdbcTemplate和NamedParameterJdbcTemplate提供了SimpleJdbcTemplate的功能。
那既然这样的话,SimpleJdbcTemplate和SimpleJdbcDaoSupport被标记为过时,就明白了。
下载次数: 146
浏览 21130
myxuee 写道你好,请教一个问题:在用SimpleJdbcTemplate做mysql的分页查询时,如果不带参数的话没有问题,带上泛型参数的话就会报异常:Parameter index out of range (1 & number of parameters, which is 0).不知道怎么回事你好,SimpleJdbcTemplate过时了,推荐使用JdbcTemplate。呃,问题已解决,多谢。遗留问题
你好,请教一个问题:在用SimpleJdbcTemplate做mysql的分页查询时,如果不带参数的话没有问题,带上泛型参数的话就会报异常:Parameter index out of range (1 & number of parameters, which is 0).不知道怎么回事你好,SimpleJdbcTemplate过时了,推荐使用JdbcTemplate。
周一Monday
浏览: 226830 次
来自: 上海
感谢,很实用
虽然通过接口方式省了一些代码,但每一个实体还是要写一个DAO, ...
spring mvc demo教程源代码下载,地址:http: ...
xy2401 写道没有找到我想要的分页查询这里
System ...
真心简单是啊吧