在前面的例子中自定义Dao接口实现类时发现了一个问题。Dao的实现类其实并没有干什么实质性的工作。它仅仅是通过SqlSession的相关API定位到映射文件mapper中相应id的SQL语句,真正对db的操作其实是由框架通过mapper中的SQL完成的。
所以现在Mybatis框架就抛弃了Dao的实现类。直接定位到映射文件的mapper中的id对应的SQL语句中。对db进行操作。这种对Dao的实现方式称为Mapper的动态代理方式…
Mapper 动态代理的方式无需程序开发人员实现Dao接口。接口是由Mybatis结合映射文件自动生成的动态代理实现的。 具体的操作步骤如下:
1.java类
package com.evecom.common;
import java.util.List;
import java.util.Map;
public interface IStudentDao {
/**
* 通过学生id查找相应学生信息
* @param id 学生id
* @return 学习实体
*/
Student selectStudentById(int id);
/***
* 插入学生数据
* @param student 学生实体
* 方法名对应代理文件中的id
*/
void insertStudent(Student student);
/***
* 通过map 封装多个查询条件
* @param map map
* @return 实体数组.....
*/
}
2.mapper文件
<!-- 通过接口名可定位到映射文件mapper -->
<mapper namespace="com.evecom.common.IStudentDao">
<select id="selectStudentById" parameterType="int" resultType="Student">
<!-- resultType 表示想要Mybatis封装成的java类..这里我在配置文件中使用了别名。 -->
select id,name,score,hobby from student where id = #{id}
</select>
<insert id="insertStudent"> <!-- 此处的id对应Dao中的方法名 -->
insert into student(id,name,score,hobby)
values(#{id},#{name},#{score},#{hobby})
</insert>
</mapper>
3.调用..
public class MybatisTest {
private IStudentDao dao;
private SqlSession session;
Logger log = Logger.getLogger(log4jDemo.class);
@Before
public void setup() {
session = MyBatisUtil.getSqlSession();
dao = session.getMapper(IStudentDao.class);
}
@After
public void tearDown() {
if (session != null) {
session.close();
}
}
@Test
public void test01() {
// Student student = dao.selectStudentById(3);
Student student = new Student(10, "张三", 88, "卡看书");
//
dao.insertStudent(student);
session.commit(); // 不能忘记了提交会话...
// System.out.println(student);
}
}
除了查询不要提交会话外,其他会对数据库数据产生影响的。都应该要提交会话。因为Mybatis将自动提交默认给关闭了。。。
还有别名的设置是在config文件中
设置的 要对应编译器提示的顺序
<!-- 设置别名 -->
<typeAliases>
<typeAlias type="com.evecom.common.Student" alias="Student" />
</typeAliases>
综上。就是Mapper动态代理的基本使用过程。。