
4.Mybatis配置⽂件深⼊
发布日期:2021-05-08 11:38:56
浏览次数:24
分类:精选文章
本文共 5329 字,大约阅读时间需要 17 分钟。
4.1 核⼼配置⽂件SqlMapConfig.xml
4.1.1 MyBatis 核⼼配置⽂件层级关系

4.2 MyBatis 常⽤配置解析
1)environments 标签
数据库环境的配置,⽀持多环境配置

其中,事务管理器( transactionManager )类型有两种:
•JDBC :这个配置就是直接使⽤了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作
⽤域。
•MANAGED :这个配置⼏乎没做什么。它从来不提交或回滚⼀个连接,⽽是让容器来管理事务的整个⽣
命周期(⽐如 JEE 应⽤服务器的上下⽂)。 默认情况下它会关闭连接,然⽽⼀些容器并不希望这样,因
此需要将 closeConnection 属性设置为 false 来阻⽌它默认的关闭⾏为。
其中,数据源( dataSource )类型有三种:
•UNPOOLED :这个数据源的实现只是每次被请求时打开和关闭连接。
•POOLED :这种数据源的实现利⽤ “ 池 ” 的概念将 JDBC 连接对象组织起来。 •JNDI :这个数据源的实现是为了能在如 EJB 或应⽤服务器这类容器中使⽤,容器可以集中或在外部配
置数据源,然后放置⼀个 JNDI 上下⽂的引⽤。
2)mapper 标签
该标签的作⽤是加载映射的,加载⽅式有如下⼏种
使⽤相对于类路径的资源引⽤,例如:<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>• 使⽤完全限定资源定位符( URL ),例如:<mapper url="file:///var/mappers/AuthorMapper.xml"/>• 使⽤映射器接⼝实现类的完全限定类名,例如:<mapper class="org.mybatis.builder.AuthorMapper"/>• 将包内的映射器接⼝实现全部注册为映射器,例如:<package name="org.mybatis.builder"/>
3)Properties 标签
实际开发中,习惯将数据源的配置信息单独抽取成⼀个 properties ⽂件,该标签可以加载额外配置的
properties ⽂件
4)typeAliases 标签
类型别名是为 Java 类型设置⼀个短的名字。原来的类型名称配置如下

配置 typeAliases ,为 com.lagou.domain.User 定义别名为 user


上面typeAlias只针对一个实体对象起别名。package是批量起别名


运行结果正常。
上⾯我们是⾃定义的别名, mybatis 框架已经为我们设置好的⼀些常⽤的类型的别名

如以下配置

