根据需求做出了这个项目,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>
- 大小: 2.4 KB
- 大小: 2.3 KB
- 大小: 9.3 KB
分享到:
相关推荐
Hibernate 基于持久层框架的DAO模式应用
域对象在持久化层的状态
Spring的作用贯穿了整个中间层,将Web层、Service层、DAO层及PO无缝整合,其数据服务层用来存放数据。 一个良好的框架可以让开发人员减轻重新建立解决复杂问题方案的负担和精力;它可以被扩展以进行内部的定制化;...
插件中封装了一系列数据库操作的类,根据实体模型自动化生成插入、更新、删除、查询语句,Dao层通用函数封装,使用此插件基本上只用写少量的数据库层代码即可完成对数据库的操作。
自己写的一个持久化层,模仿Hibernate的操作
spring持久层封装,新手可用,物超所值
DaoMockDao层持久化封装1.根据项目的PO实体,VO实体来生成对应属性的XML文件信息(配上对的主外键注解,表名注解);2.根据XML类的属性来拼装不同操作SQL语句(save update delete findByEntitys(单表) findBySearch(多...
基于Java Swing和DOM4J的购物管理系统是...同时,采用DOM4J实现了数据的持久化存储,保证了数据的安全性和稳定性。 总之,该系统是一款功能齐全、操作简单、数据安全的购物管理系统,可以为用户和管理员提供方便的购物
博客地址 http://blog.csdn.net/sbsujjbcy/article/details/48026077
action层控制层 控制业务逻辑dao层 持久层 与数据库的交互service层(biz):业务层 控制业务domain层(entity):实体层
sentinel-mysql规则持久化,持久化规则数据至mysql,包含数据表结构,配置文件,jar,一键启动
使用freemarker生成spring mvc框架的dao,service和mybatis CURD范式代码
这份文档以例子的形式讲诉了Spring持久层的封装,希望可以帮助学习的人!
凑着刚用完的余热,把持久化简单的封装了一下。需要使用的朋友直接把 JGGchijiuhua类拉进工程,直接调用类方法即可。用法很简单。
Hibernate、iBATIS、TopLink、Castor JDO、Apache OJB等这么多持久层框架,你还在为学习上面那个框架而苦恼吗?你还为研究下一代是那个而头疼吗? 朋友,学习JPA吧!JPA的出现就是解决您上面的苦恼的。
解压后配置mysql-generator.xml文件中的数据库链接信息及表信息,双击generate.bat即可自动生成mysql持久层dao,实体类及映射文件mapper
java 之持久化mybatis3,手册详细的描述了mybatis的使用规范及介绍
ios 数据存储,数据持久化,包含Preference 、文件存储、归档、数据库 、 CoreData的使用
sentinel 1.8.3持久化到nacos
描述MQ消息持久化,在队列管理器发生异常时,传送到队列中的信息怎样通过日志将信息恢复到队列中。