- 浏览: 228312 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (268)
- oracle (15)
- 设计模式 (4)
- java (16)
- 线程(Thread) (1)
- 常用 (4)
- PL/SQL (1)
- SWING (10)
- 架构 (4)
- 正则表达式 (5)
- Linux (16)
- PostgreSQL (1)
- FTP (1)
- mysql (4)
- TOMCAT (5)
- 素材 (2)
- Hibernate (3)
- 报表打印 (1)
- 高并发,大数据量处理 (6)
- UML (1)
- memcache (3)
- JMF (1)
- 通信 (2)
- window常见问题处理 (5)
- eclipse (7)
- 数据库 (2)
- java内存 (4)
- maven (4)
- Spring (12)
- JavaScript (22)
- nodejs (5)
- OSGI (1)
- 其他 (1)
- 企业开发平台 (1)
- web页面懒加载 (3)
- VMware (2)
- hadoop (2)
- hadoop.hadoop学习笔记 (1)
- web前端 (32)
- vim (6)
- CSS (21)
- web前端.widget (2)
- Activiti (1)
- BPMN (1)
- Cookie (1)
- nigix (1)
- SVN (1)
最新评论
-
woodding2008:
太棒了
用一段代码演示马云双十一晚会上玩的纸牌魔术 -
nihaonihao1987:
[b][/b]
特别响、非常近——BPMN2新规范与Activiti5 -
coosummer:
推荐使用http://buttoncssgenerator.c ...
CSS Button -
tw_wangzhengquan:
ahua186186 写道compile 'com.oracl ...
ext4,spring,hibernate构建企业开发平台 -
ahua186186:
compile 'com.oracle:ojdbc14:10. ...
ext4,spring,hibernate构建企业开发平台
DAO数据库操作类实现在配置文件中的工厂化管理
一、搭建 Hibernate 环境
二、创建数据库操作接口和实现类
<!--[if !supportLists]-->1、 <!--[endif]-->接口
基类接口(所有接口都继承该接口):
package fr.itris.glips.dbconn.module.dao;
import java.io.Serializable;
import java.util.*;
import fr.itris.glips.dbconn.util.HibernateUtil;
public interface DAO {
public void save(Object obj);
public void saveOrUpdate(Object obj);
public List<Object[]> listBySql(String sql);
public List listAll();
public List listAll(Class c);
public List list(String hql);
public List list( String hql, Object[] values);
public Class getEntiryClass();
public Object get( Serializable id);
public Object load( Serializable id);
public Object get(Class c, Serializable id);
public Object load(Class c,Serializable id);
}
实体类接口:
package fr.itris.glips.dbconn.module.dao;
public interface StationDAO extends DAO{
}
<!--[if !supportLists]-->2、 <!--[endif]-->实现类:
基类抽象实现类(所有实现类都继承该类):
package fr.itris.glips.dbconn.module.dao.impl;
import java.io.Serializable;
import java.util.List;
import fr.itris.glips.dbconn.module.dao.DAO;
import fr.itris.glips.dbconn.util.HibernateUtil;
public abstract class AbstractDAO implements DAO{
@Override
public void save(Object entity) {
// TODO Auto-generated method stub
HibernateUtil.save(entity);
}
@Override
public void saveOrUpdate(Object entity) {
// TODO Auto-generated method stub
HibernateUtil.saveOrUpdate(entity);
}
@Override
public List listBySql(String sql) {
// TODO Auto-generated method stub
return HibernateUtil.listBySql(sql);
}
@Override
public java.util.List listAll() {
// TODO Auto-generated method stub
return listAll(getEntiryClass());
}
public java.util.List listAll(Class c) {
// TODO Auto-generated method stub
return HibernateUtil.listAll(c);
}
@Override
public List list(String hql) {
// TODO Auto-generated method stub
return HibernateUtil.list(hql);
};
@Override
public List list(String hql, Object[] values) {
// TODO Auto-generated method stub
return HibernateUtil.list(hql,values);
}
public Object get( Serializable id){
return get(getEntiryClass(), id);
}
public Object load( Serializable id){
return load(getEntiryClass(), id);
}
public Object get(Class c, Serializable id){
return HibernateUtil.get(c, id);
}
public Object load(Class c,Serializable id){
return HibernateUtil.load(c, id);
}
abstract public Class getEntiryClass();
}
基类实现类:
package fr.itris.glips.dbconn.module.dao.impl;
import java.io.Serializable;
import java.util.List;
import fr.itris.glips.dbconn.module.dao.DAO;
import fr.itris.glips.dbconn.util.*;
public class BaseDAO extends AbstractDAO{
@Override
public Class getEntiryClass() {
// TODO Auto-generated method stub
return null;
}
}
实体类实现类:
package fr.itris.glips.dbconn.module.dao.impl;
import fr.itris.glips.dbconn.module.bean.SVGConfigure;
import fr.itris.glips.dbconn.module.bean.SVGElement;
import fr.itris.glips.dbconn.module.bean.Station;
import fr.itris.glips.dbconn.module.dao.SVGConfigureDAO;
import fr.itris.glips.dbconn.module.dao.SVGElementDAO;
import fr.itris.glips.dbconn.module.dao.StationDAO;
public class StationDAOImpl extends AbstractDAO implements StationDAO{
public Class getEntiryClass(){return Station.class;};
}
三、创建工厂管理 DAO 数据库操作类
1 创建 dao.xml , key 代表接口, value 代表实现类
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<section name="DAO">
<entry key="fr.itris.glips.dbconn.module.dao.DAO" value="fr.itris.glips.dbconn.module.dao.impl.BaseDAO"/>
<entry key="fr.itris.glips.dbconn.module.dao.SVGElementDAO" value="fr.itris.glips.dbconn.module.dao.impl.SVGElementDAOImpl"/>
<entry key="fr.itris.glips.dbconn.module.dao.SVGConfigureDAO" value="fr.itris.glips.dbconn.module.dao.impl.SVGConfigureDAOImpl"/>
<entry key="fr.itris.glips.dbconn.module.dao.StationDAO" value="fr.itris.glips.dbconn.module.dao.impl.StationDAOImpl"/>
<entry key="fr.itris.glips.dbconn.module.dao.SVGElementTypeDAO" value="fr.itris.glips.dbconn.module.dao.impl.SVGElementTypeDAOImpl"/>
</section>
</configuration>
<!--[if !supportLists]-->2、 <!--[endif]-->创建 ResourcesManager (管理资源文件的类)
package fr.itris.glips.dbconn.resources;
import fr.itris.glips.library.*;
import fr.itris.glips.svgeditor.*;
import org.apache.batik.dom.svg.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.util.*;
import java.io.*;
import javax.swing.*;
import java.net.*;
import java.awt.*;
import java.util.prefs.*;
/**
* @author ITRIS, Jordi SUC
*
* The class managing the resources
*/
public class ResourcesManager {
/**
* the map associating the name of a xml document to this document
*/
private final static HashMap<String, Document> cachedXMLDocuments=
new HashMap<String, Document>();
/**
* create a document from tthe given file in the resource files
* @param name the name of the xml file
* @return the document
*/
public static Document getXMLDocument(String name){
Document doc=null;
if(name!=null && ! name.equals("")){
if(cachedXMLDocuments.containsKey(name)){
doc=cachedXMLDocuments.get(name);
}else{
DocumentBuilderFactory docBuildFactory=
DocumentBuilderFactory.newInstance();
String path="";
try{
//parses the XML file
DocumentBuilder docBuild=docBuildFactory.newDocumentBuilder();
path=getPath("xml/"+name);
doc=docBuild.parse(path);
}catch (Exception ex){ex.printStackTrace();}
if(doc!=null){
cachedXMLDocuments.put(name, doc);
}
}
}
return doc;
}
public static String getPath(String resource){
String path="";
//System.out.println("resource="+resource);
try{
path=ResourcesManager.class.getResource(resource).toExternalForm();
}catch (Exception ex){
ex.printStackTrace();
path="";
}
//System.out.println("path="+path);
return path;
}
}
<!--[if !supportLists]-->3、 <!--[endif]-->创建 DAOConfig 类(解析 dao.xml 文件的类)
package fr.itris.glips.dbconn.resources;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Properties;
import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import fr.itris.glips.dbconn.util.*;
import fr.itris.glips.svgeditor.NodeIterator;
public class DAOConfig {
private static final String DAO_CONFIG_FILE="dao.xml";
private static final String DAO_CONFIG_SECTION="DAO";
public static synchronized HashMap load(){
Document doc=ResourcesManager.getXMLDocument(DAO_CONFIG_FILE);
Element root=doc.getDocumentElement();
HashMap<Class,Class> map=new HashMap<Class,Class> ();
if(root!=null){
Node current=null;
for(current=root.getFirstChild(); current!=null; current=current.getNextSibling()){
String attr_name;
if(current!=null && current instanceof Element){
//System.out.println(current.getNodeName());
if(current.getNodeName()!=null &¤t.getNodeName().equals("section")){
attr_name=((Element)current).getAttribute("name");
Node current2;
if(attr_name!=null && attr_name.equals(DAO_CONFIG_SECTION)){
for(NodeIterator it2=new NodeIterator(current); it2.hasNext();){
current2=it2.next();
if(current2!=null && current2 instanceof Element){
if(current2.getNodeName()!=null&¤t2.getNodeName().equals("entry")){
String daoIface=((Element)current2).getAttribute("key");
//System.out.println("daoIface=="+daoIface);
String daoImpl=((Element)current2).getAttribute("value");
try{
Class iface=ClassToolKit.loadClass(daoIface);
Class impl=ClassToolKit.loadClass(daoImpl);
map.put(iface, impl);
}catch(ClassNotFoundException e){
e.printStackTrace();
}
}
}
}
}
}
}
}
}
return map;
}
public static void main(String[] args){
load();
}
}
<!--[if !supportLists]-->4、 <!--[endif]-->创建 DAO 工厂类
package fr.itris.glips.dbconn.factory;
import java.util.*;
import fr.itris.glips.dbconn.exception.DataAccessException;
import fr.itris.glips.dbconn.module.dao.*;
import fr.itris.glips.dbconn.module.dao.impl.BaseDAO;
import fr.itris.glips.dbconn.resources.DAOConfig;
public class DaoFactory {
private static HashMap<Class,Class> daoClassMap =null;
static Map<String,DAO> daoMap=new HashMap<String,DAO>();
static {
initial();
}
public static synchronized void initial(){
if(null==daoClassMap){
daoClassMap=DAOConfig.load();
}
System.out.println("daoMap.size="+daoClassMap.size());
}
/**
* 获取 DAO 数据库操作类
* @param daoInterface DAO 接口
* @return 实现类
*/
public static DAO getDAO(Class daoInterface){
DAO dao=daoMap.get(daoInterface.getName());
if(dao==null){
try {
Class daoCl=getDAOClass(daoInterface);
dao=(DAO) daoCl.newInstance();
daoMap.put(daoInterface.getName(), dao);
} catch ( Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
return dao;
}
public static Class getDAOClass(Class daoInterface) {
Class dao=daoClassMap.get(daoInterface);
if(null==dao){
System.out.println("No Implementation found of DAO interface=?"+daoInterface.getName());
}
return dao;
}
public static void main(String[] args){
System.out.println("getClass="+DaoFactory.getDAO( DAO.class));
String sql="select name,aliasname from svgconfigure";
DAO dao=new BaseDAO();
List list=dao.listBySql(sql);
for(Object arr:list){
//System.out.println(arr[0]+","+arr[1]);
}
}
}
四、辅助类
1 、工具类
HibernateUtil 类( Hibernate 数据库操作类用到得工具类)
package fr.itris.glips.dbconn.util;
import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.beanutils.BeanUtils;
import org.hibernate.*;
import org.hibernate.cfg.*;
import fr.itris.glips.dbconn.page.PageInfo;
public class HibernateUtil {
private static ThreadLocal<Session> threadLocal=new ThreadLocal<Session>();
private static SessionFactory sessionFactory=null;
static {
initial();
}
public static void initial(){
if(sessionFactory==null){
try{
sessionFactory=new Configuration().configure().buildSessionFactory();
/*Configuration cfg=new Configuration()
.addClass(events.Event.class)
.setProperty("hibernate.dialect","org.hibernate.dialect.MySQLInnoDBDialect")
.setProperty("hibernate.connection.datasource","java:com/env/jdbc/sample")
.setProperty("hibernate.order_update","true");
sessionFactory=cfg.buildSessionFactory();*/
}catch(Throwable ex)
{
ex.printStackTrace();
}
}
}
public static SessionFactory getSessionFactory(){
return sessionFactory;
}
public static Session getSession(){
//String f="sd/df";
return sessionFactory.openSession();
}
public static Session getCurrentSession(){
Session s=threadLocal.get();
if(s==null ){
s=sessionFactory.openSession();
threadLocal.set(s);
}
return s;
}
public static void closeCurrentSession(){
Session s=threadLocal.get();
if(s!=null){
s.close();
//s=null;
threadLocal.set(null);
}
}
//----------- 保存 --------
/**
* save 后数据进入一级缓存,不会进入二级缓存
* @param entity
*/
public static synchronized void save(Object entity){
Session session=getCurrentSession();
//Transaction tran=session.beginTransaction();
session.save(entity);
//tran.commit();
}
public static synchronized void saveOrUpdate(Object entity){
Session session=getCurrentSession();
//Transaction tran=session.beginTransaction();
session.saveOrUpdate (entity);
// tran.commit();
}
public void saveOrUpdateAll(final Collection entities){
Session session=getCurrentSession();
for (Iterator it = entities.iterator(); it.hasNext();) {
session.saveOrUpdate(it.next());
}
}
public void persist( final Object entity) {
Session session=getCurrentSession();
session.persist( entity);
}
public Object merge(final Object entity) {
Session session=getCurrentSession();
return session.merge( entity);
}
//---------------- 修改 --------
public void update(final Object entity ) {
Session session=getCurrentSession();
session.update(entity);
}
/**
*
* @param hql 也可用于删除,如: sql="delete TUser"
* @return
*/
public static int executeUpdate(String hql){
Session session=getCurrentSession();
//Transaction tran=session.beginTransaction();
Query query=session.createQuery(hql);
int n= query.executeUpdate();
//tran.commit();
return n;
}
public static void delete(Object obj){
Session session=getCurrentSession();
//Transaction tran=session.beginTransaction();
session.delete(obj);
//tran.commit();
}
/**
* @param sql 例如: sql="from TUser"
*/
public static void delete(String hql){
Session session=getCurrentSession();
//Transaction tran=session.beginTransaction();
session.delete(hql);
//tran.commit();
}
public void deleteAll(final Collection entities){
Session session=getCurrentSession();
for (Iterator it = entities.iterator(); it.hasNext();) {
session.delete(it.next());
}
}
public static void deleteById(Class cl,Serializable id){
Object obj=load(cl,id);
delete(obj);
}
public static int deleteAsScroll(String hql){
Session session=getCurrentSession();
Query query=session.createQuery(hql);
ScrollableResults scRes=query.scroll();
int i=0;
//Transaction tran=session.beginTransaction();
while(scRes.next()){
session.delete(scRes.get(i++));
}
//tran.commit();
return i;
}
//------------- 查询
/**
* 内部缓存和二级缓存查找
* 可返回代理类实例
* @param cl
* @param serializable
* @return
*/
public static Object load(Class cl,Serializable serializable){
Session session=getCurrentSession();
return session.load(cl, serializable);
}
/**
* 内部缓存查找
* 返回实体类
* @param cl
* @param serializable
* @return
*/
public static Object get(Class cl,Serializable serializable){
Session session=getCurrentSession();
return session.get(cl, serializable);
}
/**
* 一次取出所有数据
* 如果 hibernate.cache.use_query_cache 为 FALSE (系统默认),则不会利用缓存
* 否则,如果满足( 1 、完全相同的 SQL 重复执行, 2 、两次查询期间,对应的表没有发生过改变),利用缓存, key 为 sql 语句
* @param sql
* @return
*/
public static List list(String hql){
Session session=getCurrentSession();
Query query=session.createQuery(hql);
// 设置二级缓存
query.setCacheable(true);
return query.list();
}
/**
* Execute an HQL query, binding one value to a "?" parameter in the query string.
* @param queryString
* @param values
* @return
*/
public static List list(final String queryString, final Object[] values){
Session session=getCurrentSession();
Query queryObject = session.createQuery(queryString);
if (values != null) {
for (int i = 0; i < values.length; i++) {
queryObject.setParameter(i, values[i]);
}
}
return queryObject.list();
}
/**
* 一次取出一条数据
* *iterate 可充分利用缓存( key 为主键 Id ),但是如果缓存中查询不到,会出现 N+1 次查询 **
*
* * 首先执行一条 Select SQL 以获得所有符合条件的数据 id( 先在缓存中查找,如果查找不到就到数据库中查找 ) ,
* 随即, iterate 方法首先在本地缓存中根据 id 查找对应的实体对象是否存在(类似 Session.load() 方法),
* 如果缓存已经存在对应的数据,则直接以此数据对象作为查询结果,
* 如果没找到,再执行相应的 Select 语句获得对应的库表记录
* */
public static Iterator iterate(String sql){
Session session=getCurrentSession();
Query query=session.createQuery(sql);
// 设置二级缓存
query.setCacheable(true);
return query.iterate();
}
public static List listAll(Class c){
Session session=getCurrentSession();
Criteria criteria=session.createCriteria(c);
// 设置二级缓存
criteria.setCacheable(true);
return criteria.list();
}
/**
* 基于游标的数据遍历
* @param sql
* @return
*/
public static ScrollableResults scroll(String hql){
Session session=getCurrentSession();
Query query=session.createQuery(hql);
return query.scroll();
}
/**
*
* @param sql
* @return
*/
public static List listBySql (String sql){
Session session=getCurrentSession();
SQLQuery query=session.createSQLQuery(sql );
// 设置二级缓存
//query.setCacheable(true);
return query.list();
}
public static PageInfo pageQuery(Class c,PageInfo page){
Session session=getCurrentSession();
Criteria criteria=session.createCriteria(c);
// 设置二级缓存
criteria.setCacheable(true);
// 总数
page.setTotalRows(criteria.list().size());
int startIndex=(page.getPageNo()-1)*page.getPageSize();
criteria.setFirstResult(startIndex);
criteria.setMaxResults(page.getPageSize());
page.setPageContent(criteria.list());
return page;
}
public static PageInfo pageQuery(String hql,PageInfo page){
Session session=getCurrentSession();
Query query=session.createQuery(hql);
// 设置二级缓存
query.setCacheable(true);
page.setTotalRows(query.list().size());
int startIndex=(page.getPageNo()-1)*page.getPageSize();
query.setFirstResult(startIndex);
query.setMaxResults(page.getPageSize());
page.setPageContent(query.list());
return page;
}
public static void main(String[] args){
System.out.println("session=="+HibernateUtil.getSession());
}
}
ClassToolKit 类(根据类名生成类的类):
package fr.itris.glips.dbconn.util;
public class ClassToolKit{
public static Class loadClass(String className)throws ClassNotFoundException{
Class cls=null;
try{
cls=Thread.currentThread().getContextClassLoader().loadClass(className);
}catch(Exception e){
e.printStackTrace();
}
if(cls==null){
cls=Class.forName(className);
}
return cls;
}
}
<!--[if !supportLists]-->3、 <!--[endif]-->异常类
package fr.itris.glips.dbconn.exception;
public class DAOException extends RuntimeException{
private Throwable throwable;
public DAOException(String errorMassage){
super(errorMassage);
}
public DAOException(Throwable throwable){
this.throwable=throwable;
}
public DAOException(String errorMassage,Throwable throwable){
super(errorMassage);
this.throwable=throwable;
}
@Override
public void printStackTrace() {
if(throwable!=null){
System.err.println("A dao error has occured:");
throwable.printStackTrace();
}
}
}
类图:
相关推荐
Hibernate 是一个流行的持久层框架,可以与泛型Dao接口集成,实现数据访问的持久化。 Hibernate 对泛型Dao接口的实现主要通过继承泛型Dao接口,使用 Hibernate 的 Session 对象来实现数据访问。 Hibernate 对泛型...
利用org.springframework.orm.hibernate3.support.HibernateDaoSupport 实现对java数据访问层的基本实现,包含增删改查分页方法。
可以降低商业逻辑层和数据访问层的耦合度,提高应用的可维护性和可移植性。 由于底层数据源实现变化时,DAO向客户端提供的接口不会变化,所有该模式允许DAO调整到不同的存储模式,而不会影响其客户端或者业务组件。...
自己写的一个java示例 该示例用jdbc与java事务来实现DAO层的各个DAO的各方法之间的事务关联 使上层可以保证各数据访问的原子性 该示例包含了一个方便调用的数据库访问工具类,该工具类实现了调用SQL语句,调用...
对数据库的操作无非就“增删改查”。就最为普遍的单表操作而言,除了表和字段不同外,语句都是类似的,开发人员需要写...Spring-data-jpa的出现正可以让这样一个已经很“薄”的数据访问层变成只是一层接口的编写方式。
用DAO的方式处理登陆模块的数据库连接和数据的处理等部分,使得jsp页面中不再有复杂的用户名和密码等的验证代码,实现了视图(界面设计)与业务逻辑的分离,使程序清晰明朗,具有更高的可读性。
具体步骤如下: 1,设计数据表 2,在项目的JavaBean包中增加.上面数据表对应的类 3,在Dao层创建***dao接口,并设计关于数据表数据...(3)数据访问层(DAL,即Data Access Layer):Dao层 直接访问数据库的操作
自己写的一个java示例 该示例用jdbc与java事务来实现DAO层的各个DAO的各方法之间的事务关联 使上层可以保证各数据访问的原子性 该示例包含了一个方便调用的数据库访问工具类,该工具类实现了调用SQL语句,调用...
Dao层是SSM框架中的数据访问层,负责将业务逻辑与数据库之间的交互。Dao层通常使用MyBatis框架来实现数据访问。在上面的示例代码中,我们可以看到一个名为UserDao的Dao接口,该接口定义了多个方法,用于查询用户信息...
在数据源切换的场景中,我们通常将数据源信息存储在 `ThreadLocal` 中,然后在数据访问层(如 DAO)中通过 `ThreadLocal` 来获取当前线程的数据源信息,从而动态地切换数据源。 `AbstractRoutingDataSource` 是 ...
主要介绍了使用JDBC实现数据访问对象层(DAO)代码示例,具有一定参考价值,需要的朋友可以了解下。
一、项目前准备工作 1、eclipse 或者myeclipse 都可以 2、数据库(Oracle或者mysql或者其他也可以) 3、了解Javaweb相关知识 ...在dao下新建一个DBConn类用来处理对数据进行连接。 我使用的是Oracle数据
课程信息管理JavaWeb三层架构+增删改查+Tomcat,servlet,jsp是一个基于Java ...数据访问层(DAO):负责与数据库进行交互,实现对课程信息的存储和查询。 Tomcat:作为Web服务器,负责部署和运行该课程信息管理系统。
DAO(数据访问对象)模式在java项目开发中的应用非常广泛,它能够实现数据库层和业务层的分离及跨数据库平台的移植。本文介绍了DAO模式的功能和实现方法。
1.(持久层)数据访问层(dao) 2.(业务层)业务逻辑层(biz 或者services) 3.(表示层)表现层(view) entity:实体层,与数据库的某个表相关联。【modal,一般都是对象】 dao:数据访问层(data access ...
毕业设计基于JavaWeb实现的一个备忘录系统项目源码。难度适中,新手自己可操作 备忘录 介绍 后端部分基于Servlet、Jdbc实现. 前端部分基于Layui、jqury实现。 一个简单的前后端分离Demo,前后端交互JSON数据格式 ...
数据访问层(DAO层)是JavaEE项目中的一个重要组件,主要负责数据的访问。该层由若干DAO接口和MyBatis映射文件组成。接口的名称统一以Dao结尾,且MyBatis的映射文件名称要与接口的名称相同。 四、业务逻辑层 业务...
一个典型的" " "'DAO实现有下列几个组件: " " " " "3 " " " "1 " " ". 一个DAO工厂类; " "4 " " " " " " "2 " "5 ". 一个DAO接口; " " " " " " " "6 "3 " " ". 一个实现DAO接口的具体类; " " " " " " " " "4 " ...
org.fkjava.ec.mapper|dao: 数据访问层 org.fkjava.ec.domain|dto|pojo|vo: 数据传输层 org.fkjava.ec.exception: 异常 org.fkjava.ec.common: 工具类 第四步:mybaits-config.xml 第五步:写domain(类型别名)...