MyBatis提供了SqlSession对象
普通方式
dao普通类中一个普通方法---->Mapper文件(SQL)
通过SqlSession对象执行
dao方法中的参数通常不是自己的 (上一个层次传递过来的)
dao方法中的执行过程不用自己写 而需要一个SqlSession执行
基于Mapper(代理对象)的执行方式
这个过程中发现Dao层次不做实质的事情
层次是否可以省略???---->不好 保留这个层次
给Dao配一个小弟 去完成原来Dao该做的事情(找SqlSession干活)
(你们)Service业务层
负责处理逻辑 判断 比较
(我)Dao持久层----------(看代码就感觉是一个传话的人)
我的小弟会自动的去做我之前的事情
负责读写数据库
(艾薇)读写数据库需要SqlSession对象
数据库
Service--->Dao(保留 不做事 抽象)--->Dao的小弟(Mapper代理)-->找寻SqlSession做事
=========================================================================
如果想要基于Mapper的方式执行
1.Dao层次保留 Dao中的方法结构 参数 返回值 均不动
只是将原有的具体方法变成抽象方法 Dao具体类变成接口
2.在Service层中获取Dao的方式发生改变
StudentDao dao = new StudentDao();
dao执行的过程 调用SqlSession做事("sqlid",参数);
StudentDao dao = sqlSession.getMapper(StudentDao.class);
dao的代理 执行过程???
dao的代理 需要调用SqlSession做事("sqlid",参数);
代理可以找到参数 代理相当于是原来Dao的子类 可能会有方法重写。。。
代理如何找到sql的呢?----映射文件名字的规则
namespace dao的类全名一致
标签中的id dao的方法名字一致
public class StudentService {
private StudentDao dao = MyUtil.getSqlSession(true).getMapper(StudentDao.class);
public void insertStudent(Student student){
dao.insert(student);
}
public void deleteStudent(Integer sid){
dao.delete(sid);
}
public void updateStudent(Student student){
dao.update(student);
}
public Student selectStudent(Integer sid){
return dao.selectOne(sid);
}
}
public interface StudentDao {
public void insert(Student student);
public void delete(Integer sid);
public void update(Student student);
public Student selectOne(Integer sid);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.StudentDao">
<insert id="insert">
insert into student values(#{sid},#{sname},#{ssex},#{sage});
</insert>
<delete id="delete">
delete from student where sid = #{sid}
</delete>
<update id="update">
update student set sname = #{sname},ssex = #{ssex},sage = #{sage} where sid = #{sid}
</update>
<select id="selectOne" resultType="domain.Student">
select * from student where sid = #{sid}
</select>
</mapper>