会话获取
SqlSessionFactory
最佳的获取方式就是使用Mybatis提供的资源类加载配置文件
调用会话工厂建造者实例的建造方法注入读取流
要注意的是建造者生成了了实例就可以不需要了
这里我们可以使用null赋值,让指针解除引用,引导GC回收建造者实例
获取的SqlSessionFactory有且只需要一个且一直存在
那就是单例模式,保持在这个运行的范围内即可
在获取SqlSession,加入事务开关按钮
我们在环境标签配置的事务管理类型是JDBC,默认是开启的
在封装获取方法openSession时,可以注入布尔参数,
以灵活设置是否关闭事务
MybatisUtil调整后的写法:
public class MybatisUtil { private static org.apache.ibatis.session.SqlSessionFactory sqlSessionFactory; static { try{ // 核心配置文件名称 String config = "mybatis-config.xml"; // 读取核心配置 加载进内存为读取流对象 java.io.InputStream inputStream = org.apache.ibatis.io.Resources.getResourceAsStream(config); // 通过工场建造者获取了配置流对象,读取配置信息后,生成会话工厂实例 org.apache.ibatis.session.SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new org.apache.ibatis.session.SqlSessionFactoryBuilder(); sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream); // 销毁,让引用失去指向,引导GC回收 sqlSessionFactoryBuilder = null; } catch (Exception exception){ exception.printStackTrace(); } } // 获取会话实例即可 public static org.apache.ibatis.session.SqlSession getSqlSession(boolean closeTransaction){ return sqlSessionFactory.openSession(closeTransaction); } }
执行SQL时自行选择是否关闭事务
@Test public void quickstartMybatis(){ SqlSession sqlSession = MybatisUtil.getSqlSession(true); UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> userList = mapper.getUserList(); for (User user : userList) { System.out.println(user); } sqlSession.close(); }
配置 Configure
我们快速入门使用的是直接写在核心配置里的方式
官方讲Properties时
允许我们可以使用properties标签导入外部properties文件
注入环境的连接参数使用【${key}】读取
properties标签本身也能支持连接参数的配置
但是这和环境内配置有什么区别?
然后在优先级别中的位置是最低的,
如果外部配置文件读取错误,一样报错
总而言之:可以写,但是没必要
官方还推荐了一种默认占位符的方式配置,
就是说可以写个默认配置
但是者需要properties标签开启设置
<properties resource="org/mybatis/example/config.properties"> <!-- ... --> <property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/> <!-- 启用默认值特性 --> </properties>
在这里我注释了用户密码,然后在配置里使用默认占位符设置
运行还是一样可行的
OGNL 表达式的三元运算符
(如: ${tableName != null ? tableName : 'global_constants'})
需要设置特定的属性来修改分隔属性名和默认值的字符。例如:
<properties resource="org/mybatis/example/config.properties"> <!-- ... --> <property name="org.apache.ibatis.parsing.PropertyParser.default-value-separator" value="?:"/> <!-- 修改默认值的分隔符 --> </properties>
类型别名(typeAliases)
说明一下XML约束
如果不按照规定的顺序写配置标签,就会有这样的错误提示
这个提示已经说明了,各种配置标签的先后顺序
第一种别名:指定完整限定名,然后配置别名
不推荐使用这种,因为类数量太多,配置麻烦
第二种,限定所在包
该包下的类的别名即为小写,例如User -> user
每一个在包 domain.blog 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。
比如 domain.blog.Author 的别名为 author;
若有注解,则别名为其注解值。
映射器注册(mappers)
第一种,resource属性资源引用
要注意的是只能使用反斜杠作为分隔符,用点引用的路径会报错
好处是不用跟接口放在一起,随意使用
第二种通过接口完整限定名反射Mapper
必须和接口同一包下,且接口名和Mapper配置同名
第三种使用包扫描
这个问题和第二个一样,必须同包同名才有效
总而言之:
如果不希望Mapper配置和接口放在一起,
只能使用第一种资源引用方式,放在resoures的mapper中,或者自定义目录
第二种&第三种必须要同包同名