一個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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!