重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要介绍“MyBatis简单使用实例”,在日常操作中,相信很多人在MyBatis简单使用实例问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MyBatis简单使用实例”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
目前创新互联公司已为上千多家的企业提供了网站建设、域名、虚拟空间、网站运营、企业网站设计、都兰网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
使用MyBatis可以分以下几个关键点
引入MyBatis依赖
配置mybatis-config.xml配置文件
创建数据库实体类与Mapper映射文件
通过SqlSessionFactoryBuilder加载配置并使用
以下按步骤写一个单元测试:
引入依赖
org.mybatis mybatis 3.5.4 mysql mysql-connector-java 5.1.40 org.projectlombok lombok 1.16.6
编写配置文件
mybatis-config.xml
db.properties数据库连接配置
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/data_test?useUnicode=true&characterEncoding=utf-8&rewriteBatchedStatements=true jdbc.username=root jdbc.password=123456
初始化数据,用于后边的单元测试。
## 部门表 CREATE TABLE `department` ( `id` int(5) NOT NULL, `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL, `parent_id` int(5) NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; ## 员工表 CREATE TABLE `user_department` ( `id` int(5) NOT NULL, `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL, `age` int(4) DEFAULT NULL, `default_department_id` int(5) NOT NULL, `all_department_id` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; ## 初始化部门 insert into department values (1,'部门1',null); insert into department values (2,'部门2',1); insert into department values (3,'部门3',null); ## 初始化员工 insert into user_department values (1,'张三',18,1,'2,3'); insert into user_department values (2,'李4',18,2,'1,2'); insert into user_department values (3,'王5',18,3,'3'); insert into user_department values (4,'赵6',18,1,'1');
数据库实体类与mapper配置
/** * 业务实体对象 */ @Data @NoArgsConstructor @AllArgsConstructor public class User implements Serializable { /** 主键ID */ private Long id; /** 姓名 */ private String name; /** 年龄 */ private Integer age; }
UserMapper.xml 映射文件
insert into user_department (id,name,age) values (#{id},#{name},#{age}) update user_department where id = #{id} name = #{name} ,age = #{age}
mapper调用接口,方法名要到Mapper.xml文件中的配置的Id相同,否则无法映射成功。
public interface UserMapper { /** * 根据主键查询 * @param id * @return */ public User byId(Long id); /** * 新增 * @param user * @return */ public void save(User user); /** * 修改 * @param user */ public void update(User user); /** * 多表关联查询 * @param id * @return */ public UserAndDepartment getUserAndDepartmentById(Long id); /** * 关联查询,有N + 1问题 * @param id * @return */ public UserAndDepartment getUserAndDepartmentById1(Long id); /** * 关联查询,1对多 * @param id * @return */ public UserAndDepartment getUserAndDepartmentById2(Long id); }
单元测试
package com.freecloud.plug.mybatis; import com.freecloud.common.LoggerUtil; import com.freecloud.plug.mybatis.dao.UserMapper; import com.freecloud.plug.mybatis.entity.User; import com.freecloud.plug.mybatis.entity.UserAndDepartment; 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.Before; import org.junit.Test; import java.io.IOException; import java.io.InputStream; /** * @Author: maomao * @Date: 2021-04-08 11:36 */ public class MyBatisTest { private SqlSessionFactory sqlSessionFactory; @Before public void init() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } /** * 使用mybatis api 方式硬编码方式 */ @Test public void testApiStatement(){ SqlSession sqlSession = sqlSessionFactory.openSession(); try { sqlSession.selectOne("com.freecloud.plug.mybatis.dao.UserMapper.byId",1); }finally { sqlSession.close(); } } /** * 测试使用mapper包装直接使用接口调用 */ @Test public void testMapperInterface(){ SqlSession sqlSession = sqlSessionFactory.openSession(); try { UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.byId(1L); LoggerUtil.printThread(user.toString()); }finally { sqlSession.close(); } } /** * 多表关联查询 */ @Test public void testUserAndDepartment(){ SqlSession sqlSession = sqlSessionFactory.openSession(); try { UserMapper userMapper = sqlSession.getMapper(UserMapper.class); UserAndDepartment user = userMapper.getUserAndDepartmentById(1L); LoggerUtil.printThread(user.toString()); }finally { sqlSession.close(); } } /** * 关联查询,有N + 1问题 */ @Test public void testUserAndDepartment1(){ SqlSession sqlSession = sqlSessionFactory.openSession(); try { UserMapper userMapper = sqlSession.getMapper(UserMapper.class); UserAndDepartment user = userMapper.getUserAndDepartmentById1(1L); LoggerUtil.printThread(user.toString()); }finally { sqlSession.close(); } } /** * 关联查询,1对多 */ @Test public void testUserAndDepartment2(){ SqlSession sqlSession = sqlSessionFactory.openSession(); try { UserMapper userMapper = sqlSession.getMapper(UserMapper.class); UserAndDepartment user = userMapper.getUserAndDepartmentById2(1L); LoggerUtil.printThread(user.toString()); }finally { sqlSession.close(); } } }
使用以上例子,就可以运行起来MyBatis。看单元测试中的使用方法,分别描述了几种常见方式。
使用传统硬编码直接通过Mapper映射器中配置的ID访问
使用一个空接口实现方法调用(无实现类),使用sqlSession.getMapper(UserMapper.class);方式获取实例执行
对象关联性查询一对多、一对一形式
在单元测试类中我们看到了MyBatis里面的几个核心对象:
SqlSessionFactoryBuiler
SqlSessionFactory
SqlSession
Mpper
这几个核心对象在MyBatis的整个工作流程里面的不同环节发挥作用。如果我们不用容器,自己去管理这些对象的话,我们必须考虑一个问题:什么时候创建和销毁这些对象?
在一些分布式应用里,多线程高并发场景中,如果要写出高效的代码,就必须了解这四个对象的生命周期。
它是用来构建SqlSessionFactory与解析mybatis-config等配置的,而SqlSessionFactory只需要一个,所以只要构建了一个SqlSessionFactory之后它的使命就完成了,也就没有存在的必要了。所以它的生命周期只存在于方法的局部。
SqlSessionFactory是用来创建SqlSession的,每次访问数据库都需要创建一个回话。因为我们一直有创建会话的需要,所以SqlSessionFactory应该存在于应用的整个生命周期中(作用域是应用作用域)。创建SqlSession只需要一个实例来做这件事就可以了,否则会造成混乱和资源浪费。所以我们应该采用单例模式。
一般工厂类在都应该是单例模式。
SqlSession是一个会话,因为它不是线程安全的,不能在线程间共享。所以我们在请求开始的时候创建一个SqlSession对象,在请求结束时要及时关闭它。也可以把它理解成Jdbc 的Connection连接。
实际是Mapper是一个代理对象,是从SqlSession中获取的。
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
它的作用是发送Sql来操作数据库的数据。它应该在一个SqlSession事务方法之内。
对象 | 作用域 |
---|---|
SqlSessionFactoryBuilder | 方法局部(method) |
SqlSessionFactory | 应用级别(application) |
SqlSession | 请求和操作(request、method) |
Mapper | 方法(method) |
以上就是四个核心对象的生命周期。
到此,关于“MyBatis简单使用实例”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!