
3.Mybatis基本应用
发布日期:2021-05-08 11:38:54
浏览次数:27
分类:精选文章
本文共 10079 字,大约阅读时间需要 33 分钟。
3.1 快速⼊⻔
MyBatis 官⽹地址: http://www.mybatis.org/mybatis-3/
3.1.1 开发步骤:
①添加 MyBatis 的坐标
②创建 user 数据表
③编写 User 实体类
④编写映射⽂件 UserMapper.xml
⑤编写核⼼⽂件 SqlMapConfig.xml
⑥编写测试类
3.1.1 环境搭建:
1) 导⼊ MyBatis 的坐标和其他相关坐标
<properties><project.build.sourceEncoding> UTF-8 </project.build.sourceEncoding><maven.compiler.encoding> UTF-8 </maven.compiler.encoding><java.version> 1.8 </java.version><maven.compiler.source> 1.8 </maven.compiler.source><maven.compiler.target> 1.8 </maven.compiler.target></properties><!--mybatis 坐标 --><dependency><groupId> org.mybatis </groupId><artifactId> mybatis </artifactId><version> 3.4.5 </version></dependency><!--mysql 驱动坐标 --><dependency><groupId> mysql </groupId><artifactId> mysql-connector-java </artifactId><version> 5.1.6 </version><scope> runtime </scope></dependency><!-- 单元测试坐标 --><dependency><groupId> junit </groupId><artifactId> junit </artifactId><version> 4.12 </version><scope> test </scope></dependency><!-- ⽇志坐标 --><dependency><groupId> log4j </groupId><artifactId> log4j </artifactId><version> 1.2.12 </version></dependency>
创建数据库表,使用原来zdy_mybatis的user表
3) 编写 User 实体
package com.ch.pojo;public class User { private Integer id; private String username; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + '}'; }}
4)编写UserMapper映射⽂件
5) 编写MyBatis核⼼⽂件
6) 编写测试代码
package com.ch.test;import com.ch.pojo.User;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.Test;import java.io.IOException;import java.io.InputStream;import java.util.List;public class MybatisTest { @Test public void test() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); ListuserList = sqlSession.selectList("user.findAll"); for (User user:userList) { System.out.println("用户数据"+user); } }}
运行结果
用户数据User{id=1, username='zhangsan'}
用户数据User{id=2, username='lisi'} 3.1.4 MyBatis 的增删改查操作
MyBatis 的插⼊数据操作
1) 编写 UserMapper 映射⽂件
insert into user values(#{id},#{username})
2) 编写插⼊实体 User 的代码
@Testpublic void testInsert() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); User user = new User(); user.setId(4); user.setUsername("test"); sqlSession.insert("user.saveUser",user); //增删改的时候必须提交事务 sqlSession.commit(); sqlSession.close();}
执行成功
3) 插⼊操作注意问题
• 插⼊语句使⽤ insert 标签
• 在映射⽂件中使⽤ parameterType 属性指定要插⼊的数据类型
•Sql 语句中使⽤ #{ 实体属性名 } ⽅式引⽤实体中的属性值 • 插⼊操作使⽤的 API 是 sqlSession.insert(“ 命名空间 .id”, 实体对象 );
• 插⼊操作涉及数据库数据变化,所以要使⽤ sqlSession 对象显示的提交事务,即 sqlSession.commit()
3.1.5 MyBatis 的修改数据操作
1) 编写 UserMapper 映射⽂件
update user set username=#{username} where id=#{id}
2) 编写修改实体 User 的代码
@Testpublic void testUpdate() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); User user = new User(); user.setId(2); user.setUsername("修改"); sqlSession.update("user.updateUser",user); //增删改的时候必须提交事务 sqlSession.commit(); sqlSession.close();}
测试结果
3) 修改操作注意问题
• 修改语句使⽤ update 标签
• 修改操作使⽤的 API 是 sqlSession.update(“ 命名空间 .id”, 实体对象 );
3.1.6 MyBatis 的删除数据操作
1) 编写 UserMapper 映射⽂件
delete from user where id=#{abc}
2) 编写删除数据的代码
@Testpublic void testDelete() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); sqlSession.delete("user.deleteUser",1); //增删改的时候必须提交事务 sqlSession.commit(); sqlSession.close();}
测试结果
3) 删除操作注意问题
• 删除语句使⽤ delete 标签
•Sql 语句中使⽤ #{ 任意字符串 } ⽅式引⽤传递的单个参数
• 删除操作使⽤的 API 是 sqlSession.delete(“ 命名空间 .id”,Object);
3.1.5 MyBatis 的映射⽂件概述

