持久化综合练习(DAO层的“简陋”封装及DOM4J的使用)

 

根据需求做出了这个项目,SQL查询使用LIST<MAP>来封装(mssql,mysql),XML就很简陋了。

此项目可以通过反射或者工厂模式来动态的获取DAO层实现类。

项目中部分类使用了单态类,因为之前没有接触个单态类,所以在这次练习中尝试了单态类。单态类的好处就是避免在代码编写过程中,一个类Class只有一个实例存在,可能用在这个地方有点牵强,在下才疏学浅,权当是练习了。。

 

 

需求1 :在数据库中建表保存下面的信息。

班级信息

班级编号 班级名称

1 一班

2 二班

学生信息

学号 姓名 班级编号

100 a 1

101 b 1

102 c 2

 

 

 

create  table  t_class(c_id  int  identity  primary  key,
c_name  varchar(4));
create  table  t_stu(s_id  varchar(4) primary  key,
s_name  varchar(1),c_id  int,foreign  key(c_id) references  t_class(c_id));
insert  into  t_class(c_name) values('一班');
insert  into  t_class(c_name) values('二班');
insert  into  t_stu(s_id,s_name,c_id) values('100','a',1);
insert  into  t_stu(s_id,s_name,c_id) values('101','b',1);
insert  into  t_stu(s_id,s_name,c_id) values('102','c',2);
select  * from  t_class;
select  * from  t_stu;
 

 

 

 

 

 

需求2 :查询各班的学生详细信息。

班级编号 班级名称 学号 姓名

 

 

select  c.c_id  '班级编号',c_name  '班级名称',s_id  '学号',s_name  '姓名'  from  t_stu  s  join  t_class  c  on  c.c_id=s.c_id
 

 

 

 

需求3 突然不用数据库了,要改用xml存储。如何编写代码?

·抽取接口X,原来的类就是用JDBC实现了这个接口。

·用DOM4j实现接口X

·为了避免在代码中直接new 实现类(JDBC实现类,DOM4j实现类)

·直接在配置文件中用反射

·建一个工厂类,专门生产各种接口下的实现类对象

 

 

项目结构如下:


 

1. UTIL工具类(粘贴出部分方法)

该类包括数据库连接,SQL查询封装及反射技术获取接口实现类。此类为单态类

 

public static DataBase getDataBase() {
		if (dataBase != null) {
			return dataBase;
		}
		return new DataBase();
	}

	public static String getProp(String key) {
		Properties prop = new Properties();
		String values = "";
		try {
			prop.load(new FileInputStream("properties/DBSelect.properties"));
			values = prop.getProperty(key);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return values;
	}

	// 查询封装
	public static List<Map<String, Object>> executeQuery(String sql,
			Object... args) {
		List<Map<String, Object>> listMap = new ArrayList<Map<String, Object>>();
		PreparedStatement pst;
		try {
			pst = conn.prepareStatement(sql);
			if (args != null) {
				for (int pos = 0; pos < args.length; pos++) {
					pst.setObject(pos + 1, args[pos]);
				}
			}
			ResultSet rs = pst.executeQuery();
			ResultSetMetaData rsmd = rs.getMetaData();
			int count = rsmd.getColumnCount();
			while (rs.next()) {
				Map<String, Object> map = new HashMap<String, Object>();
				for (int i = 0; i < count; i++) {
					map.put(rsmd.getColumnName(i + 1), rs.getObject(i + 1));
				}
				listMap.add(map);
			}
			rs.close();
			pst.close();
			// closeDB();
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return listMap;
	}

	// 反射技术获取实现类
	public static IDAO getDAOImp() {
		IDAO dao = null;
		String classUrl = getProp("implements");
		String name = "get" + classUrl.substring(classUrl.lastIndexOf(".") + 1);
		try {
			Class c = Class.forName(classUrl);
			Method getImp = c.getDeclaredMethod(name, null);
			Object o = getImp.invoke(null, null);
			dao = (IDAO) o;
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
		return dao;
	}

2 . 实现类的部分方法:(实现类也是单态类)

 

Mssql 的实现类,重写IDAO接口的query方法

 

@Override
	public void query() {
		String sqlStr = "select  c.c_id  '班级编号',"
				+ "c_name  '班级名称',s_id  '学号',"
				+ "s_name  '姓名'  from  t_stu  s  join  t_class  c  on  c.c_id=s.c_id";
		List<Map<String, Object>> listMap = DataBase.executeQuery(sqlStr,
				new Object[] {});
		for (Map<String, Object> m : listMap) {
			Set<String> setKey = m.keySet();
			List<String> list = new ArrayList<String>();
			for (String o : setKey) {
				list.add(o);
			}
			//Collections.sort(list);
			//System.out.println(list);
			System.out.println(m.get(list.get(0)) + " " + m.get(list.get(1))
					+ " " + m.get(list.get(2)) + " " + m.get(list.get(3)));
		}
		dataBase.closeDB();
	}

  Xml 的实现类:使用了DOM4J解析xml

 

@Override
	public void query() {
		SAXReader reader = new SAXReader();
		reader.setEncoding("UTF-8");
		try {
			Document doc = reader.read(new File(DataBase.getProp("xmlUrl")));
			String xPath = "//school/class/student/@id";
			List<Attribute> stuIdList = doc.selectNodes(xPath);
			StringBuffer sb = new StringBuffer();
			System.out.println("班级编号"+" "+"班级名称"+" "+"学号"+" "+"学生名字");
			for (int i = 0; i < stuIdList.size(); i++) {
				sb.delete(0, sb.length());
				sb.append(stuIdList.get(i).getParent().getParent().attribute(0)
						.getText()
						+ " ");
				sb.append(stuIdList.get(i).getParent().getParent().attribute(1)
						.getText()
						+ " ");
				sb.append(stuIdList.get(i).getText() + " ");
				sb.append(stuIdList.get(i).getParent().attribute(1).getText()
						+ " ");
				System.out.println(sb.toString());
			}
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}

 3.工厂类:

 

public static IDAO getSQL() {
		String values = DataBase.getProp("dataBase");
		if (values.equalsIgnoreCase("sqlserver")) {
			return DAOImp_MSSQL.getDAOImp_MSSQL();
		} else if (values.equalsIgnoreCase("mysql")) {
			return DAOImp_MYSQL.getDAOImp_MSSQL();
		} else if (values.equalsIgnoreCase("xml")) {
			return DAOImp_XML.getDAOImp_XML();
		} else {
			return null;
		}
	}

 4.properties属性文件:

 

dataBase=mysql
#dataBase=sqlserver
#dataBase=xml

#sqlserver
sqlUrl=jdbc:jtds:sqlserver://localhost:1433/lovo_test
sqlName=sa
sqlPsw=107s5
sqlClass=net.sourceforge.jtds.jdbc.Driver

#mysql
mysqlUrl=jdbc:mysql://localhost:3306/lovo_test
mysqlName=root
mysqlPsw=
mysqlClass=com.mysql.jdbc.Driver

#xml
xmlUrl=xml/school.xml

#reflect
#implements=org.senny.dao.DAOImp_MSSQL
#implements=org.senny.dao.DAOImp_MYSQL
implements=org.senny.dao.DAOImp_XML

 5.xml:

 

<?xml version="1.0" encoding="UTF-8"?>
<school>
	<class id="1" name="一班">
		<student id="100" name="a" />
		<student id="101" name="b" />
	</class>
	<class id="2" name="二班">
		<student id="103" name="c" />
	</class>
</school>
 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值