在不用Hibernate 域 IBATIS等框架写DAO一般都像如下:
public void save(Bean bean){
Connection con = null;
Statement stmt = null;
try{
//从连接工厂获取连接
con = ConnectionFactory.getConnection();
stmt = con.createStatement();
String sql = "insert ....";
stmt.execute(sql);
}catch(Exception e){
}finally{
//释放资源
try{
if(con != null)con.close();
if(stmt != null)stmt.close();
}catch(Exception e){
}
}
}
上面是一个保存的方法,其它的删除,查询和更新基本都差不多,不同的只有sql和执行的方法:execute域executeQuery,查询时会多了一个返回值
那么就是说在增删查改会有大量代码重复,所以我每次在不用框架下看写完的DAO都会比较不爽
昨天把那些重复的代码抽离出来,重复代码抽离后的DAO如下:
public class StudentDAO {
......
......
......
public void add(Statement stmt, Map map){
String sql = "insert into student(name, sex, age)"
+ " values('" + (String)map.get("name")
+ "', '" + (String)map.get("sex")
+ "', " + (String)map.get("age") + ")";
try{
stmt.execute(sql);
}catch(Exception e){
e.printStackTrace();
}
}
.......
.......
.......
}
只需要编写必要的代码,那些重复的代码都被我抽到别的类统一调用
下面是完整代码:
Student Bean
----------------------------------------------------------------------------------
public class Student {
private int id;
private String name;
private String sex;
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Map toMap(){
Map map = new HashMap();
map.put("id", String.valueOf(id));
map.put("name", name);
map.put("sex", sex);
map.put("age", String.valueOf(age));
return map;
}
}
IBuilder 类建造器接口
---------------------------------------------------------------------------------
public interface IBuilder {
public void build(ResultSet rs) throws SQLException;
public Object getResult();
}
StudentBuilder 学生类的建造器
---------------------------------------------------------------------------------
public class StudentBuilder implements IBuilder{
private Student student = new Student();
public void build(ResultSet rs) throws SQLException{
// TODO Auto-generated method stub
student.setId(rs.getInt("id"));
student.setName(rs.getString("name"));
student.setSex(rs.getString("sex"));
student.setAge(rs.getInt("age"));
}
public Object getResult() {
// TODO Auto-generated method stub
return student;
}
}
StudentDAO student表的操作DAO
---------------------------------------------------------------------------------
public class StudentDAO {
private static StudentDAO instance = new StudentDAO();
private StudentDAO(){
}
public static StudentDAO getInstance(){
return instance;
}
public void add(Statement stmt, Map map){
String sql = "insert into student(name, sex, age)"
+ " values('" + (String)map.get("name")
+ "', '" + (String)map.get("sex")
+ "', " + (String)map.get("age") + ")";
try{
stmt.execute(sql);
}catch(Exception e){
e.printStackTrace();
}
}
public void delete(Statement stmt, Map map){
String sql = "delete from student"
+ " where id = " + (String)map.get("id");
try{
stmt.execute(sql);
}catch(Exception e){
e.printStackTrace();
}
}
public ResultSet query(Statement stmt, Map map){
ResultSet rs = null;
String sql = "select * from student"
+ " where name='" + (String)map.get("name") + "'";
try{
rs = stmt.executeQuery(sql);
}catch(Exception e){
e.printStackTrace();
}
return rs;
}
public ResultSet queryById(Statement stmt, Map map){
ResultSet rs = null;
String sql = "select * from student"
+ " where id=" + (String)map.get("id");
try{
rs = stmt.executeQuery(sql);
}catch(Exception e){
e.printStackTrace();
}
return rs;
}
public void update(Statement stmt, Map map){
String sql = "update student"
+ " set name = '" + (String)map.get("name")
+ "', sex = '" + (String)map.get("sex")
+ "', age = " + (String)map.get("age")
+ " where id = " + (String)map.get("id");
try{
stmt.execute(sql);
}catch(Exception e){
e.printStackTrace();
}
}
}
IBuilderFactory 类建造器工厂接口
----------------------------------------------------------------------------------
public interface IBuilderFactory {
public IBuilder getBuilder(Class classType);
}
BuilderFactory 类建造器工厂实现类
----------------------------------------------------------------------------------
public class BuilderFactory implements IBuilderFactory {
public IBuilder getBuilder(Class classType) {
// TODO Auto-generated method stub
IBuilder builder = null;
try{
builder = (IBuilder)Class.forName(classType.getName()).newInstance();
}catch(Exception e){
e.printStackTrace();
}
return builder;
}
}
IConnectionFactory 连接工厂接口
---------------------------------------------------------------------------------
public interface IConnectionFactory {
public Connection getConnection() throws SQLException, ClassNotFoundException;
}
ConnectionFactory 连接工厂实现类
----------------------------------------------------------------------------------
public class ConnectionFactory implements IConnectionFactory {
private static ConnectionFactory instance = new ConnectionFactory();
private String driver = "com.mysql.jdbc.Driver";
private String username = "root";
private String password = "123456";
private String url = "jdbc:mysql://localhost:3306/xin";
private ConnectionFactory(){
}
public static ConnectionFactory getInstance(){
return instance;
}
public Connection getConnection() throws SQLException, ClassNotFoundException {
// TODO Auto-generated method stub
Class.forName(driver);
return DriverManager.getConnection(url, username, password);
}
}
StudentDAOService StudentDAO的外层服务
---------------------------------------------------------------------------------
public class StudentDAOService {
private IDAOFlayweight fw = DAOFlayweight.getInstance();
private StudentDAO dao = StudentDAO.getInstance();
public void add(Student student){
fw.request(dao, "add", student.toMap(), true, StudentBuilder.class);
}
public void delete(int id){
Map map = new HashMap();
map.put("id", String.valueOf(id));
fw.request(dao, "delete", map, true, StudentBuilder.class);
}
public List query(String name){
Map map = new HashMap();
map.put("name", name);
List list = fw.request(dao, "query", map, true, StudentBuilder.class);
return list;
}
public Student queryById(int id){
Map map = new HashMap();
map.put("id", String.valueOf(id));
List list = fw.request(dao, "queryById", map, true, StudentBuilder.class);
if(list != null && list.size() == 1)
return (Student)list.get(0);
else
return null;
}
public void update(Student student){
fw.request(dao, "update", student.toMap(), true, StudentBuilder.class);
}
}
BackInvoker 类方法回调
----------------------------------------------------------------------------------
public class BackInvoker {
private static BackInvoker instance = new BackInvoker();
private BackInvoker(){
}
public static BackInvoker getInstance(){
return instance;
}
public Object invokeMethod(Object invoke, String methodName, Class[] paramTypes, Object[] params){
Object result = null;
try{
Class invokeClass = invoke.getClass();
Method method = invokeClass.getMethod(methodName, paramTypes);
result = method.invoke(invoke, params);
}catch(Exception e){
e.printStackTrace();
}
return result;
}
}
IDAOFlayweight 真正调用DAO的类接口
---------------------------------------------------------------------------------
public interface IDAOFlayweight {
public List request(Object invoke, String methodName, Map map, boolean isAutoCommit, Class classType);
}
DAOFlayweight 真正调用DAO的类实现类
---------------------------------------------------------------------------------
public class DAOFlayweight implements IDAOFlayweight{
private static DAOFlayweight instance;
private static String key = "key";
private DAOFlayweight(){
}
public static DAOFlayweight getInstance(){
if(instance == null){
synchronized(key){
if(instance == null){
instance = new DAOFlayweight();
}
}
}
return instance;
}
public List put(Object result, ResultSet rs, Class classType) throws SQLException{
List list = null;
//对结果进行处理
if(result != null){
//对查询结果进行封装
if(result instanceof ResultSet){
list = new ArrayList();
rs = (ResultSet)result;
IBuilderFactory factory = new BuilderFactory();
while(rs.next()){
IBuilder builder = factory.getBuilder(classType);
builder.build(rs);
list.add(builder.getResult());
}
}
}
return list;
}
public List request(Object invoke, String methodName, Map map, boolean isAutoCommit, Class classType){
List list = null;
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try{
//创建所需的操作数据库对象
con = ConnectionFactory.getInstance().getConnection();
con.setAutoCommit(isAutoCommit);
stmt = con.createStatement();
//调用DAO的方法
Object result = BackInvoker.getInstance().invokeMethod(invoke, methodName, new Class[]{Statement.class, Map.class}, new Object[]{stmt, map});
list = put(result, rs, classType);
if(isAutoCommit == false)con.commit();
}catch(Exception e){
if(isAutoCommit == false)
try {
con.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
}finally{
try{
if(rs != null)
rs.close();
if(stmt != null)
stmt.close();
if(con != null)
con.close();
}catch(Exception e){}
}
return list;
}
}
Main
---------------------------------------------------------------------------------
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
StudentDAOService service = new StudentDAOService();
Student student = new Student();
student.setName("XiaoLi");
student.setSex("male");
student.setAge(22);
System.out.println("----------- 添加记录 ----------");
service.add(student);
System.out.println("----------- 查询1 ----------");
Student stu = service.queryById(1);
System.out.println("id = " + stu.getId()
+ ", name = " + stu.getName()
+ ", sex = " + stu.getSex()
+ ", age = " + stu.getAge());
System.out.println("----------- 查询2 ----------");
List list = service.query("XiaoLi");
for(int i = 0; i < list.size(); i++){
stu = (Student)list.get(i);
System.out.println("id = " + stu.getId()
+ ", name = " + stu.getName()
+ ", sex = " + stu.getSex()
+ ", age = " + stu.getAge());
}
System.out.println("----------- 信息更新 ----------");
stu.setAge(27);
service.update(stu);
// System.out.println("----------- 删除记录 ----------");
// service.delete(2);
}
}
源码:
public void save(Bean bean){
Connection con = null;
Statement stmt = null;
try{
//从连接工厂获取连接
con = ConnectionFactory.getConnection();
stmt = con.createStatement();
String sql = "insert ....";
stmt.execute(sql);
}catch(Exception e){
}finally{
//释放资源
try{
if(con != null)con.close();
if(stmt != null)stmt.close();
}catch(Exception e){
}
}
}
上面是一个保存的方法,其它的删除,查询和更新基本都差不多,不同的只有sql和执行的方法:execute域executeQuery,查询时会多了一个返回值
那么就是说在增删查改会有大量代码重复,所以我每次在不用框架下看写完的DAO都会比较不爽
昨天把那些重复的代码抽离出来,重复代码抽离后的DAO如下:
public class StudentDAO {
......
......
......
public void add(Statement stmt, Map map){
String sql = "insert into student(name, sex, age)"
+ " values('" + (String)map.get("name")
+ "', '" + (String)map.get("sex")
+ "', " + (String)map.get("age") + ")";
try{
stmt.execute(sql);
}catch(Exception e){
e.printStackTrace();
}
}
.......
.......
.......
}
只需要编写必要的代码,那些重复的代码都被我抽到别的类统一调用
下面是完整代码:
Student Bean
----------------------------------------------------------------------------------
public class Student {
private int id;
private String name;
private String sex;
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Map toMap(){
Map map = new HashMap();
map.put("id", String.valueOf(id));
map.put("name", name);
map.put("sex", sex);
map.put("age", String.valueOf(age));
return map;
}
}
IBuilder 类建造器接口
---------------------------------------------------------------------------------
public interface IBuilder {
public void build(ResultSet rs) throws SQLException;
public Object getResult();
}
StudentBuilder 学生类的建造器
---------------------------------------------------------------------------------
public class StudentBuilder implements IBuilder{
private Student student = new Student();
public void build(ResultSet rs) throws SQLException{
// TODO Auto-generated method stub
student.setId(rs.getInt("id"));
student.setName(rs.getString("name"));
student.setSex(rs.getString("sex"));
student.setAge(rs.getInt("age"));
}
public Object getResult() {
// TODO Auto-generated method stub
return student;
}
}
StudentDAO student表的操作DAO
---------------------------------------------------------------------------------
public class StudentDAO {
private static StudentDAO instance = new StudentDAO();
private StudentDAO(){
}
public static StudentDAO getInstance(){
return instance;
}
public void add(Statement stmt, Map map){
String sql = "insert into student(name, sex, age)"
+ " values('" + (String)map.get("name")
+ "', '" + (String)map.get("sex")
+ "', " + (String)map.get("age") + ")";
try{
stmt.execute(sql);
}catch(Exception e){
e.printStackTrace();
}
}
public void delete(Statement stmt, Map map){
String sql = "delete from student"
+ " where id = " + (String)map.get("id");
try{
stmt.execute(sql);
}catch(Exception e){
e.printStackTrace();
}
}
public ResultSet query(Statement stmt, Map map){
ResultSet rs = null;
String sql = "select * from student"
+ " where name='" + (String)map.get("name") + "'";
try{
rs = stmt.executeQuery(sql);
}catch(Exception e){
e.printStackTrace();
}
return rs;
}
public ResultSet queryById(Statement stmt, Map map){
ResultSet rs = null;
String sql = "select * from student"
+ " where id=" + (String)map.get("id");
try{
rs = stmt.executeQuery(sql);
}catch(Exception e){
e.printStackTrace();
}
return rs;
}
public void update(Statement stmt, Map map){
String sql = "update student"
+ " set name = '" + (String)map.get("name")
+ "', sex = '" + (String)map.get("sex")
+ "', age = " + (String)map.get("age")
+ " where id = " + (String)map.get("id");
try{
stmt.execute(sql);
}catch(Exception e){
e.printStackTrace();
}
}
}
IBuilderFactory 类建造器工厂接口
----------------------------------------------------------------------------------
public interface IBuilderFactory {
public IBuilder getBuilder(Class classType);
}
BuilderFactory 类建造器工厂实现类
----------------------------------------------------------------------------------
public class BuilderFactory implements IBuilderFactory {
public IBuilder getBuilder(Class classType) {
// TODO Auto-generated method stub
IBuilder builder = null;
try{
builder = (IBuilder)Class.forName(classType.getName()).newInstance();
}catch(Exception e){
e.printStackTrace();
}
return builder;
}
}
IConnectionFactory 连接工厂接口
---------------------------------------------------------------------------------
public interface IConnectionFactory {
public Connection getConnection() throws SQLException, ClassNotFoundException;
}
ConnectionFactory 连接工厂实现类
----------------------------------------------------------------------------------
public class ConnectionFactory implements IConnectionFactory {
private static ConnectionFactory instance = new ConnectionFactory();
private String driver = "com.mysql.jdbc.Driver";
private String username = "root";
private String password = "123456";
private String url = "jdbc:mysql://localhost:3306/xin";
private ConnectionFactory(){
}
public static ConnectionFactory getInstance(){
return instance;
}
public Connection getConnection() throws SQLException, ClassNotFoundException {
// TODO Auto-generated method stub
Class.forName(driver);
return DriverManager.getConnection(url, username, password);
}
}
StudentDAOService StudentDAO的外层服务
---------------------------------------------------------------------------------
public class StudentDAOService {
private IDAOFlayweight fw = DAOFlayweight.getInstance();
private StudentDAO dao = StudentDAO.getInstance();
public void add(Student student){
fw.request(dao, "add", student.toMap(), true, StudentBuilder.class);
}
public void delete(int id){
Map map = new HashMap();
map.put("id", String.valueOf(id));
fw.request(dao, "delete", map, true, StudentBuilder.class);
}
public List query(String name){
Map map = new HashMap();
map.put("name", name);
List list = fw.request(dao, "query", map, true, StudentBuilder.class);
return list;
}
public Student queryById(int id){
Map map = new HashMap();
map.put("id", String.valueOf(id));
List list = fw.request(dao, "queryById", map, true, StudentBuilder.class);
if(list != null && list.size() == 1)
return (Student)list.get(0);
else
return null;
}
public void update(Student student){
fw.request(dao, "update", student.toMap(), true, StudentBuilder.class);
}
}
BackInvoker 类方法回调
----------------------------------------------------------------------------------
public class BackInvoker {
private static BackInvoker instance = new BackInvoker();
private BackInvoker(){
}
public static BackInvoker getInstance(){
return instance;
}
public Object invokeMethod(Object invoke, String methodName, Class[] paramTypes, Object[] params){
Object result = null;
try{
Class invokeClass = invoke.getClass();
Method method = invokeClass.getMethod(methodName, paramTypes);
result = method.invoke(invoke, params);
}catch(Exception e){
e.printStackTrace();
}
return result;
}
}
IDAOFlayweight 真正调用DAO的类接口
---------------------------------------------------------------------------------
public interface IDAOFlayweight {
public List request(Object invoke, String methodName, Map map, boolean isAutoCommit, Class classType);
}
DAOFlayweight 真正调用DAO的类实现类
---------------------------------------------------------------------------------
public class DAOFlayweight implements IDAOFlayweight{
private static DAOFlayweight instance;
private static String key = "key";
private DAOFlayweight(){
}
public static DAOFlayweight getInstance(){
if(instance == null){
synchronized(key){
if(instance == null){
instance = new DAOFlayweight();
}
}
}
return instance;
}
public List put(Object result, ResultSet rs, Class classType) throws SQLException{
List list = null;
//对结果进行处理
if(result != null){
//对查询结果进行封装
if(result instanceof ResultSet){
list = new ArrayList();
rs = (ResultSet)result;
IBuilderFactory factory = new BuilderFactory();
while(rs.next()){
IBuilder builder = factory.getBuilder(classType);
builder.build(rs);
list.add(builder.getResult());
}
}
}
return list;
}
public List request(Object invoke, String methodName, Map map, boolean isAutoCommit, Class classType){
List list = null;
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try{
//创建所需的操作数据库对象
con = ConnectionFactory.getInstance().getConnection();
con.setAutoCommit(isAutoCommit);
stmt = con.createStatement();
//调用DAO的方法
Object result = BackInvoker.getInstance().invokeMethod(invoke, methodName, new Class[]{Statement.class, Map.class}, new Object[]{stmt, map});
list = put(result, rs, classType);
if(isAutoCommit == false)con.commit();
}catch(Exception e){
if(isAutoCommit == false)
try {
con.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
}finally{
try{
if(rs != null)
rs.close();
if(stmt != null)
stmt.close();
if(con != null)
con.close();
}catch(Exception e){}
}
return list;
}
}
Main
---------------------------------------------------------------------------------
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
StudentDAOService service = new StudentDAOService();
Student student = new Student();
student.setName("XiaoLi");
student.setSex("male");
student.setAge(22);
System.out.println("----------- 添加记录 ----------");
service.add(student);
System.out.println("----------- 查询1 ----------");
Student stu = service.queryById(1);
System.out.println("id = " + stu.getId()
+ ", name = " + stu.getName()
+ ", sex = " + stu.getSex()
+ ", age = " + stu.getAge());
System.out.println("----------- 查询2 ----------");
List list = service.query("XiaoLi");
for(int i = 0; i < list.size(); i++){
stu = (Student)list.get(i);
System.out.println("id = " + stu.getId()
+ ", name = " + stu.getName()
+ ", sex = " + stu.getSex()
+ ", age = " + stu.getAge());
}
System.out.println("----------- 信息更新 ----------");
stu.setAge(27);
service.update(stu);
// System.out.println("----------- 删除记录 ----------");
// service.delete(2);
}
}
源码: