1.集合的注入:
1.1如果有一个类,需要注入集合(测试是注入三种集合)
提供set,get方法;
Properties集合就相当于是一个Map集合
1.2集合注入
每种集合的注入方式在细节上不一样...
3. 测试
打印结果:
改进的集合注入方式:
2.自动装配的使用(配置文件方式开发是只做了解)
3.spring进一步整合mybatis实现数据查询
1. spring-configs.xml文件:
2. 对应的mapper:
3. 测试类:
4.SqlSessionTemplate(模板类)的使用 ----- 线程安全
SqlSessionTemplate的使用:
1,配置文件:
SqlSessionTemplate需要依赖SqlSessionFactory;
它是一个线程安全的类,
实现了SqlSession,其实本事就是用来获得跟数据库的连接,只是它是可以支持多个Dao接口的操作,线程安全,并且封装了数据库的操作,用起来更简便
SqlSessionTemplate没有无参的构造方法,而且没有ste方法,不能通过,但是它的创建需要SqlSessionFactory,所以只能是使用构造方法的方式来注入SqlSessionFactory.
2,SqlSessionTemplate类的简单使用:
注意之前,就要创建BlogMapper.xml文件.
这里面的namespace可以随便写,因为没有用到接口,而是直接通过SqlSessionTemplate这个类提供的一些方法,找到对应的xxxMapper的对应的id,去查询数据,没有用到接口.
通过SqlSessionTemplate的selectList()方法,里面的参数可以直接找到对应的mapper,前提是你把对应的mapper文件加入到spring容器中,因为spring整合mybatis,也需要对这个mapper文件操作,没加入spring的核心配置文件中,就相当于之前没有把对应的mapper文件加入mybatis的核心配置文件中,这样是不起作用的.
SqlSessionTemplate可以帮你关闭session.
看打印的结果:
在ctx.getBean(“”)时,里面的参数可以是SqlSessionTemplate,也可以是SqlSession,得到的bean对象都是SqlSessionTemplate,因为SqlSessionTemplate是实现了SqlSession这个接口的,所以这样写也不会错,(多态).
返回的类型都是SqlSessionTemplate,因为对应的id,spring的bean容器里创建的就是SqlSessionTemplate.
5.业务层与数据层实现分离,利用SqlSessionTemplate写自己的实现类
1,写BlogDao接口,以及实现了这个接口的实现类BlogDaoImpl;
BlogDaoImpl类里面需要提供SqlSessiontTemplate用来操作数据库,
sqlTemplate.selectList(“mapper.blog.findBlogs”),里面只要能找到这个mapper对应的id的sql语句就行,
没有一定要求,这个mapper的namespace必须是BlogDao的全路径名,
而如果使用哪种接口的方式来操作,session.getMapper(“BlogDao”),这种情况,就必须让mapper的namespce是BlogDao的全路径名,因为,这样无法指定mapper的路径.
2. 在spring容器中注册BlogDaoImpl,并且注入SqlSessionTemplate.
此时BlogDaoImpl里面就有了可以操作数据库的SqlSessionTemplate,并且有具体的实现方法,用来查询所有的Blog表中的数据.
这样在外面就只需要调用这个BlogDaoImpl的方法就可以了,这样就进一步封装了查询的方法,在最外层,只需要调用就可以.
3.测试:
像这种情况,mapper的namespace就必须跟BlogDao(对应接口)的全路径名一致
否则报这样的错:
所以namespace得与接口的全路径名一致
6.如何使用包扫描(不需要自己写Dao)mybatis.org/spring
1,添加依赖:注意mybatis是要添加3.4.0以上的版本
原因是:配置用来包扫描的类:MapperScannerConfigurer这个类是需要用到:SqlSessionTemplate;而只有mybatis3.4.0及以上版本是支持SqlSessionTemplate的.
2. 添加Spring的核心配置文件(spring-configs.xml)
>>2.1配置数据源:
2.1.1先写数据库连接的配置文件:
2.1.2写spring-configs.xml 核心配置文件
引入configs.properties文件
然后在配置数据库连接池:
可能出现的错误,在配置的时候,需要引入configs.properties文件,写数据库连接池的属性注入的时候,要小心点,否则可能会出错.
2.1.3 测试数据库连接池是否配置正确
可能会出的错:
这种情况出现,那么就去检查一下数据库连接池属性注入的时候,有没有出错
3. 配置SqlSessionFactory:
检测SqlSessionFactory有没有配置好:
4. 写Dao接口,
5. 写Mapper.xml文件
6. 将mapper文件配置在SqlSessionFactory中,
mapperLocations:SqlSessionFactory的属性
>>6.1可以将Mapper.xml文件统一配置在mybatis-configs.xml配置文件中.
这样也体现了一种分离,因为我们之前在单独做mybatis的时候,所有的xxxMapper.xml文件都是引入在mybatis核心配置文件--mybatis-configs.xml中
>>6.2将mybatis-configs.xml文件中所有的mapper引入到SqlSessionFactoryBean,需要这个对象去连接数据库.
看SqlSessionFactoryBean这个类的底层代码:
将所有的mapeer注入到SqlSessionFactoryBean中
7.配置DAO接口的包扫描
8.测试看看,使用包扫面,没有自己写实现类的方式能否实现功能
这样实现了没有自己写实现类,使用DAO包扫描的方法,实现了查询功能;
需要注意的点:
注意点1:
xxxMapper.xml文件中配置的mapper 的 namespace必须与对应的接口的全路径名一致,并且id也要与对应接口的抽象方法一致.并且必须要有返回值类型.
否则会报这样的错:
原因之前自己写实现类
如果是用SqlSessionTemplate的方法,方法里面的statement直接就去找到mapper的naspace和id,那么这样,xxxMapper.xml里面的naspace就无须跟接口的全路径名一致,id也无须跟接口的方法名字一致.因为SqlSessionTemplate可以根据你传递的参数去找.
7.如何配置多个数据源
8.个人理解MapperScannerConfigurer这个类:
这个类就是DAO包扫描的类.
分析:
之前我们没有用DAO包扫描这个类的话,我们需要自己写接口的实现类.
要在实现类中实现数据库的操作,我们在外界只需要调用这个实现类的方法就可以,(用实现类的接口指向实现类)
那么就需要在这个实现类中封装一个SqlSessionTemplate(当然也不一定要这个,SqlSession也可以),SqlSessionTemplate可以更加方便地操作数据库,提供了好多方法.
SqlSessionTemplate又需要SqlSessionFactory;
所以配置文件中的依赖关系有点复杂:
如果使用DAO包扫描的话,就不需要把依赖变得这么复杂.
看看使用了DAO包扫描的spring-configs.xml:
这样关系很简单,其实最主要的是DAO包扫描的这个类底层做了一系列操作(动态代理)
BeanDefinitionRegistryPostProcessor:
Bean对象定义注册邮递加工者
Recursively:递归地
MapperFactoryBean:数据映射器
理解:什么是映射器:比如你要去查找Blog表,那么你使用spring去整合mybatis的话,你得有一个映射器,去映射从数据库中查询到信息.就是BlogDaoImpl.这个实现类会利用SqlSession去找到对应的xxxMapper.xml文件去数据库中查询数据,并且将数据映射返回,想这个类就可以理解成为一个映射器,用来去映射从Blog表中查询到的数据.
如果你还想去查询Author表的话,你还需要AuthorMpper.xml,和另外一个配哈的映射器AuthorDaoImpl.
那么这个映射器也要在spring-configs.xml中注册,而且也需要将SqlSssionFactoryh或者SqlSessionTemplate注入这个映射器. SqlSessionTemplate就是一个封装了的SqlSession,它需要注入SqlSessionFactory.
如果每一个映射器都要去spring-configs.xml中注册注入的话,那么会很麻烦.
所以就出现了DAO包扫描.
这个DAO包扫描底层用了动态代理去创建对象,并且可以自动装配SqlSessionFactory或者SqlSessionTemplate.
但是如果使用了多个SqlSessionFactory的话,需要指定,否则会报错.
MapperScannerConfigurer是根据类型去注入SqlSessionFactory的,而不是根据set方法;
这个名字可以随便写,也不会报错,是根据类型自动装配的.
如果出现两个或以上的SqlSessionFactory的话:
报错:
无法自动装配,需要指定.
注意里面 不是ref, 而是value,如果是写成ref的话,会报错.
细节1:xxxMapper.xml文件引入spring的三种方式
方式一:通过SqlSessionFactoryBean提供的mapperLocation可以进行属性注入
这种通过list集合注入;
SqlSessionFactoryBean的注入xxxMapper.xml文件的属性需要是集合.所以可以通过集合的方式来注入给这个类
方式二:
写一个和写通配符的方式都可以.
这种方式没有用集合去注入,但是也是可以的.
方式三:通过原先单独用mybatis的方式引入xxxMapper.xml文件的方式
写mybatis-configs.xml;
配置mybatis.configs.xml
注入xxxMapper.xml文件
利用的是SqlSessionFactoryBean的configLocation属性