JDBC:此配置使用了JDBC的提交和回滚设置
MANAGE:让容器来管理整个事务的整个生命周期。
7.mapper元素
指定mybatis映射文件的位置,一般使用以下4种引入方式。
1.类路径 resource属性
2.本地文件 url属性
3.接口类 class属性
4.包名 name属性
[](()mybatis的默认别名
由于别名不区分大小写。所以不建议使用,容易出现重复定义的覆盖问题。
下面(左:别名,右:映射的类型)
_byte byte
_long long
_int int
_double double
[](()数据源类型
1.UNPOOLED
每次请求都会打开和关闭连接。它对没有性能要求的简单应用是一个好的选择。
2.POOLED
此数据源利用“池”的概率将JDBC连接对象组织起来,避免了在创建新的连接实例时所需的初始化和认证时间。可以使得并发web应用可以快速响应请求。是当前流形的处理方式。
3.JNDI
可以在EJB或应用服务器等容器中使用。容器可以集中在外部配置数据源,然后放置一个JNDI上下文引用。
[](()mapper映射文件主要元素
[](()1.select元素
[](()2.insert元素
其他元素和select差不多,多了以下几个元素
[](()3.update元素和delete元素
属性配置和select基本相同。
[](()4.sql元素
适用范围:当一个映射文件中需要定义很多sql语句。这些sql语句有些部分是相同的(比如id、user、job等字段)。可以通过把相同的部分抽离出来,然后在到相应的元素将其引用势必能够减少代码的臃肿。
sql元素里面适用include元素,基本元素(select、insert等)也可以使用include元素。可以通过${prefix}获取property元素中name=prefix的属性值。
如下:
id,user
// 未来简写。就不写一些属性值了
select
from customer
where id=#{id}
// 其中include元素中的refid属性引用了自定义的代码片段。refid属性值为自定义代码片段的id
[](()5.resultMap元素
resultMap:表示结果映射集。用于定义映射规则、级联更新、类型转换器。
[](()它有以下几个常用的子元素:
1.constructor元素:
用于配置构造方法
2.association元素和collection元素:
用于处理多表时的关联关系。(其中association一般用于处理一对一的关系,而collection用于处理一对多或多对多的关系)
3.discriminator元素:
处理一个单独的数据库查询返回很多不同类型结果集的情况。
4.id元素:标识哪个列是主键
5.result元素:标识java类属性和表字段的映射关系。
[](()resultMap常用的几个属性
1.type:标识要映射的java类
2.id:resultMap元素的唯一标识
[](()association元素
association常用的几个属性:
1.property:实体类对象属性与表字段一 一对应
2.column:指定表中对应的字段
3.javaType:指定映射到实体对象的属性类型
4.select:指定嵌入的子sql语句(用于关联映射中的嵌套查询)
5.fetchType:指定关联时是否启用延迟加载。有2个属性值:lazy(懒加载)、eager,具体解释如下图:
[](()一对一
因为这里是一对一:所以使用association元素就可以了。可以这样理解:
查询出business表后,将business中order的id赋值给下面字段为column的。最后通过下面的select语句映射的sql语句查出对应的order(当然现实生活中一般都是一对多,或多对多)
select* from business
where id=#{id}
[](()一对多
有2种方式:(推荐使用嵌套结果查询)
1.通过嵌套查询(简单来说,就是将前一个表的查询出来的外键传递给另外一个语句,最后返回查询结果)
2.另外一种是嵌套结果查询
具体如下:
1.嵌套查询
比如1个user有多个order
查询步骤:
查询该对应user(把business当左user就好了)的记录,然后将该user的id赋值给下面的column。然后select关联的sql再从order表中查询出所有user_id=user.id的订单,最后返回数据。注意:接收order表数据的属性是哟个List集合(因为可能有多条数据)
2.嵌套结果查询
注意点:collection中的字段名不能和resultMap中的一样,不然下面查询的结果会出错。
select b.*,o.id as order_id,o.number,o.username as order_username,o.order_name
from business b,order
o
where o.user_id=b.id
and b.id=#{id}
[](()多对多
思想:将多对多的两个表的主键都放到一个中间表中。当要进行多对多查询时,将会利用中间表寻找到对应的id,然后再寻找出另外一个表的id,就可以查出数据了。直接举个例子吧:
现在有3个表:order(订单)、order_user(中间表)、user(表)。我现在需要查询出user表中id=1的用户的订单有多少。
解决方案:
直接上sql语句
select
from order,order_user,user
where
user.id=#{id} 先获取要查询的id值 这里#不是注释!!
order_user.user_id=user.id #查询中间表中user_id等于user.id的有哪些数据,这时就可以得到order表的id值了
order.id=order_user.order_id #查询出order表中id等于oder_user中order_id的数据就可以查询关联的所有数据了
可参照如下代码:
注意点:collection中的字段名不能和resultMap中的一样,不然下面查询的结果会出错。
select b.* ,o.id as order_id,o.number,o.username oder_username,o.order_name
from order
o,business b,t_order_business t
where b.id=#{id}
and t.business_id=b.id
and o.id=t.order_id
[](()spring整合mybatis
!!! 推荐MapperScanerConfigurer整合方式
需要相关的几个包:
…(还有其他的一些包)
org.mybatis
mybatis-spring
2.0.3
org.mybatis
mybatis
3.5.6
spring整合mybatis (标注为sm)与原生的mybatis(m)区别主要在于:
1.sm是以bean的方式来进行整合的(将mybatis的全局配置文件放入其中,总而言之:就是整个都加载到bean这个配置文件中)。而m主要是通过全局配置文件来进行加载的。
2.元素的m需要自己配置数据操作对象SqlSession,而sm相对来说简化了这一步操作。(通过bean,向接口的实现类注入SqlSessionFactory,从而得到SqlSession,进而操作数据库)
[](()spring整合mybatis的几种方式
下面来具体说一下这几种整合的方式
[](()1.传统Dao方式整合
注意点:
1.接口的方法名需要和mapper文件中对于sql语句的id一样。
2.mapper中的namespace空间的值必须为接口的全路径。
3.需要接口和实现类(通过将SqlSession对象注入到接口的实现类中从而获取操作对象)
<?xml version="1.0" encoding="UTF-8"?><beans xmlns=“http://www.springframework.org/schema/beans”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xmlns:context=“http://www.springframework.org/schema/context”
xmlns:aop=“http://www.springframework.org/schema/aop”
xmlns:tx=“http://www.springframework.org/schema/tx”
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
读取外在的数据库连接属性
<context:property-placeholder location=“classpath:db.properties” />
读取外在的数据库连接属性
<tx:annotation-driven transaction-manager=“transactionManager”/>
[](()2.Mapper接口整合
----Mapper接口整合 又分为MapperFactoryBean的整合和MapperScanerConfigurer的整合
其中MapperScanerConfigurer的整合更加简单。MapperFactoryBean的整合对于严格性比较高(容易出错)