3.1.6 ⼊⻔核⼼配置⽂件分析:
MyBatis 核⼼配置⽂件层级关系

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.1.7 Mybatis 相应 API 介绍
SqlSession ⼯⼚构建器 SqlSessionFactoryBuilder
常⽤ API : SqlSessionFactory build(InputStream inputStream)
通过加载 mybatis 的核⼼⽂件的输⼊流的形式构建⼀个 SqlSessionFactory 对象
//Resource:工具类,配置文件的加载,把配置文件加载成字节输入流InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");//解析配置文件,创建了sqlSessionFactory工厂SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);//生产了sqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();//默认开启了一个事务,但是不会自动提交 //在增删改时要手动提交事务,传入参数为true的时候会自动提交事务//4.sqlSession调用方法:查询所有调用selectList,查询单个调用selectOne,添加:insert 修改调用update,删除调用deleteListuserList = sqlSession.selectList("user.findAll");
其中, Resources ⼯具类,这个类在 org.apache.ibatis.io 包中。 Resources 类帮助你从类路径下、⽂
件系统或⼀个 web URL 中加载资源⽂件。
SqlSession ⼯⼚对象 SqlSessionFactory
SqlSessionFactory 有多个个⽅法创建 SqlSession 实例。常⽤的有如下两个:

SqlSession 会话对象
SqlSession 实例在 MyBatis 中是⾮常强⼤的⼀个类。在这⾥你会看到所有执⾏语句、提交或回滚事务
和获取映射器实例的⽅法。
执⾏语句的⽅法主要有:
< T > T selectOne ( String statement , Object parameter )< E > List < E > selectList ( String statement , Object parameter )int insert ( String statement , Object parameter )int update ( String statement , Object parameter )int delete ( String statement , Object parameter )
操作事务的⽅法主要有:
void commit ()void rollback ()
3.2 Mybatis 的 Dao 层实现
3.2.1 传统开发⽅式
编写 UserDao 接⼝
public interface IUserDao { //查询所有用户 public ListfindAll();}
编写 UserDaoImpl 实现
package com.ch.dao;import com.ch.pojo.User;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;import java.io.InputStream;import java.util.List;public class UserDaoImpl implements IUserDao{ @Override public ListfindAll() 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 List userList = sqlSession.selectList("user.findAll"); for (User user:userList) { System.out.println("用户数据"+user); } return userList; }}
测试传统方式
@Testpublic void test5() throws IOException { IUserDao userDao=new UserDaoImpl(); Listall = userDao.findAll(); System.out.println("查询全部数据"+all);}
测试结果锅
查询全部数据[User{id=2, username='修改'}, User{id=4, username='test'}]
3.2.2 代理开发⽅式
代理开发⽅式介绍
采⽤ Mybatis 的代理开发⽅式实现 DAO 层的开发,这种⽅式是我们后⾯进⼊企业的主流。
Mapper 接⼝开发⽅法只需要程序员编写 Mapper 接⼝(相当于 Dao 接⼝),由 Mybatis 框架根据接⼝
定义创建接⼝的动态代理对象,代理对象的⽅法体同上边 Dao 接⼝实现类⽅法。
Mapper 接⼝开发需要遵循以下规范:
1) Mapper.xml ⽂件中的 namespace 与 mapper 接⼝的全限定名相同
2) Mapper 接⼝⽅法名和 Mapper.xml 中定义的每个 statement 的 id 相同
3) Mapper 接⼝⽅法的输⼊参数类型和 mapper.xml 中定义的每个 sql 的 parameterType 的类型相同
4) Mapper 接⼝⽅法的输出参数类型和 mapper.xml 中定义的每个 sql 的 resultType 的类型相同
编写 UserMapper 接

将原来的映射文件修改成如下,namespace修改成DAO的全路径

代理方式测试
@Testpublic void test5() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); IUserDao userDao=sqlSession.getMapper(IUserDao.class); Listall = userDao.findAll(); System.out.println("用户信息"+all); sqlSession.close();}
下一节是配置文件深入:
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年04月17日 12时53分38秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
数据仓库系列之维度建模
2021-05-09
Scala教程之:函数式的Scala
2021-05-09
java中DelayQueue的使用
2021-05-09
线程stop和Interrupt
2021-05-09
Android中定时执行任务的3种实现方法
2021-05-09
nodejs中npm常用命令
2021-05-09
基于Vue2.0+Vue-router构建一个简单的单页应用
2021-05-09
基于vue2.0实现仿百度前端分页效果(二)
2021-05-09
JS魔法堂:函数重载 之 获取变量的数据类型
2021-05-09
时间序列神器之争:Prophet VS LSTM
2021-05-09
SpringBoot中关于Mybatis使用的三个问题
2021-05-09
MapReduce实验
2021-05-09
Leaflet 带箭头轨迹以及沿轨迹带方向的动态marker
2021-05-09
java大数据最全课程学习笔记(1)--Hadoop简介和安装及伪分布式
2021-05-09
java大数据最全课程学习笔记(2)--Hadoop完全分布式运行模式
2021-05-09
大部分程序员还不知道的 Servelt3 异步请求,原来这么简单?
2021-05-09
[apue] popen/pclose 疑点解惑
2021-05-09
[apue] getopt 可能重排参数
2021-05-09
移动互联网恶意软件命名及分类
2021-05-09