执行测试
@Testpublic void testDelete() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); sqlSession.delete("com.ch.dao.IUserDao.deleteUser",3); //增删改的时候必须提交事务 sqlSession.commit(); sqlSession.close();}结果删除成功
动态 sql 语句
动态 sql 语句概述
Mybatis 的映射⽂件中,前⾯我们的 SQL 都是⽐较简单的,有些时候业务逻辑复杂时,我们的 SQL 是
动态变化的,此时在前⾯的学习中我们的 SQL 就不能满⾜要求了。
参考的官⽅⽂档,描述如下:
动态 SQL 之 我们根据实体类的不同取值,使⽤不同的 SQL 语句来进⾏查询。⽐如在 id 如果不为空时可以根据 id 查
询,如果 username 不同空时还要加⼊⽤户名作为条件。这种情况在我们的多条件组合查询中经常会碰
到。
定义接口方法:
/* 多条件组合查询,演示if*/ public ListfindByCondition();
映射文件的mapper接口
测试只查询用户名,只有username存在情况,结果
@Testpublic void test6() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); User user = new User(); user.setUsername("test"); IUserDao userDao=sqlSession.getMapper(IUserDao.class); Listall = userDao.findByCondition(user); System.out.println("用户信息"+all); sqlSession.close();} 测试结果:
用户信息[User{id=4, username='test'}]
当查询条件 id 和 username 都存在时,控制台打印的 sql 语句如下:
结果:用户信息[]@Testpublic void test6() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); User user = new User(); user.setId(3); user.setUsername("test"); IUserDao userDao=sqlSession.getMapper(IUserDao.class); Listall = userDao.findByCondition(user); System.out.println("用户信息"+all); sqlSession.close();}
优化sql语句中的where 1=1
使用上面两端测试代码,测试结果相同
动态 SQL 之
循环执⾏ sql 的拼接操作,例如: SELECT * FROM USER WHERE id IN (1,2,5) 。
多值查询定义接口
//多值查询,演示foreachpublic ListfindByIds(int[] ids);
映射文件
测试代码⽚段如下:
@Testpublic void test7() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); int[] ids={2,3,4}; IUserDao userDao=sqlSession.getMapper(IUserDao.class); Listall = userDao.findByIds(ids); System.out.println("用户信息"+all); sqlSession.close();} 结果如下
用户信息[User{id=2, username='修改'}, User{id=3, username='ddd'}, User{id=4, username='test'}]
foreach 标签的属性含义如下:
标签⽤于遍历集合,它的属性:
•collection :代表要遍历的集合元素,注意编写时不要写 #{}
•open :代表语句的开始部分
•close :代表结束部分
•item :代表遍历集合的每个元素,⽣成的变量名
•sperator :代表分隔符
SQL ⽚段抽取
Sql 中可将重复的 sql 提取出来,使⽤时⽤ include 引⽤即可,最终达到 sql 重⽤的⽬的
所有包含抽取片段的语句都可以用include进行替换

运行测试
@Testpublic void testFindAll() throws IOException { //Resource:工具类,配置文件的加载,把配置文件加载成字节输入流 InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); //解析配置文件,创建了sqlSessionFactory工厂 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); //生产了sqlSession SqlSession sqlSession = sqlSessionFactory.openSession();//默认开启了一个事务,但是不会自动提交 //在增删改时要手动提交事务,传入参数为true的时候会自动提交事务 //4.sqlSession调用方法:查询所有调用selectList,查询单个调用selectOne,添加:insert 修改调用update,删除调用delete ListuserList = sqlSession.selectList("com.ch.dao.IUserDao.findAll"); for (User user:userList) { System.out.println("用户数据"+user); } sqlSession.close();} 结果:
用户数据User{id=2, username='修改'}
用户数据User{id=3, username='ddd'} 用户数据User{id=4, username='test'} 用户数据User{id=5, username='5ff'}
下一篇学习 :Mybatis复杂映射开发
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年04月02日 15时28分50秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Mybatis【5】-- Mybatis多种增删改查那些你会了么?
2019-03-05
Mybatis【7】-- Mybatis如何知道增删改是否成功执行?
2019-03-05
计算输入的一句英文语句中单词数
2019-03-05
lvs+keepalive构建高可用集群
2019-03-05
Mysql高可用架构(主从同步)
2019-03-05
mysql主从延迟高的原因
2019-03-05
ATS缓存数据结构
2019-03-05
glob模块
2019-03-05
6 个 Linux 运维典型问题
2019-03-05
oracle无法启动asm实例记录
2019-03-05
取消vim打开文件全是黄色方法
2019-03-05
一个系统部署多个tomcat实例
2019-03-05
HP服务器设置iLO
2019-03-05
从头实现一个WPF条形图
2019-03-05
.NET CORE(C#) WPF 方便的实现用户控件切换(祝大家新年快乐)
2019-03-05
C# WPF开源控件库:MahApps.Metro
2019-03-05
使用QT实现一个简单的登陆对话框(纯代码实现C++)
2019-03-05
QT :warning LNK4042: 对象被多次指定;已忽略多余的指定
2019-03-05
GLFW 源码 下载-编译-使用/GLAD配置
2019-03-05