对象持久化操作
package mliwng.persistent;
import java.sql.Connection;
import java.sql.DriverManager;
import javax.sql.DataSource;
public class ConnectionManager {
public static ThreadLocal local = new ThreadLocal();
private static DataSource dataSource;
private static final String DRIVER = "com.mysql.jdbc.Driver";
private static final String URL = "jdbc:mysql://localhost:3306/test";
private static final String UID = "root";
private static final String PWD = "mliwng";
public static void openConnection()
{
Connection conn = (Connection)local.get();
try
{
if(conn == null)
{
Class.forName(DRIVER);
conn = DriverManager.getConnection(URL,UID,PWD);
local.set(conn);
}
}catch(Exception e)
{
e.printStackTrace();
}
}
public static void closeConnection()
{
Connection conn = (Connection)local.get();
try
{
if(conn != null)
{
conn.close();
}
}catch(Exception e)
{
e.printStackTrace();
}finally
{
local.set(null);
}
}
public static DataSource getDataSource() {
return dataSource;
}
public static void setDataSource(DataSource dataSource) {
ConnectionManager.dataSource = dataSource;
}
}
package mliwng.persistent;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
public class PreparedStatementManager {
public static PreparedStatement getSelectPstmt(Class c)
{
PreparedStatement pstmt = null;
String sql = SqlManager.createSelect(c);
if(ConnectionManager.local.get()== null)
{
System.out.println("local == null");
}
try
{
pstmt = ((Connection)ConnectionManager.local.get()).prepareStatement(sql);
}catch(Exception e)
{
e.printStackTrace();
}
return pstmt;
}
public static PreparedStatement getSelectByKeyPstmt(Class c,String key,Object object)
{
PreparedStatement pstmt = null;
String sql = SqlManager.createSelectById(c, key);
try
{
pstmt = ((Connection)ConnectionManager.local.get()).prepareStatement(sql);
pstmt.setObject(1, object);
}catch(Exception e)
{
e.printStackTrace();
}
return pstmt;
}
public static PreparedStatement getInsertPstmt(Object object)
{
PreparedStatement pstmt = null;
String sql = SqlManager.createInsert(object);
try
{
pstmt = ((Connection)ConnectionManager.local.get()).prepareStatement(sql);
setParameter(pstmt,object);
}catch(Exception e)
{
e.printStackTrace();
}
return pstmt;
}
public static PreparedStatement getUpdatePstmt(Object object,String key)
{
PreparedStatement pstmt = null;
String sql = SqlManager.createUpdate(object, key);
try
{
pstmt = ((Connection)ConnectionManager.local.get()).prepareStatement(sql);
int j = setParameter(pstmt,object);
Field field = object.getClass().getDeclaredField(key);
field.setAccessible(true);
System.out.println(j);
pstmt.setObject(j+1, field.get(object));
}catch(Exception e)
{
e.printStackTrace();
}
return pstmt;
}
public static PreparedStatement getDeletePstmt(Class c,String key,Object object)
{
PreparedStatement pstmt = null;
String sql = SqlManager.createDelete(c,key);
try
{
pstmt = ((Connection)ConnectionManager.local.get()).prepareStatement(sql);
pstmt.setObject(1,object);
}catch(Exception e)
{
e.printStackTrace();
}
return pstmt;
}
private static int setParameter(PreparedStatement pstmt,Object object)
{
Class c = object.getClass();
Field[] fields = c.getDeclaredFields();
int j = 0;
for(int i = 0;i<fields.length;i++)
{
if(!isNull(fields[i],object))
{
j ++;
try
{
pstmt.setObject(j, fields[i].get(object));
}catch(Exception e)
{
e.printStackTrace();
}
}
}
return j;
}
private static boolean isNull(Field field,Object obj)
{
boolean flag = true;
field.setAccessible(true);
try
{
if(field.get(obj) == null)
{
flag = true;
}else
{
flag = false;
}
}catch(Exception e)
{
e.printStackTrace();
}
return flag;
}
}
package mliwng.persistent;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class SessionManager {
private Connection conn;
public SessionManager()
{
conn = (Connection)ConnectionManager.local.get();
}
public List loadAll(Class c) throws Exception
{
ResultSet rs = PreparedStatementManager.getSelectPstmt(c).executeQuery();
return this.getList(rs, c);
}
public List loadByKey(Class c,String key,Object object) throws Exception
{
ResultSet rs = PreparedStatementManager.getSelectByKeyPstmt(c, key,object).executeQuery();
return this.getList(rs, c);
}
public int save(Object object,String key) throws Exception
{
int i = 0;
i = PreparedStatementManager.getInsertPstmt(object).executeUpdate();
return i;
}
public int updateByKey(Object object,String key) throws Exception
{
int i = 0;
i = PreparedStatementManager.getUpdatePstmt(object, key).executeUpdate();
return i;
}
public int deleteByKey(Class c,String key,Object arg) throws Exception
{
int i = 0;
i = PreparedStatementManager.getDeletePstmt(c,key,arg).executeUpdate();
return i;
}
private List getList(ResultSet rs,Class c) throws Exception
{
List list = new ArrayList();
Object object = null;
Field[] fields = c.getDeclaredFields();
while(rs.next())
{
object = c.newInstance();
for(int i = 0;i<fields.length;i++)
{
fields[i].setAccessible(true);
fields[i].set(object, rs.getObject(fields[i].getName()));
}
list.add(object);
}
return list;
}
}
package mliwng.persistent;
import java.lang.reflect.Field;
public class SqlManager {
public static String createSelect(Class c)
{
StringBuffer buffer = new StringBuffer("SELECT * FROM ");
buffer.append(c.getSimpleName());
return buffer.toString();
}
public static String createSelectById(Class c , String key)
{
String sql = createSelect(c);
StringBuffer buffer = new StringBuffer(sql);
buffer.append(" WHERE ");
buffer.append(key);
buffer.append(" = ?");
return buffer.toString();
}
public static String createUpdate(Object obj,String key)
{
Field[] fields = obj.getClass().getDeclaredFields();
StringBuffer buffer = new StringBuffer("UPDATE ");
buffer.append(obj.getClass().getSimpleName());
buffer.append(" SET ");
for(int i = 0;i < fields.length;i ++)
{
if(!isNull(fields[i],obj))
{
buffer.append(fields[i].getName());
buffer.append( " = ? ,");
}
}
buffer = buffer.deleteCharAt(buffer.length() - 1);
buffer.append(" WHERE ");
buffer.append(key);
buffer.append(" = ?");
System.out.println(buffer.toString());
return buffer.toString();
}
public static String createInsert(Object obj)
{
StringBuffer buffer = new StringBuffer("INSERT INTO ");
buffer.append(obj.getClass().getSimpleName());
buffer.append("(");
Field[] fields = obj.getClass().getDeclaredFields();
StringBuffer bufferValue = new StringBuffer();
for(int i = 0;i < fields.length;i ++)
{
if(!isNull(fields[i],obj))
{
buffer.append(fields[i].getName());
buffer.append(",");
bufferValue.append("?,");
}
}
buffer = buffer.deleteCharAt(buffer.length() - 1);
buffer.append(")");
bufferValue = bufferValue.deleteCharAt(bufferValue.length() - 1);
buffer.append(" VALUES(");
buffer.append(bufferValue);
buffer.append(")");
return buffer.toString();
}
private static boolean isNull(Field field,Object obj)
{
boolean flag = true;
field.setAccessible(true);
try
{
if(field.get(obj) == null)
{
flag = true;
}else
{
flag = false;
}
}catch(Exception e)
{
e.printStackTrace();
}
return flag;
}
public static String createDelete(Class c,String key)
{
StringBuffer buffer = new StringBuffer("DELETE FROM ");
buffer.append(c.getSimpleName());
buffer.append(" WHERE ");
buffer.append(key);
buffer.append(" = ?");
return buffer.toString();
}
}
package mliwng.persistent;
import java.sql.Connection;
public class TransactionManager {
public static void beginTransaction()
{
Connection conn = (Connection)ConnectionManager.local.get();
try
{
conn.setAutoCommit(false);
}catch(Exception e)
{
e.printStackTrace();
}
}
public static void commit()
{
Connection conn = (Connection)ConnectionManager.local.get();
try
{
conn.commit();
}catch(Exception e)
{
e.printStackTrace();
}
}
public static void rollback()
{
Connection conn = (Connection)ConnectionManager.local.get();
try
{
conn.rollback();
}catch(Exception e)
{
e.printStackTrace();
}
}
}
这个是测试用的
package test;
public class User
{
private Integer id;
private String userName;
private String userPassword;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
}
package test;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.List;
import mliwng.persistent.ConnectionManager;
import mliwng.persistent.SessionManager;
import mliwng.persistent.TransactionManager;
public class UserDao{
public List list() throws Exception
{
return new SessionManager().loadAll(User.class);
}
public void insert(User user) throws Exception
{
new SessionManager().save(user, "id");
}
public void update(User user) throws Exception
{
new SessionManager().updateByKey(user, "id");
}
public void delete(int id) throws Exception
{
new SessionManager().deleteByKey(User.class,"id",id);
}
public List select() throws Exception
{
return new SessionManager().loadByKey(User.class, "userName","mliwng");
}
public static void main(String[] args)
{
UserDao dao = new UserDao();
User user = new User();
user.setUserName("11111");
user.setId(1);
User user1 = new User();
user1.setUserName("cccc");
user1.setUserPassword("cccc");
User user2 = new User();
user2.setUserName("bbbb");
user2.setUserPassword("bbb");
ConnectionManager.openConnection(); //打开连接
TransactionManager.beginTransaction(); //开启事务
try
{
dao.insert(user2); //调用UserDao.insert()方法保存User2对象
TransactionManager.commit(); 提交事务
}catch(Exception e)
{
e.printStackTrace();
TransactionManager.rollback(); //出错时回滚
}finally
{
ConnectionManager.closeConnection();
}
}
}