这篇文章主要介绍“MyBatis简单使用实例”,在日常操作中,相信很多人在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的整个工作流程里面的不同环节发挥作用。如果我们不用容器,自己去管理这些对象的话,我们必须考虑一个问题:什么时候创建和销毁这些对象?
在一些分布式应用里,多线程高并发场景中,如果要写出高效的代码,就必须了解这四个对象的生命周期。
SqlSessionFactoryBuiler
它是用来构建SqlSessionFactory与解析mybatis-config等配置的,而SqlSessionFactory只需要一个,所以只要构建了一个SqlSessionFactory之后它的使命就完成了,也就没有存在的必要了。所以它的生命周期只存在于方法的局部。
SqlSessionFactory
SqlSessionFactory是用来创建SqlSession的,每次访问数据库都需要创建一个回话。因为我们一直有创建会话的需要,所以SqlSessionFactory应该存在于应用的整个生命周期中(作用域是应用作用域)。创建SqlSession只需要一个实例来做这件事就可以了,否则会造成混乱和资源浪费。所以我们应该采用单例模式。
一般工厂类在都应该是单例模式。
SqlSession
SqlSession是一个会话,因为它不是线程安全的,不能在线程间共享。所以我们在请求开始的时候创建一个SqlSession对象,在请求结束时要及时关闭它。也可以把它理解成Jdbc 的Connection连接。
Mapper
实际是Mapper是一个代理对象,是从SqlSession中获取的。
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
它的作用是发送Sql来操作数据库的数据。它应该在一个SqlSession事务方法之内。
| 对象 | 作用域 |
|---|---|
| SqlSessionFactoryBuilder | 方法局部(method) |
| SqlSessionFactory | 应用级别(application) |
| SqlSession | 请求和操作(request、method) |
| Mapper | 方法(method) |
以上就是四个核心对象的生命周期。
到此,关于“MyBatis简单使用实例”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!
网站标题:MyBatis简单使用实例
URL地址:http://www.jxjierui.cn/article/gejdoi.html


咨询
建站咨询
