Mybatis学习三

2020/04/17
在mapper中,如果一个<select>中并没有配置参数属性但还是要传入参数,则可以使用Map<String,Object>类型作为参数传入,但是此时在接口代理类中对应的抽象方法中也要加上Map<String,Oject>参数
如下:
//Mapper的一个方法
<select id="selectUserById" resultType="com.mybatis.po.MyUser">
    select * from user
    where uid=#{u_id}
</select>
//对应的接口代理类对应的方法
public MyUser selectUserById(Map<String,Object>prarm);

此时便可以传入参数执行。但是传入的参数有限制,如上面Mapper语句中的 u_id 就是传入的map的一个键名,这也是这种传参方式的特点。

同时,与该种方式对应的还有通过javaBean来传参,两者不同在于:前者无法指定参数类型,后者则可以。
后者这种方式具体步骤如下:
①首先需要创建一个class,如SelectUserParam类,如下:
public class SelectUserParam{
    private String u_name;
    private String u_sex;、
    private long u_id;
    // 此处省略setter和getter方法   但必须要
}
②Mapper中的方法定义与前者方法一致,不需变动。
③mapper方法对应的接口代理方法改为:
public MyUser selectUserById(SelectUserParam param);
此时,上面的mapper语句中的u_id就是selectUserParam的一个属性

可以看出,前者比较适合参数少、参数类型一致(不需要特别指定参数类型)的方式,而后者则适合参数多、参数类型可以指定的形式。

---------------------------------------------------

configuration文件中创建的标签是有顺序规定的~!!!!!!!!!!!!!
mybatis配置文件中标签顺序必须为:
properties
settings
typeAliases
typeHandlers
objectFactory
objectWrapperFactory
reflectorFactory
plugins
environments
databaseIdProvider
mappers


-------------------------------------
对于数据库的配置
在Mybatis-config文件中,存在一种<transactionManager>标签,在学习完后感觉其和<mapper>标签实质上是一样的,都是通过工厂模式定义的,只是在<mapper>标签下的工厂是显性的,而<transactionManager>标签下工厂则是隐性的。
在该标签下,主要使用一个type属性,该属性则对应相应的事务工厂。在Mybatis中以及定义好了两种事务工厂:JDBC和Managed。两种都是连接数据库的事务工厂(内部的具体事务实现包括了数据库连接,commit,以及close等方法)。两者差别就在于前者以 JDBC 的方式对数据库的提交和回滚进行操作,而后者的提交和回滚方法不用任何操作,而是把事务交给容器处理。在默认情况下,它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。

如果想要自定义一个事务工厂,首先要实现transactionFactory接口,如定义一个实现该接口的MyTransactionFactory类。同时,一个工厂中有许多工作的机器,事务工厂中也不例外。在实现具体的事务时,则可以自定义一个事务MyTransaction。这个MyTransaction事务可以继承JDBCTransaction,也可以继承ManagedTarnsaction,差别见上。同时还要实现Transaction接口。至此,一个自定义的事务工厂的创建才算结束。
同时,从对自定义事务工厂的测试中可以看出,其实现形式与ObjectFactory的实现方式是一样的。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值