目录
传统的Dao方式
StudentDao接口如下
package org.example.dao;
import org.example.domain.Student;
import java.util.List;
public interface StudentDao {
public List<Student> selectStudents();
}
sql映射文件如下
<?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="org.example.dao.StudentDao">
<select id="selectStudents" resultType="org.example.domain.Student">
<!--要执行的 sql 语句-->
select * from t_student order by id
</select>
</mapper>
Student类信息如下
package org.example.domain;
public class Student {
// 根据数据库定义属性
private Integer id;
private String name;
private String email;
private Integer age;
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", email='" + email + '\'' +
", age=" + age +
'}';
}
}
配置文件信息如下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="mydb">
<environment id="mydb">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--数据库的驱动类名-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!--连接数据库的url字符串-->
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<!--访问数据库的用户名-->
<property name="username" value="root"/>
<!--密码-->
<property name="password" value="991025"/>
</dataSource>
</environment>
</environments>
<!-- sql mapper(sql映射文件)的位置-->
<mappers>
<mapper resource="org\example\dao\StudentDao.xml"/>
</mappers>
</configuration>
StudentDao的接口实现类信息如下
package org.example.dao.impl;
import org.apache.ibatis.session.SqlSession;
import org.example.Utils.MyBatisUtils;
import org.example.dao.StudentDao;
import org.example.domain.Student;
import java.util.List;
public class StudentDaoImpl implements StudentDao {
@Override
public List<Student> selectStudents() {
// 获取SQLSession对象
SqlSession sqlSession = MyBatisUtils.getSqlSession();
String sqlId = "org.example.dao.StudentDao.selectStudents";
// 执行sql语句, 使用sqlSession对象
List<Student> students = sqlSession.selectList(sqlId);
// 关闭
sqlSession.close();
return students;
}
}
单元测试代码
package org.example;
import org.example.dao.StudentDao;
import org.example.dao.impl.StudentDaoImpl;
import org.example.domain.Student;
import org.junit.Test;
import java.util.List;
public class MyTest {
@Test
public void testSelectStudents() {
StudentDao studentDao = new StudentDaoImpl();
List<Student> students = studentDao.selectStudents();
for (Student student : students) {
System.out.println(student);
}
}
}
分析上面代码
sql映射文件的命名空间是对应的Dao类的全限定名org.example.dao.StudentDao
而sql语句标签的id是对应的方法名selectStudents
观察上面语句, studentDao对象类的权限定名为org.example.dao.StudentDao
通过这个对象调用的是selectStudents方法, 知道了这两个信息
我们就知道了sql语句的id, 即为org.example.dao.StudentDao.selectStudents
而找到了sql语句标签, 我们就可以知道SqlSession调用的是哪个方法
也就是说在知道了Dao类和对应的方法
例如:studentDao.selectStudents()
SqlSession对象对应的方法和sql语句以及返回值就可以固定下来
例如:
String sqlId = "org.example.dao.StudentDao.selectStudents";
// 执行sql语句, 使用sqlSession对象
List<Student> students = sqlSession.selectList(sqlId);
由于这种固定的关系, 我们就可以不用程序员处理, 而交给框架处理
MyBatis的动态代理
MyBatis根据dao的方法调用来获取执行sql语句的信息
MyBatis根据你的dao接口, 创建出一个dao接口的实现类, 并且创建这个类的对象
完成sqlSession调用方法, 访问数据库
也就是说, Dao接口的实现类现在由MyBatis框架完成了, 大大简化了程序员的工作
我们可以将上面的程序改写:
使用MyBatis动态代理的机制, 使用SqlSession.getMapper(dao接口)
getMapper能获得dao接口对应的实现类对象
将StudentDao的接口实现类删掉
测试类改写为:
package org.example;
import org.apache.ibatis.session.SqlSession;
import org.example.Utils.MyBatisUtils;
import org.example.dao.StudentDao;
import org.example.domain.Student;
import org.junit.Test;
import java.util.List;
public class MyTest {
@Test
public void testSelectStudents() {
/*
使用MyBatis动态代理的机制(JDK的动态代理), 使用SqlSession.getMapper(dao接口)
getMapper能获得dao接口对应的实现类对象
*/
SqlSession sqlSession = MyBatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
// 调用dao的方法, 执行数据库操作
List<Student> students = dao.selectStudents();
for (Student student : students) {
System.out.println(student);
}
}
}