转载于:http://www.16boke.com/article/detail/15
Spring对数据库的操作使用JdbcTemplate来封装JDBC,结合Spring的注入特性可以很方便的实现对数据库的访问操作。
使用JdbcTemplate可以像JDBC一样来编写数据库的操作代码,与hibernate相比对SQL语句的控制上会更灵活,下面以一个例子来讲解JdbcTemplate的使用及相应的API。
一、实体Bean
package com.orm.dto; import java.sql.Timestamp; public class AreaDto implements java.io.Serializable { private static final long serialVersionUID = 1L; private Integer areaid; private String area_name; private String area_detail; private Integer floor_id; private Integer build_id; private String region_name; private String sortno; private Timestamp insert_time; private Timestamp update_time; private Integer operate_id; public AreaDto() { } public AreaDto(Integer areaid) { this.areaid = areaid; } public Integer getAreaid() { return areaid; } public void setAreaid(Integer areaid) { this.areaid = areaid; } public String getArea_name() { return area_name; } public void setArea_name(String area_name) { this.area_name = area_name; } public String getArea_detail() { return area_detail; } public void setArea_detail(String area_detail) { this.area_detail = area_detail; } public Integer getFloor_id() { return floor_id; } public void setFloor_id(Integer floor_id) { this.floor_id = floor_id; } public Integer getBuild_id() { return build_id; } public void setBuild_id(Integer build_id) { this.build_id = build_id; } public String getRegion_name() { return region_name; } public void setRegion_name(String region_name) { this.region_name = region_name; } public String getSortno() { return sortno; } public void setSortno(String sortno) { this.sortno = sortno; } public Timestamp getInsert_time() { return insert_time; } public void setInsert_time(Timestamp insert_time) { this.insert_time = insert_time; } public Timestamp getUpdate_time() { return update_time; } public void setUpdate_time(Timestamp update_time) { this.update_time = update_time; } public Integer getOperate_id() { return operate_id; } public void setOperate_id(Integer operate_id) { this.operate_id = operate_id; } }
package com.orm.dto; import java.sql.Timestamp; public class BuildingDto implements java.io.Serializable { private static final long serialVersionUID = 1L; private Integer buildid; private String buildname; private String detail; private String sortno; private Timestamp insertTime; private Timestamp updateTime; private Integer operateId; public BuildingDto() { } public BuildingDto(Integer buildid) { this.buildid = buildid; } public BuildingDto(Integer buildid, String buildname, String detail, String sortno, Timestamp insertTime, Timestamp updateTime, Integer operateId) { this.buildid = buildid; this.buildname = buildname; this.detail = detail; this.sortno = sortno; this.insertTime = insertTime; this.updateTime = updateTime; this.operateId = operateId; } public Integer getBuildid() { return this.buildid; } public void setBuildid(Integer buildid) { this.buildid = buildid; } public String getBuildname() { return this.buildname; } public void setBuildname(String buildname) { this.buildname = buildname; } public String getDetail() { return this.detail; } public void setDetail(String detail) { this.detail = detail; } public String getSortno() { return this.sortno; } public void setSortno(String sortno) { this.sortno = sortno; } public Timestamp getInsertTime() { return this.insertTime; } public void setInsertTime(Timestamp insertTime) { this.insertTime = insertTime; } public Timestamp getUpdateTime() { return this.updateTime; } public void setUpdateTime(Timestamp updateTime) { this.updateTime = updateTime; } public Integer getOperateId() { return this.operateId; } public void setOperateId(Integer operateId) { this.operateId = operateId; } }
package com.orm.dto; import java.sql.Timestamp; public class FloorDto implements java.io.Serializable { private static final long serialVersionUID = 1L; private Integer floorid; private String floorname; private Integer floor; private String detail; private Integer buildId; private String sortno; private Timestamp insertTime; private Timestamp updateTime; private Integer operateId; public FloorDto() { } public FloorDto(Integer floorid) { this.floorid = floorid; } public Integer getFloorid() { return this.floorid; } public void setFloorid(Integer floorid) { this.floorid = floorid; } public String getFloorname() { return this.floorname; } public void setFloorname(String floorname) { this.floorname = floorname; } public String getDetail() { return this.detail; } public void setDetail(String detail) { this.detail = detail; } public Integer getBuildId() { return this.buildId; } public void setBuildId(Integer buildId) { this.buildId = buildId; } public String getSortno() { return this.sortno; } public void setSortno(String sortno) { this.sortno = sortno; } public Timestamp getInsertTime() { return this.insertTime; } public void setInsertTime(Timestamp insertTime) { this.insertTime = insertTime; } public Timestamp getUpdateTime() { return this.updateTime; } public void setUpdateTime(Timestamp updateTime) { this.updateTime = updateTime; } public Integer getOperateId() { return this.operateId; } public void setOperateId(Integer operateId) { this.operateId = operateId; } public Integer getFloor() { return floor; } public void setFloor(Integer floor) { this.floor = floor; } }
package com.orm.dto; import java.sql.Timestamp; public class StoreDto implements java.io.Serializable { private static final long serialVersionUID = 1L; private Integer id; private String storename; private String storenameen; private String storeno; private Integer build_Id; private Integer floor_Id; private Integer area_Id; private Integer type_Id; private Integer point_Id; private String storeowner; private String area; private String remark; private String status; private String sortno; private Timestamp inserttime; private Timestamp updatetime; private Integer operateid; public StoreDto() { } public StoreDto(Integer id) { this.id = id; } public Integer getId() { return this.id; } public void setId(Integer id) { this.id = id; } public String getStorename() { return this.storename; } public void setStorename(String storename) { this.storename = storename; } public String getStorenameen() { return this.storenameen; } public void setStorenameen(String storenameen) { this.storenameen = storenameen; } public String getStoreno() { return this.storeno; } public void setStoreno(String storeno) { this.storeno = storeno; } public Integer getBuild_Id() { return this.build_Id; } public void setBuild_Id(Integer build_Id) { this.build_Id = build_Id; } public Integer getFloor_Id() { return this.floor_Id; } public void setFloor_Id(Integer floor_Id) { this.floor_Id = floor_Id; } public Integer getArea_Id() { return this.area_Id; } public void setArea_Id(Integer area_Id) { this.area_Id = area_Id; } public Integer getType_Id() { return this.type_Id; } public void setType_Id(Integer type_Id) { this.type_Id = type_Id; } public Integer getPoint_Id() { return this.point_Id; } public void setPoint_Id(Integer point_Id) { this.point_Id = point_Id; } public String getStoreowner() { return this.storeowner; } public void setStoreowner(String storeowner) { this.storeowner = storeowner; } public String getArea() { return this.area; } public void setArea(String area) { this.area = area; } public String getRemark() { return this.remark; } public void setRemark(String remark) { this.remark = remark; } public String getStatus() { return this.status; } public void setStatus(String status) { this.status = status; } public String getSortno() { return this.sortno; } public void setSortno(String sortno) { this.sortno = sortno; } public Timestamp getInserttime() { return this.inserttime; } public void setInserttime(Timestamp inserttime) { this.inserttime = inserttime; } public Timestamp getUpdatetime() { return this.updatetime; } public void setUpdatetime(Timestamp updatetime) { this.updatetime = updatetime; } public Integer getOperateid() { return this.operateid; } public void setOperateid(Integer operateid) { this.operateid = operateid; } }
jdbc.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc.url=jdbc:sqlserver://127.0.0.1:1433;databaseName=test jdbc.username=sa jdbc.password=admin@2013 jdbc.maxActive=50 jdbc.maxIdle=10 jdbc.maxWait=50 jdbc.defaultAutoCommit=true
<?xml version="1.0" encoding="GB18030"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd" default-autowire="byName" default-lazy-init="true"> <!-- 属性文件读入 --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath*:config/*.properties</value> </list> </property> </bean> <!-- 数据源定义,使用dbcp数据源 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driverClassName}"></property> <property name="url" value="${jdbc.url}"></property> <property name="username" value="${jdbc.username}"></property> <property name="password" value="${jdbc.password}"></property> <property name="maxActive" value="${jdbc.maxActive}"></property> <property name="maxIdle" value="${jdbc.maxIdle}"></property> <property name="maxWait" value="${jdbc.maxWait}"></property> <property name="defaultAutoCommit" value="${jdbc.defaultAutoCommit}"></property> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" abstract="false" lazy-init="false" autowire="default" > <property name="dataSource"> <ref bean="dataSource" /> </property> </bean> <bean id="ormDao" class="com.orm.dao.impl.OrmDaoImpl"> <property name="template"> <ref bean="jdbcTemplate" /> </property> </bean> </beans>
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- Spring ApplicationContext配置文件的路径,可使用通配符,多个路径用,号分隔 此参数用于后面的Spring-Context loader --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:spring/*.xml</param-value> </context-param> <!--Spring ApplicationContext 载入 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 著名 Character Encoding filter --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>GBK</param-value> </init-param> </filter> <!-- Spring 刷新Introspector防止内存泄露 --> <listener> <listener-class> org.springframework.web.util.IntrospectorCleanupListener</listener-class> </listener> <!-- session超时定义,单位为分钟,清除服务端我们存储在Session中的对象,不清除Tomcat容器存储在Session中的对象 --> <session-config> <session-timeout>30</session-timeout> </session-config> </web-app>
package com.orm.dao; import java.util.List; import java.util.Map; import com.orm.dto.AreaDto; import com.orm.dto.BuildingDto; import com.orm.dto.FloorDto; import com.orm.dto.StoreDto; public interface OrmDao { public List<AreaDto> getAreaDtos(); public List<AreaDto> getAreaDtos1(); public Map<String, Object> getBuilds(); public Map<String, Object> getFloors(String build); public Map<String, Object> getAreas(String build, String floor); public List<StoreDto> getStoreDtos(int buildid, int floorid, int areaid); public List<BuildingDto> getBuildingDto(); public List<FloorDto> getFloorDtos(int buildid); public List<AreaDto> getAreaDto(int buildid, int floorid); public AreaDto getAreaDto(int id); public BuildingDto getBuildingDto(int buildId); public FloorDto getFloorDto(int floorId); public List<StoreDto> getAllStores(); public String storeName(int storeId); public StoreDto getStoreById(int storeId); public int getCountStore(); public void saveBuild(BuildingDto buildingDto); public void deleteBuildById(int buildid); public void updateBuildById(BuildingDto buildingDto); }
package com.orm.dao.impl; import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import com.orm.dao.OrmDao; import com.orm.dto.AreaDto; import com.orm.dto.BuildingDto; import com.orm.dto.FloorDto; import com.orm.dto.StoreDto; @SuppressWarnings({ "unchecked", "rawtypes" }) public class OrmDaoImpl implements OrmDao { private JdbcTemplate template; public JdbcTemplate getTemplate() { return template; } public void setTemplate(JdbcTemplate template) { this.template = template; } public List<AreaDto> getAreaDtos() { String sql = "select * from t_area "; return (List<AreaDto>) template.query(sql, new BeanPropertyRowMapper(AreaDto.class)); } public List<AreaDto> getAreaDtos1() { String sql = "select * from t_area "; return (List<AreaDto>) template.query(sql, new AreaRowMapper()); } public Map<String, Object> getBuilds() { String sql = "select buildid,buildname from t_building "; List<BuildingDto> list = this.template.query(sql, new BeanPropertyRowMapper(BuildingDto.class)); Map<String, Object> map = new HashMap<String, Object>(); for (BuildingDto build : list) { map.put(String.valueOf(build.getBuildid()), build.getBuildname()); } return map; } public Map<String, Object> getFloors(String build) { String sql = "select floorid ,floorname from t_floor where build_id=?"; List<FloorDto> list = this.template.query(sql, new Object[] { build }, new BeanPropertyRowMapper(FloorDto.class)); Map<String, Object> map = new LinkedHashMap<String, Object>(); for (FloorDto floorDto : list) { System.out.println(floorDto.getFloorid()); map.put(String.valueOf(floorDto.getFloorid()), floorDto.getFloorname()); } return map; } public Map<String, Object> getAreas(String build, String floor) { String sql = "select areaid ,area_name from t_area where build_id=? and floor_id=?"; List<AreaDto> list = this.template.query(sql, new Object[] { build, floor }, new BeanPropertyRowMapper(AreaDto.class)); Map<String, Object> map = new LinkedHashMap<String, Object>(); for (AreaDto areaDto : list) { System.out.println(areaDto.getAreaid()); map.put(String.valueOf(areaDto.getAreaid()), areaDto.getArea_name()); } return map; } public List<StoreDto> getStoreDtos(int buildid, int floorid, int areaid) { String sql = "select * from t_store where build_id=? and floor_id=? and area_id=?"; return (List<StoreDto>) template.query(sql, new Object[] { buildid, floorid, areaid }, new BeanPropertyRowMapper( StoreDto.class)); } public List<BuildingDto> getBuildingDto() { String sql = "select * from t_building "; return (List<BuildingDto>) template.query(sql, new BeanPropertyRowMapper(BuildingDto.class)); } public List<FloorDto> getFloorDtos(int buildid) { String sql = "select * from t_floor where build_id=? "; return (List<FloorDto>) template.query(sql, new Object[] { buildid }, new BeanPropertyRowMapper(FloorDto.class)); } public List<AreaDto> getAreaDto(int buildid, int floorid) { String sql = "select * from t_area where build_id=? and floor_id=?"; return (List<AreaDto>) template.query(sql, new Object[] { buildid, floorid }, new BeanPropertyRowMapper(AreaDto.class)); } public AreaDto getAreaDto(int id) { String sql = "select * from t_area where areaid=?"; return template.queryForObject(sql, new Object[] { id }, new BeanPropertyRowMapper(AreaDto.class)); } public BuildingDto getBuildingDto(int buildId) { String sql = "select * from t_building where buildid=?"; return template.queryForObject(sql, new Object[] { buildId }, new BeanPropertyRowMapper(BuildingDto.class)); } public FloorDto getFloorDto(int floorId) { String sql = "select * from t_floor where floorid=?"; return template.queryForObject(sql, new Object[] { floorId }, new BeanPropertyRowMapper(FloorDto.class)); } public List<StoreDto> getAllStores() { String sql = "select * from t_store "; return (List<StoreDto>) template.query(sql, new BeanPropertyRowMapper(StoreDto.class)); } public String storeName(int storeId) { String sql = "select storename from t_store where id=?"; return template.queryForObject(sql, new Object[] { storeId }, String.class); } public StoreDto getStoreById(int storeInt) { String sql = "select * from t_store where id=?"; return template.queryForObject(sql, new Object[] { storeInt }, new BeanPropertyRowMapper(StoreDto.class)); } public int getCountStore() { String sql = "select count(id) from t_store"; return this.template.queryForInt(sql); } public void saveBuild(BuildingDto buildingDto) { } public void deleteBuildById(int buildid) { String sql = "delete from t_store where id=?"; this.template.update(sql, buildid); } public void updateBuildById(BuildingDto buildingDto) { } } class AreaRowMapper implements RowMapper { public Object mapRow(ResultSet rs, int index) throws SQLException { AreaDto areaDto = new AreaDto(); areaDto.setAreaid(rs.getInt("areaid")); areaDto.setArea_name(rs.getString("area_name")); areaDto.setArea_detail(rs.getString("area_detail")); areaDto.setBuild_id(rs.getInt("build_id")); areaDto.setFloor_id(rs.getInt("floor_id")); areaDto.setInsert_time(rs.getTimestamp("insert_time")); areaDto.setOperate_id(rs.getInt("operate_id")); areaDto.setUpdate_time(rs.getTimestamp("update_time")); areaDto.setRegion_name(rs.getString("region_name")); areaDto.setSortno(rs.getString("sortno")); return areaDto; } }
package com.orm.test; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.junit.Before; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.orm.dao.OrmDao; import com.orm.dto.AreaDto; public class AreaTest{ private ApplicationContext ctx = null; private OrmDao ormDao = null; @Before public void setUp() throws Exception { ctx = new ClassPathXmlApplicationContext("classpath:spring/beans.xml"); ormDao = (OrmDao) ctx.getBean("ormDao"); } @Test public void getAreaDtosTest(){ List<AreaDto> list = this.ormDao.getAreaDtos(); for(AreaDto areaDto : list){ System.out.println(areaDto.getArea_name()); } System.out.println(list.size()); } @Test public void getAreaDtosTest1(){ List<AreaDto> list = this.ormDao.getAreaDtos1(); for(AreaDto areaDto : list){ System.out.println(areaDto.getArea_name()); } System.out.println(list.size()); } @Test public void getBuildsTest(){ Map<String, Object> builds = this.ormDao.getBuilds(); Iterator<String> keys = builds.keySet().iterator(); String key = ""; while(keys.hasNext()){ key = keys.next(); System.out.println("key = "+key+",value = "+builds.get(key)); } } @Test public void getFloorsTest(){ Map<String, Object> floors = this.ormDao.getFloors("1"); System.out.println(floors); Set<Entry<String, Object>> floorSet = floors.entrySet(); for(Entry floor : floorSet){ System.out.println(floor.getKey()+","+floor.getValue()); } } @Test public void getAreasTest(){ Map<String, Object> areas = this.ormDao.getAreas("1","1"); System.out.println(areas); Set<Entry<String, Object>> areaSet = areas.entrySet(); for(Entry area : areaSet){ System.out.println(area.getKey()+","+area.getValue()); } } @Test public void getCountStoreTest(){ System.out.println(this.ormDao.getCountStore()); } }
说明:
JdbcTemplate提供的方法很多如:queryForXXX,可以将查询结果以int、long、Object、List、Map来返回,这里有几个需要注意的:
下面是针对老版本的Spring1.2.x的JdbcTemplate操作:使用RowMapperResultReader对象来处理
class UserRowMapper implements RowMapper { public Object mapRow(ResultSet rs, int index) throws SQLException { User user = new User(); user.setId(rs.getString("user_id")); user.setName(rs.getString("name")); user.setSex(rs.getString("sex").charAt(0)); user.setAge(rs.getInt("age")); return user; } } public List findAllByRowMapperResultReader() { String sql = "SELECT * FROM USER"; return jdbcTemplate.query(sql, new RowMapperResultReader(new UserRowMapper())); }
public List<AreaDto> getAreaDtos1() { String sql = "select * from t_area "; return (List<AreaDto>) template.query(sql, new AreaRowMapper()); } class AreaRowMapper implements RowMapper { public Object mapRow(ResultSet rs, int index) throws SQLException { AreaDto areaDto = new AreaDto(); areaDto.setAreaid(rs.getInt("areaid")); areaDto.setArea_name(rs.getString("area_name")); areaDto.setArea_detail(rs.getString("area_detail")); areaDto.setBuild_id(rs.getInt("build_id")); areaDto.setFloor_id(rs.getInt("floor_id")); areaDto.setInsert_time(rs.getTimestamp("insert_time")); areaDto.setOperate_id(rs.getInt("operate_id")); areaDto.setUpdate_time(rs.getTimestamp("update_time")); areaDto.setRegion_name(rs.getString("region_name")); areaDto.setSortno(rs.getString("sortno")); return areaDto; } }
queryForList方法
此方法返回List数据,但是注意List中的数据却是Map形式,类似:[{AREAID=1, AREA_NAME=1楼报名咨询区}, {AREAID=2, AREA_NAME=2楼教学区}, {AREAID=3, AREA_NAME=3楼课外辅导区}],其中字段名为key,字段值为value
queryForMap方法
返回Map类型的数据,数据格式为{AREAID=1, AREA_NAME=1楼报名咨询区},注意:此方法必须只能返回一条记录,如果查询有多条记录就会报错:“org.springframework.dao.IncorrectResultSizeDataAccessException: Incorrect result size: expected 1, actual 2”
如果需要查询数据库返回一个List<T>类型的对象该如何实现?
目前有两种形式:
第一种:
public List<AreaDto> getAreaDtos1() { String sql = "select * from t_area "; return (List<AreaDto>) template.query(sql, new AreaRowMapper()); } class AreaRowMapper implements RowMapper { public Object mapRow(ResultSet rs, int index) throws SQLException { AreaDto areaDto = new AreaDto(); areaDto.setAreaid(rs.getInt("areaid")); areaDto.setArea_name(rs.getString("area_name")); areaDto.setArea_detail(rs.getString("area_detail")); areaDto.setBuild_id(rs.getInt("build_id")); areaDto.setFloor_id(rs.getInt("floor_id")); areaDto.setInsert_time(rs.getTimestamp("insert_time")); areaDto.setOperate_id(rs.getInt("operate_id")); areaDto.setUpdate_time(rs.getTimestamp("update_time")); areaDto.setRegion_name(rs.getString("region_name")); areaDto.setSortno(rs.getString("sortno")); return areaDto; } }
public List<AreaDto> getAreaDtos() { String sql = "select * from t_area "; System.out.println(template.queryForList(sql)); return (List<AreaDto>) template.query(sql, new BeanPropertyRowMapper(AreaDto.class)); }
很显然采用第二种会更简单。
转载于:http://www.16boke.com/article/detail/15