Mybatis框架----->(3) Mybatis对象分析、传统Dao开发与动态代理Dao开发的比较

一、Mybatis对象分析

1、几个常用类
(1)Resources类
  • 负责读取主配置文件
InputStream in = Resources.getResourceAsStream("mybatis.xml");
(2)SqlSessionFactoryBuilder类
  • 利用build( ) 方法创建SqlSessionFactory对象,一般会将该 SqlSessionFactoryBuilder 对象创建为一个方法内的局部对象,方法结束,对象销毁。
//3.创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder  = new SqlSessionFactoryBuilder();
//4.创建SqlSessionFactory对象
SqlSessionFactory factory = builder.build(in);
(3)SqlSessionFactory接口
  • 创建 SqlSession 需要使用 SqlSessionFactory 接口的 openSession() 方法。
SqlSession sqlSession = factory.openSession();
  • openSession(true):创建一个有自动提交功能的 SqlSession
  • openSession(false):创建一个非自动提交功能的 SqlSession,需手动提交
  • openSession():同 openSession(false)
(4)SqlSession接口
  • 定义了操作数据的方法 例如 selectOne() ,selectList() ,insert(),update(), delete(), commit(), rollback()

SqlSession对象不是线程安全的,需要在方法内部使用,在执行SQL语句之前,使用openSession()获取SqlSession对象。在执行SQL语句后需要调用其close()方法,这样才能保证他使用是线程安全的。

2、工具类(MyBatisUtil类)
public class MyBatisUtil {

    private static SqlSessionFactory factory = null;
    static {
        try {
            String config="mybatis.xml";
            //读取配置文件
            InputStream in = Resources.getResourceAsStream(config);
            //创建SqlSessionFactory对象
            factory = new SqlSessionFactoryBuilder().build(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取SqlSession对象
     */
    public static SqlSession getSqlSession(){
        SqlSession sqlSession = null;
        if (factory != null){
            sqlSession = factory.openSession();
        }
        return sqlSession;
    }
}

二、MyBatis的传统Dao开发与动态代理Dao开发

1、传统Dao开发
  • 主要使用Dao接口的实现类来操作数据库
(1)创建Dao接口的实现类
public class StudentDaoImp implements StudentDao
(2)实现接口中的方法
**
 * 查询
 * @return
 */
@Override
public List<Student> selectStudens() {
    //获取SqlSession对象
    SqlSession sqlSession = MyBatisUtil.getSqlSession();

    //6.【重要】指定要执行的SQL语句的标识,sql映射文件中的namespace+"."+标签的id值
    String sqlId = "com.hcz.dao.StudentDao"+"."+"selectStudens";
    //7.【重要】执行SQL语句,通过sqlId找到语句
    List<Student> studentList = sqlSession.selectList(sqlId);
    //9.关闭连接
    sqlSession.close();
    return studentList;
}

/**
 * 插入
 * @param student
 * @return
 */
@Override
public int insertStudent(Student student) {
    //获取SqlSession对象
    SqlSession sqlSession = MyBatisUtil.getSqlSession();
    String sqlId="com.hcz.dao.StudentDao"+"."+"insertStudent";
    //执行sql语句, 使用SqlSession类的方法
    int nums = sqlSession.insert(sqlId,student);
    //提交事务
    sqlSession.commit();
    //关闭
    sqlSession.close();
    return nums;
}
(3)定义测试方法
@Test
public void testSelectStudents(){
    StudentDao dao = new StudentDaoImp();
    List<Student> studentList = dao.selectStudens();
    for (Student student:studentList){
        System.out.println(student);
    }
}

@Test
public void testInsertStudent(){
    StudentDao dao = new StudentDaoImp();
     Student student = new Student();
     student.setId(1006);
     student.setName("李刚");
     student.setEmail("435243@qq.com");
     student.setAge(26);
    int result = dao.insertStudent(student);
    System.out.println("添加对象的数据为:"+result);
}

分析:

StudentDao dao = new StudentDaoImp();
List<Student> studentList = dao.selectStudens();

1、dao对象,类型是StudentDao,全限定名称是:com.hcz.dao.StudentDao与映射文件的namespace是一样的
2、dao调用的selectStudents() 方法与映射文件中的id值是一样的
3、通过dao中方法的返回值也可以确定Mybatis要调用的SqlSession的方法:
(1)如果返回值是List,调用的是SqlSession.selectList()方法
(2)如果返回值 int ,或是非List的, 看mapper文件中的标签是insert,update就会调用SqlSession的insert, update等方法

总结:

Dao类其实并没有实质性的工作,它仅仅是通过SqlSession的相关接口方法定位到映射文件中相应id的SQL语句,所以对数据库真正操作的是其实是由框架通过映射文件中的Sql语句完成的。

2、动态代理Dao开发
  • 动态代理方式(jdk动态代理机制):

MyBatis框架抛开了Dao的实现类,根据你的dao接口,创建出一个dao接口的实现类,并创建这个类的对象,完成调用dao接口中的方法,然后直接定位到映射文件中的相应的SQL语句进行数据库操作

(1)通过SqlSesssion.getMapper(dao接口)获取dao接口对应的实现类
StudentDao dao = MyBatisUtil.getSqlSession().getMapper(StudentDao.class); 
(2)通过获取到的dao接口实现类来调用接口中对应的方法执行映射文件中的SQL语句
List<Student> studentList = dao.selectStudens();

三、思维大纲

在这里插入图片描述

若有不足请大家指正哈!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@烟雨倾城ゝ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值