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的实现方式是一样的。