openSession()方法参数、Mybatis存储过程、类型处理器、多数据库环境配置

1、openSession方法参数

可以看官方文档https://mybatis.org/mybatis-3/zh/java-api.html#sqlSessions
在这里插入图片描述

  	1、事务处理:
  			你希望在 session 作用域中使用事务作用域,还是使用自动提交(auto-commit)?
  				当boolean默认为false
  							   false事务处理方式,关闭自动提交
  							  ⭐ true,主动提交,在增删改的时候不要在commit

  	2、 数据库连接:
  			你希望 MyBatis 帮你从已配置的数据源获取连接,还是使用自己提供的连接?
  				当不传入Connection是默认使用配置的链接
  				当传入Connection使用传入的链接,进行链接数据库

  	3、语句执行:
  			你希望MyBatis 复用 PreparedStatement 和/或批量更新语句(包括插入语句和删除语句)?
  				当什么都不传入时默认使用:预处理语句不会被复用,也不会批量处理更新默认使用ExecutorType.SIMPLE。
  				ExecutorType可传入的参数有:
  					ExecutorType.SIMPLE:该类型的执行器没有特别的行为。它为每个语句的执行创建一个新的预处理语句。
  					ExecutorType.REUSE:该类型的执行器会复用预处理语句。
  					⭐ExecutorType.BATCH:该类型的执行器会批量执行所有更新语句


2、 Mybatis存储过程

1、怎么用??

存储过程在mybatis中在怎么使用??

   1、使用select标签调用存储过程

   2、该标签的statementType属性为CALLABLE

   3、使用  {call 存储过程名称(
  				#{参数, mode=参数类型,jdbcType=数据库的类型}
  			)}
  	
  		参数类型:out、in、InOut
  		jdbcType:可以查看JdbcType枚举类
  		javaType=ResultSet  可以指定输出的类型为一张表
  		resultMap指定映射要什么类型中
  	   (参数、参数类型、jdbcType必写)

2、案例

案例一:

//1、创建存储过程
create procedure findByIdTOW(in  Inid integer,OUT  Outsex varchar(1))
begin
    declare cursor_name cursor for select sex from user where id = Inid;
    open cursor_name;
    fetch cursor_name into Outsex;
    close cursor_name;
end;
//2、创建接口
 void collFindById(@Param("id") int id,@Param("sex") String sex);
//3、映射文件
  <select id="collFindById" statementType="CALLABLE" >
        {call findByIdTOW(
            #{id,mode=IN,jdbcType=INTEGER},
            #{sex,mode=OUT,jdbcType=VARCHAR}
            )}
    </select>
//4、调用
	public void test8() throws Exception {
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("Config.xml"));
		SqlSession sqlSession = sqlSessionFactory.openSession();
		UserMapper mapper = sqlSession.getMapper(UserMapper.class);
		String sex = "";
		mapper.collFindById(42,sex);
		System.out.println(sex);
	}

案例二:



3、类型处理器

1、是什么??

1、明确的一点就是java作为一门编程语言有自己的数据类型,数据库也是有自己的数据类型的。

   数据库中的类型:JdbcType 此枚举就是所有的数据库支持类型

   java数据类型:int、long、string、…

2、现在的问题是:怎么把数据库的类型和Java的类型匹配??

    mybatis帮我们定义了一系列的类型处理器解决

	xxxTypeHandler就是mybatis帮我们定义好的类型处理器

3、类型处理器的作用就是:

  	把数据库类型数据和java类型数据进行相互匹配

⭐4、我们也可以自定义类型处理器来指定类型的匹配

  	步骤:
  		1、创建类型处理器:实现TypeHandler接口  或者  继承BaseTypeHandler
  				要实现的方法:
  						setParameter 定义数据如何保存到数据库中
  						getResult获取值的时候怎么处理

  		2、在主配置文件中配置
  				    <typeHandlers>
  							<typeHandler handler="类型处理器 " javaType="处理的Java类型"/>
  					</typeHandlers>

2、案例

自定义枚举类型处理器:

//定义的枚举类型
public enum MyStatus {
	LOGIN(100,"用户登入"),LOGOUT(200,"用户退出"),REMOVE(300,"用户不存在");
	private Integer code;
	private  String msg;
	//get、set、构造。。。。
	public static MyStatus getMyStatusByCode(Integer code){
		switch (code) {

			case 200:
				return LOGOUT;
			case 300:
				return REMOVE;
			default :
				return  LOGIN;
		}
	}
}

//自定义处理器
public class MyEnumMyStatusTypeHandler  implements TypeHandler<MyStatus> {
	//定义数据如何保存到数据库中
	public void setParameter(PreparedStatement preparedStatement, int i, MyStatus myStatus, JdbcType jdbcType) throws SQLException {
		preparedStatement.setString(i,myStatus.getCode().toString());
	}
	//获取值的时候怎么处理
	public MyStatus getResult(ResultSet resultSet, String s) throws SQLException {
		Integer code = resultSet.getInt(s);
		MyStatus myStatusByCode = MyStatus.getMyStatusByCode(code);
		return myStatusByCode;
	}
	//获取值的时候怎么处理
	public MyStatus getResult(ResultSet resultSet, int i) throws SQLException {
		Integer code = resultSet.getInt(i);
		return MyStatus.getMyStatusByCode(code);
	}
	//获取值的时候怎么处理
	public MyStatus getResult(CallableStatement callableStatement, int i) throws SQLException {
		Integer code = callableStatement.getInt(i);
		return MyStatus.getMyStatusByCode(code);
	}
}
//配置处理器
    <typeHandlers>
        <typeHandler handler="com.zy.util.MyEnumMyStatusTypeHandler" javaType="com.zy.Bean.MyStatus"/>
    </typeHandlers>


4、多数据库环境配置

怎么实现或环境切换??

  1、❤配置好多个数据库,选用指定使用的数据库

  2、可以通过<databaseIdProvider>标签给数据库支持类起别名

  3、在对应的crud的mapper标签上,使用databaseId指定起的别名
  (如果一个接口方法对应好几个数据库的映射实现,切换数据库,使用databaseId指定的映射实现mapper	)

具体代码:

  在配置数据库链接信息的时候:

  	<environments default="要使用的数据库id">

  		配置第一个数据库链接信息
  		<environment id="mysql">
  			  事务的处理
       		 <transactionManager type="JDBC"/>
       		  链接的参数
       		 <dataSource type="POOLED"> </dataSource>
    	</environment>
    	
    	配置第二个数据库链接信息
    	<environment id="oracle">
    	..........
    	</environment>
    
    </environments>

版权声明:本文为weixin_44051048原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。