一個SpringJDBC的泛型DAO和通用業務層組件
1說明一下
最近要做一個系統,這個系統是基于Spring的。這篇博客減少了一些無關的代碼。這個比較簡單容易看懂。另外一些一對多多對多等等沒有貼出來,但大體是一樣的,基于反射機制去實現,并且自定義一些注解來設置實體間關系等等。。。。
實體類:
為了方便,這里自定義一個規范,就是主鍵一定要命名為id,field名稱一定要與表的字段名一致。
package com.lin.jllm.domain; import java.text.SimpleDateFormat; import java.util.Date; /** * * create table ORDER_INFO( id int not null primary key auto_increment, #訂單號 startTime date not null, #發貨時間 stateTime date, #狀態時間 positionInfo varchar(255) not null default '未發貨', #位置信息 sourceInfo varchar(255) not null, #來源信息 destinationInfo varchar(255) not null); #目的地信息 * * @author lin * */ public class OrderInfo { private Integer id; private Date startTime; private Date stateTime; private String positionInfo; private String sourceInfo; private String destinationInfo; public OrderInfo() { super(); // TODO Auto-generated constructor stub } public OrderInfo(Integer id, Date startTime, Date stateTime, String positionInfo, String sourceInfo, String destinationInfo) { super(); this.id = id; this.startTime = startTime; this.stateTime = stateTime; this.positionInfo = positionInfo; this.sourceInfo = sourceInfo; this.destinationInfo = destinationInfo; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Date getStartTime() { return startTime; } public void setStartTime(Date startTime) { this.startTime = startTime; } public Date getStateTime() { return stateTime; } public void setStateTime(Date stateTime) { this.stateTime = stateTime; } public String getPositionInfo() { return positionInfo; } public void setPositionInfo(String positionInfo) { this.positionInfo = positionInfo; } public String getSourceInfo() { return sourceInfo; } public void setSourceInfo(String sourceInfo) { this.sourceInfo = sourceInfo; } public String getDestinationInfo() { return destinationInfo; } public void setDestinationInfo(String destinationInfo) { this.destinationInfo = destinationInfo; } @Override public String toString() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:SS"); return "OrderInfo [id=" + id + ", startTime=" + sdf.format(getStartTime()).toString() + ", stateTime=" + sdf.format(getStateTime()).toString() + ", positionInfo=" + positionInfo + ", sourceInfo=" + sourceInfo + ", destinationInfo=" + destinationInfo + "]"; } }
2 DAO接口
2.1泛型DAO接口
package com.lin.jllm.dao.intf; import java.util.List; import com.lin.jllm.exception.DaoException; public interface IBaseDao<T> { public void create(T t) throws DaoException; public T read(Integer id) throws DaoException; public void update(T t) throws DaoException; public void delete(Integer id) throws DaoException; public List<T> listAll() throws DaoException; }
2.2 DAO組件接口
package com.lin.jllm.dao.intf; import com.lin.jllm.domain.OrderInfo; public interface IOrderInfoDao extends IBaseDao<OrderInfo> { }
3 DAO實現類
3.1 泛型DAO實現類
package com.lin.jllm.dao.impl; import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import javax.sql.DataSource; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import com.lin.jllm.dao.intf.IBaseDao; import com.lin.jllm.exception.DaoException; public abstract class AbstractDaoImpl<T> implements IBaseDao<T> { protected JdbcTemplate jdbcTemplate; protected String table_name; protected Class<? extends T> type; public AbstractDaoImpl() { // 獲取真實泛型數據類型 Type t = getClass().getGenericSuperclass(); ParameterizedType pt = (ParameterizedType) t; type = (Class) pt.getActualTypeArguments()[0]; } public JdbcTemplate getJdbcTemplate() { return jdbcTemplate; } public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public String getTable_name() { return table_name; } public void setTable_name(String table_name) { this.table_name = table_name; } /** * 注入數據源 * @param dataSource */ public void setDataSource(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } @Override public void create(T t) throws DaoException { if (t != null) { try { Field[] fields = t.getClass().getDeclaredFields(); String nameString = ""; String valueString = ""; String sql = "insert into "+table_name; Object[] values = new Object[fields.length]; //設置SQL中的參數名和參數個數 for(int i=0;i<fields.length;i++) { fields[i].setAccessible(true);//設置private屬性可訪問 nameString += fields[i].getName() + ","; valueString += "?,"; values[i] = fields[i].get(t); } //組織SQL語句 nameString = "(" + nameString.substring(0, nameString.length() - 1) + ")values"; valueString = "(" + valueString.substring(0, valueString.length() - 1) + ")"; sql = sql + nameString + valueString; jdbcTemplate.update(sql,values); } catch (Exception e) { e.printStackTrace(); } } } @Override public T read(Integer id) throws DaoException { final Class tempType = type; T t = jdbcTemplate.queryForObject( "select * from "+table_name+" where id=?;", new Object[] { id }, new RowMapper<T>() { public T mapRow(java.sql.ResultSet rs, int arg1) throws SQLException { try { Object temp = tempType.newInstance();//實例化一個類用于獲取field的值 Field[] fields = tempType.getDeclaredFields(); for(int i=0;i<fields.length;i++) { fields[i].setAccessible(true);//設置field可訪問 fields[i].set(temp, rs.getObject(fields[i].getName()));//設置field的值 } return (T) temp; } catch (Exception e) { e.printStackTrace(); return null; } } }); return t; } @Override public void update(T t) throws DaoException { if(t != null) { try { String sql = "update "+table_name+" set "; Field[] fields = t.getClass().getDeclaredFields(); Object[] values = new Object[fields.length]; int index = 0; //構造SQL語句 for(Field field : fields) { field.setAccessible(true); //判斷是不是主鍵 if(field.getName().equals("id")) { values[values.length - 1] = field.get(t); } else { sql += field.getName()+"=?,"; values[index] = field.get(t); index++; } } sql = sql.substring(0, sql.length() - 1) + " where id=?";//為了去掉逗號 jdbcTemplate.update(sql, values); } catch (Exception e) { e.printStackTrace(); } } } @Override public void delete(Integer id) throws DaoException { jdbcTemplate.update("delete from "+table_name+" where id=?", new Object[]{id}); } @Override public List<T> listAll() throws DaoException { final Class tempType = type; return jdbcTemplate.query("select id,startTime,stateTime,positionInfo,sourceInfo,destinationInfo from "+table_name+";", new RowMapper<T>() { @Override public T mapRow(ResultSet rs, int arg1) throws SQLException { try { Object temp = tempType.newInstance();//實例化一個類用于獲取field的值 Field[] fields = tempType.getDeclaredFields(); for(int i=0;i<fields.length;i++) { fields[i].setAccessible(true);//設置field可訪問 fields[i].set(temp, rs.getObject(fields[i].getName()));//設置field的值 } return (T) temp; } catch (Exception e) { e.printStackTrace(); return null; } } }); } }
3.2 DAO組件
package com.lin.jllm.dao.impl; import com.lin.jllm.dao.intf.IOrderInfoDao; import com.lin.jllm.domain.OrderInfo; public class OrderInfoDaoImpl extends AbstractDaoImpl<OrderInfo> implements IOrderInfoDao { }
4 業務層
4.1 泛型業務接口
package com.lin.jllm.service.intf; import java.util.List; public interface IBaseService<T> { public void add(T t) throws Exception; public void delete(Integer id) throws Exception; public void update(T t) throws Exception; public T get(Integer id) throws Exception; public List<T> getAll() throws Exception; }
4.2 業務接口
package com.lin.jllm.service.intf; import com.lin.jllm.domain.OrderInfo; public interface IOrderInfoService extends IBaseService<OrderInfo> { }
4.3 泛型業務組件
package com.lin.jllm.service.impl; import java.util.List; import com.lin.jllm.dao.intf.IBaseDao; import com.lin.jllm.service.intf.IBaseService; public class AbstractServiceImpl<T> implements IBaseService<T> { private IBaseDao<T> baseDao; public AbstractServiceImpl() { } //注入DAO public AbstractServiceImpl(IBaseDao<T> baseDao) { this.baseDao = baseDao; } public IBaseDao<T> getBaseDao() { return baseDao; } public void setBaseDao(IBaseDao<T> baseDao) { this.baseDao = baseDao; } @Override public void add(T t) throws Exception { if(t != null) { baseDao.create(t); } } @Override public void delete(Integer id) throws Exception { if(id != null) { baseDao.delete(id); } } @Override public void update(T t) throws Exception { if(t != null) { baseDao.update(t); } } @Override public T get(Integer id) throws Exception { if(id != null) { return baseDao.read(id); } return null; } @Override public List<T> getAll() throws Exception { return baseDao.listAll(); } }
4.4 業務組件
package com.lin.jllm.service.impl; import com.lin.jllm.dao.intf.IBaseDao; import com.lin.jllm.dao.intf.IOrderInfoDao; import com.lin.jllm.domain.OrderInfo; import com.lin.jllm.service.intf.IOrderInfoService; public class OrderInfoServiceImpl extends AbstractServiceImpl<OrderInfo> implements IOrderInfoService { private IOrderInfoDao orderInfoDao; public OrderInfoServiceImpl() { } public OrderInfoServiceImpl(IBaseDao<OrderInfo> baseDao) { super(baseDao); this.orderInfoDao = (IOrderInfoDao)baseDao; } public IOrderInfoDao getOrderInfoDao() { return orderInfoDao; } public void setOrderInfoDao(IOrderInfoDao orderInfoDao) { this.orderInfoDao = orderInfoDao; } }
5 在Spring容器中配置依賴關系
<?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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <!-- JDBC數據源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/jeanselam" /><!-- 這個系統不使用新的數據庫,使用jeanseLam的數據庫 --> <property name="username" value="root" /> <property name="password" value="root" /> </bean> <!-- 通用泛型DAO組件 --> <bean name="abstractDaoImpl" class="com.lin.jllm.dao.impl.AbstractDaoImpl" abstract="true"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- OrderInfo --> <bean name="orderInfoDaoImpl" class="com.lin.jllm.dao.impl.OrderInfoDaoImpl" parent="abstractDaoImpl"> <!-- 與該DAO組件對應的表名 --> <property name="table_name" value="OrderInfo"></property> </bean> </beans>
<?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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <!-- 抽象父業務組件 --> <bean name="abstractServiceImpl" class="com.lin.jllm.service.impl.AbstractServiceImpl" abstract="true"> </bean> <!-- 訂單信息管理業務組件 --> <bean name="orderInfoServiceImpl" class="com.lin.jllm.service.impl.OrderInfoServiceImpl" parent="abstractServiceImpl"> <constructor-arg ref="orderInfoDaoImpl"></constructor-arg> </bean> </beans>
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!