一、mybatis使用传统dao开发方式
1、项目结构
MybatisUtils是封装好的mybatis工具类,Students是需要查询结果的返回属性类
2、StudentDao接口和StudentDao.xml
dao目录下存在StudentDao接口和StudentDao.xml配置文件,StudentDao.xml实际上就是mapper文件,他们两个要满足以下条件
- StudentDao.xml中的namespace属性值为StudentDao接口全限定名称
- StudentDao.xml中的sql语句标签的id属性值为StudentDao接口对应方法的名称
3、具体代码如下
StudentDao接口
package org.example.dao;
import org.example.demain.Student;
public interface StudentDao {
Student selectStudentById(Integer id);
}
StudentDao.xml
<?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="selectStudentById" resultType="org.example.demain.Student">
select id,name,email,age from student where id=#{id}
</select>
</mapper>
MybatisUtils类
package org.example.Utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class MybatisUtils {
private static SqlSessionFactory factory=null;
static {
try {
String config="mybatis.xml";
InputStream inputStream= Resources.getResourceAsStream(config) ;
factory=new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
SqlSession sqlSession=null;
if (factory!=null){
sqlSession=factory.openSession();
}
return sqlSession;
}
}
Student类
package org.example.demain;
public class Student {
private Integer id;
private String name;
private String email;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "学生信息{" +
"id=" + id +
", name='" + name + '\'' +
", email='" + email + '\'' +
", age=" + age +
'}';
}
}
4、创建dao的实现类
我们需要在dao包下新建一个StudentDaoImpl类,用来实现StudentDao接口
package org.example.dao;
import org.apache.ibatis.session.SqlSession;
import org.example.Utils.MybatisUtils;
import org.example.demain.Student;
public class StudentDaoImpl implements StudentDao{
@Override
public Student selectStudentById(Integer id) {
SqlSession session= MybatisUtils.getSqlSession();
String idsql="org.example.dao.StudentDao.selectStudentById";
Student stu=session.selectOne(idsql,id);
session.close();
return stu;
}
}
这样就完成了对mybatis使用传统dao开发方式的实现
5、测试
测试类代码如下
package org.example;
import org.example.dao.StudentDao;
import org.example.dao.StudentDaoImpl;
import org.example.demain.Student;
import org.junit.Test;
public class MyTest {
@Test
public void Testone(){
StudentDao stu=new StudentDaoImpl();
Student student=stu.selectStudentById(1001);
System.out.println(student);
}
}
运行结果如下
二、mybatis框架dao代理开发
- mybatis框架发现使用dao的方法调用能确定执行sql语句的必要信息,于是mybatis对象简化了dao对象的实现,由mybatis框架在程序执行期间,根据你的dao接口,在内存中创建一个dao接口的实现类对象,mybatis把这个技术叫做动态代理技术
- 动态代理技术需要满足如下两点
- StudentDao.xml中的namespace属性值为StudentDao接口全限定名称
- StudentDao.xml中的sql语句标签的id属性值为StudentDao接口对应方法的名称
具体实现方法如下
1、删除StudentDaoImpl类和测试类里的代码,项目结构如下
2、使用getMapper()获取dao
测试类代码如下
package org.example;
import org.apache.ibatis.session.SqlSession;
import org.example.Utils.MybatisUtils;
import org.example.dao.StudentDao;
import org.example.demain.Student;
import org.junit.Test;
public class MyTest {
@Test
public void testtwo(){
// 首先获取SqlSession对象
SqlSession session= MybatisUtils.getSqlSession();
// 利用getMapper获取mybatis在内存中创建的StudentDao接口的实现类
StudentDao stu=session.getMapper(StudentDao.class);
// 调用实现类方法获取查询的返回对象
Student student=stu.selectStudentById(1002);
// 输出返回对象
System.out.println(student);
// 释放资源
session.close();
}
}