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版权协议,转载请附上原文出处链接和本声明。