不少小伙伴不太理解核心dao,说这是干什么的,接下来我将一一为你们解答:html
1.说到核心dao不得不说到单表操做,单表操做顾名思义是对单张数据库表的CRUD操做,实际状况中咱们追求将表与表的关系映射到对象与对象的关系,例若有两张表分别是学生和老师表,java
咱们知道一个学生可能会有多个老师教学,那么一个老师也会教不少学生,这是一个多对多的关系,在数据库中表示:sql
student=(id,s_name,...);//学生表 teacher=(id,t_name,...);//老师表 student_teacher_rel=(s_id,t_id);//学生老师关系表
对于多对多关系的两张表须要有第三张表来维护关系,第三张表中字段分别是其余两张表的id数据库
public class Student{ private Integer id; private String s_name; ... private List<Teacher> teachers; getter和setter省略 } public class Teacher { private Integer id; private String t_name; ... private List<Student> students; getter和setter省略 }
2.为了表示一个学生有多名老师教学,一个老师给多名学生上课的这种多对多关系,咱们须要经过比较复杂的查询和几乎恶心的封装来表示对象之间的关系,尽管mybaits有配置能够表示这种关系,可是在更为复杂的对象关系中,你的配置就会极为复杂且容易出错在你不精通sql和mybatis的状况下,特别是不使用orm框架的时候,裸写jdbc会崩溃。mybatis
3.因此,能够将为每张表创建实体,包括关系表,将多表的查询拆成一个个单表查询,这样作虽然可能增长了数据库的压力(一条多表链接/子查询语句变成多条单表的简单查询),代码的行数上会增多,可是逻辑上会变得异常清晰,由于每张表对应一个类,每一个字段对应一个属性,因此能够为其高度封装。app
4.由于是单表操做,数据库表和java类,表字段和类属性真正意义上作到了一一对应,因此能够抽离出一个公共的泛型dao来为全部dao提供CRUD操做。框架
5.全部单表的CRUD操做能够描述为insert(T t)增长一条数据、delete(int id)删除一条数据、update(T t)修改一条数据、getOne(int id)得到一条数据、getOne(T t)得到多条数据,而后根据对象属性值制定动态sql,如案例一 https://www.cnblogs.com/xiaogblog/p/11052544.html 中SqlFactory,又如案例二 https://www.cnblogs.com/xiaogblog/p/11062916.html 中mapper.xml配置的动态sql语句。spa
6.若是表名=类名,列名=属性名,在经过必定规则将列类型转换成属性类型,则获取数据库链接后能够经过io操做直接生成Entity、Dao、DaoImpl等,并继承核心dao,那么项目一建立就直接写service和controller,是否是很嗨皮。code
7.mybatis中的generator就是经过这种思路来生成entity、mapper和mpaper.xml的。orm