package GoodDAO ;
import java. lang. reflect. Field ;
import java. lang. reflect. ParameterizedType ;
import java. lang. reflect. Type ;
import java. sql. * ;
import java. util. ArrayList ;
public abstract class BaseDAO < S > {
private Class < S > clazz = null ;
{
Type genericSuperclass = this . getClass ( ) . getGenericSuperclass ( ) ;
ParameterizedType paramType = ( ParameterizedType ) genericSuperclass;
Type [ ] actualTypeArguments = paramType. getActualTypeArguments ( ) ;
clazz = ( Class < S > ) actualTypeArguments[ 0 ] ;
}
public int update ( Connection connection, String sql, Object . . . args) {
PreparedStatement preparedStatement = null ;
try {
preparedStatement = connection. prepareStatement ( sql) ;
for ( int i = 0 ; i < args. length; i++ ) {
preparedStatement. setObject ( i+ 1 , args[ i] ) ;
}
int i = preparedStatement. executeUpdate ( ) ;
return i;
} catch ( Exception e) {
e. printStackTrace ( ) ;
} finally {
try {
preparedStatement. close ( ) ;
} catch ( SQLException throwables) {
throwables. printStackTrace ( ) ;
}
}
return 0 ;
}
public S select ( Connection connection, String sql, Object . . . args) {
PreparedStatement preparedStatement = null ;
ResultSet resultSet = null ;
try {
preparedStatement = connection. prepareStatement ( sql) ;
for ( int i = 0 ; i < args. length; i++ ) {
preparedStatement. setObject ( i+ 1 , args[ i] ) ;
}
resultSet = preparedStatement. executeQuery ( ) ;
ResultSetMetaData metaData = resultSet. getMetaData ( ) ;
int columnCount = metaData. getColumnCount ( ) ;
if ( resultSet. next ( ) ) {
S s = clazz. newInstance ( ) ;
for ( int i = 0 ; i < columnCount; i++ ) {
Object value = resultSet. getObject ( i+ 1 ) ;
String columnLabel = metaData. getColumnLabel ( i + 1 ) ;
Field declaredField = clazz. getDeclaredField ( columnLabel) ;
declaredField. setAccessible ( true ) ;
declaredField. set ( s, value) ;
}
return s;
}
} catch ( SQLException throwables) {
throwables. printStackTrace ( ) ;
} catch ( InstantiationException e) {
e. printStackTrace ( ) ;
} catch ( IllegalAccessException e) {
e. printStackTrace ( ) ;
} catch ( NoSuchFieldException e) {
e. printStackTrace ( ) ;
} finally {
try {
preparedStatement. close ( ) ;
} catch ( SQLException throwables) {
throwables. printStackTrace ( ) ;
}
try {
resultSet. close ( ) ;
} catch ( SQLException throwables) {
throwables. printStackTrace ( ) ;
}
}
return null ;
}
public ArrayList < S > selectAll ( Connection connection, String sql, Object . . . args) {
PreparedStatement preparedStatement = null ;
ResultSet resultSet = null ;
ArrayList < S > arrayList = null ;
try {
preparedStatement = connection. prepareStatement ( sql) ;
for ( int i = 0 ; i < args. length; i++ ) {
preparedStatement. setObject ( i+ 1 , args[ i] ) ;
}
resultSet = preparedStatement. executeQuery ( ) ;
connection. setTransactionIsolation ( Connection . TRANSACTION_READ_COMMITTED) ;
ResultSetMetaData metaData = resultSet. getMetaData ( ) ;
int columnCount = metaData. getColumnCount ( ) ;
arrayList = new ArrayList < > ( ) ;
while ( resultSet. next ( ) ) {
S s = clazz. newInstance ( ) ;
for ( int i = 0 ; i < columnCount; i++ ) {
Object value = resultSet. getObject ( i+ 1 ) ;
String columnLabel = metaData. getColumnLabel ( i + 1 ) ;
Field declaredField = clazz. getDeclaredField ( columnLabel) ;
declaredField. setAccessible ( true ) ;
declaredField. set ( s, value) ;
}
arrayList. add ( s) ;
}
} catch ( SQLException throwables) {
throwables. printStackTrace ( ) ;
} catch ( InstantiationException e) {
e. printStackTrace ( ) ;
} catch ( IllegalAccessException e) {
e. printStackTrace ( ) ;
} catch ( NoSuchFieldException e) {
e. printStackTrace ( ) ;
} finally {
try {
preparedStatement. close ( ) ;
} catch ( SQLException throwables) {
throwables. printStackTrace ( ) ;
}
try {
resultSet. close ( ) ;
} catch ( SQLException throwables) {
throwables. printStackTrace ( ) ;
}
}
return arrayList;
}
public < E > E getvalue ( Connection connection, String sql, Object . . . args) {
PreparedStatement preparedStatement = null ;
ResultSet resultSet = null ;
try {
preparedStatement = connection. prepareStatement ( sql) ;
for ( int i = 0 ; i < args. length; i++ ) {
preparedStatement. setObject ( i+ 1 , args[ i] ) ;
}
resultSet = preparedStatement. executeQuery ( ) ;
if ( resultSet. next ( ) ) {
Object value = resultSet. getObject ( 1 ) ;
return ( E ) value;
}
} catch ( SQLException throwables) {
throwables. printStackTrace ( ) ;
} finally {
try {
resultSet. close ( ) ;
} catch ( SQLException throwables) {
throwables. printStackTrace ( ) ;
}
try {
preparedStatement. close ( ) ;
} catch ( SQLException throwables) {
throwables. printStackTrace ( ) ;
}
}
return null ;
}
}
package GoodDAO ;
import Bean. T ;
import java. sql. Connection ;
import java. util. List ;
public interface TDAO {
void insert ( Connection connection, T t) ;
void delete ( Connection connection, int id) ;
void update ( Connection connection, T t) ;
T getTByid ( Connection connection, int id) ;
List < T > getAll ( Connection connection) ;
Long getCount ( Connection connection) ;
String getMAXBirthday ( Connection connection) ;
}
package GoodDAO ;
import Bean. T ;
import java. lang. reflect. ParameterizedType ;
import java. lang. reflect. Type ;
import java. sql. Connection ;
import java. util. ArrayList ;
import java. util. List ;
public class TDAOImpl extends BaseDAO < T > implements TDAO {
@Override
public void insert ( Connection connection, T t) {
String sql = "insert into t(NAME,sex,birthday,zhicheng,yuanxi) values(?,?,?,?,?)" ;
update ( connection, sql, t. getNAME ( ) , t. getSex ( ) , t. getBirthday ( ) , t. getZhicheng ( ) , t. getYuanxi ( ) ) ;
}
@Override
public void delete ( Connection connection, int id) {
String sql = "delete from t where id =?" ;
update ( connection, sql, id) ;
}
@Override
public void update ( Connection connection, T t) {
String sql = "update t set NAME =?,sex =?,birthday =?,zhicheng =?,yuanxi =? where id =?" ;
update ( connection, sql, t. getNAME ( ) , t. getSex ( ) , t. getBirthday ( ) , t. getZhicheng ( ) , t. getYuanxi ( ) , t. getBid ( ) ) ;
}
@Override
public T getTByid ( Connection connection, int id) {
String sql = "select id,NAME,sex,birthday,zhicheng,yuanxi from t where id =?" ;
T t = select ( connection, sql, id) ;
return t;
}
@Override
public List < T > getAll ( Connection connection) {
String sql = "select * from t" ;
ArrayList < T > ts = selectAll ( connection, sql) ;
return ts;
}
@Override
public Long getCount ( Connection connection) {
String sql = "select count(*) from t" ;
return getvalue ( connection, sql) ;
}
@Override
public String getMAXBirthday ( Connection connection) {
String sql = "select max(birthday) from t" ;
return getvalue ( connection, sql) ;
}
}