java程序员菜鸟入门之二十一mybatis

一、概述

1、mybatis介绍:MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。

2、mybatis架构:

           java程序员菜鸟入门之二十一mybatis_第1张图片

   文字描述mybatis的原理:

             1、mybatis配置
                     SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
                     mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
             2、通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
             3、由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
             4、mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
            5、Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
         6、Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
         7、Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。

二、原始dao的开发(SqlSession中封装了对数据的操作)

1、SqlSessionFactoryBuilder:SqlSessionFactoryBuilder用于创建SqlSessionFacoty,SqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了,因为SqlSession是通过SqlSessionFactory创建的。所以可以将SqlSessionFactoryBuilder当成一个工具类使用,最佳使用范围是方法范围即方法体内局部变量。

2、SqlSessionFactory:SqlSessionFactory是一个接口,接口中定义了openSession的不同重载方法,SqlSessionFactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理SqlSessionFactory。

3、SqlSession:SqlSession是一个面向用户的接口,sqlSession中定义了数据库操作方法。每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能共享使用,它也是线程不安全的。因此最佳的范围是请求或方法范围。绝对不能将SqlSession实例的引用放在一个类的静态字段或实例字段中。打开一个 SqlSession;使用完毕就要关闭它。通常把这个关闭操作放到 finally 块中以确保每次都能执行关闭。

public class UserDaoImpl implements UserDao {
	private SqlSessionFactory sqlSessionFactory;

	public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
		super();
		this.sqlSessionFactory = sqlSessionFactory;
	}
	@Override
	public User queryUserById(int id) {
		// 创建SqlSession
		SqlSession sqlSession = this.sqlSessionFactory.openSession();
		// 执行查询逻辑
		User user = sqlSession.selectOne("queryUserById", id);
		// 释放资源
		sqlSession.close();

		return user;
	}
}

三、mapper.xml文件

1、mapper文件的Dao接口映射与pojo类的映射(Property:表示person类的属性;Column:表示sql查询出来的字段名;Column和property放在一块儿表示将sql查询出来的字段映射到指定的pojo类属性上。)

2、标签:ID,type(字段的类型)、与数据库的对应关系

3、parameterType与parameterMap的区别,resultType与resultMap的区别

                    parameterType:传递简单类型、传递pojo对象、传递pojo包装对象

                    resultType:输出简单类型、输出pojo对象、输出pojo列表

                    resultMap:需要定义resultMap,把orderResultMap将sql查询列字段和Order类属性字段对应起来

4、动态sql:

              If标签 : 判断标签

             Where标签:

             动态sql:提取重复sql

            foreach标签:遍历

四、mapper接口动态代理开发dao

1、概述:Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。

2、Mapper接口开发需要遵循以下规范:

                  Mapper.xml文件中的namespace与mapper接口的类路径相同。
                  Mapper接口方法名和Mapper.xml中定义的每个statement的id相同 
                  Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
                  Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

五、多表关联查询

1、一对一查询:使用resultType:改造pojo类

                          使用resultMap:在mapper.xml中配置属性 

2、一对多查询:在实体类pojo代码中修改pojo类,然后在mapper.xml代码中添加一对多的对应关系

六、mybatis与spring的整合

整合思路:1、SqlSessionFactory对象应该放到spring容器中作为单例存在。
                 2、传统dao的开发方式中,应该从spring容器中获得sqlsession对象。
                 3、Mapper代理形式中,应该从spring容器中直接获得mapper的代理对象。
                 4、数据库的连接以及数据库连接池事务管理都交给spring容器来完成。

你可能感兴趣的:(java)