一、MyBatis 介绍
MyBatis 是一个优秀的基于 Java 的持久层框架(是一个DAO层的框架),它内部封装了 JDBC,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。
MyBatis 通过 xml 或注解的方式将要执行的各种 statement 配置起来,并通过 Java 对象和 statement 中 sql 的动态参数进行映射生成最终执行的 sql 语句。最后 MyBatis 框架执行 sql 并将结果映射为 Java 对象并返回。
MyBatis 的过去: MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code ,并且改名为MyBatis。2013年11月迁移到Github。
名字由来:iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)。
当前,最新版本是MyBatis 3.5.9,其发布时间是2021年12月26日。
优点: 采用 ORM 思想解决了实体和数据库映射的问题,对 JDBC 进行了封装,屏蔽了 JDBC API 底层访问细节,使我们不用与 JDBC API 打交道,就可以完成对数据库的持久化操作。
二、入门 MyBatis
前面的介绍我们提到了DAO层、JDBC、sql语句本身、映射等。下面来简单说说使用 MyBatis 的六大步骤:
① 添加 MyBatis 的坐标
② 创建 user 数据表
③ 编写 User 实体类
④ 编写核心配置文件 mybatis-config.xml
⑤ 编写 DAO 层接口,使用注解进行开发
第①步中的“坐标”就相当于是在引入jar包,假设我们是用 Maven 进行的开发,那么可以在 pox.xml 文件中写你需要的 MyBatis 依赖,示例如下:
<dependencies>
……
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
……
</dependencies>
第②、③步创建数据表和实体类不用多说。
第④步是编写核心配置文件:mybatis-config.xml ,里面是数据库连接的四要素、事务管理器等。它直接放在resource目录下即可。
第⑤步编写DAO层接口,并使用注解进行开发,有几点需要注意:1、核心配置文件中不再是“加载映射文件”,而是加载映射关系;2、常被使用的注解有:@Select
、@Insert
、@Update
、@Delete
、@Results
、@Result
、@Many
;3、注解中输入参数 #{参数}
参数名应和实体类的属性名一致。
三、源码示例
项目结构如下图:
![mybatis_demo项目结构如图](https://img-blog.csdnimg.cn/ceb1a6cb47a541159a9e5573cd6939dd.png)
源码只举例第④、⑥步的代码,其他几步就不多说了!
第④步 核心配置文件 mybatis-config.xml 代码是一样的:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 通过properties标签加载外部properties文件 -->
<properties resource="jdbc.properties"></properties>
<!--别名-->
<typeAliases>
<package name="org.example.domain"/>
</typeAliases>
<!-- 配置数据源信息 -->
<environments default="developement">
<environment id="developement">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--加载映射关系-->
<mappers>
<!--指定接口所在的包/类-->
<package name="org.example.dao"></package>
</mappers>
</configuration>
jdbc.properties 源码:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/你的数据库名
jdbc.username=登录名
jdbc.password=登录密码
dao层接口类 org.example.dao.UserMapper.java
中的注解如下:
@Select("select * from sys_user")
List<User> getUserList();
@Insert("insert into sys_user values(null,#{username},#{email},#{password},#{phoneNum})")
void addOneUser(User u);
@Update("update sys_user set username=#{username},phoneNum=#{phoneNum} where id=#{id}")
void updateOneUser(User u);
@Delete("delete from sys_user where id=#{id}")
void deleteOneUser(int id);
编写测试代码 org.example.test.Mybatis.java
:
private UserMapper mapper;
@Before
public void before() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
mapper = sqlSession.getMapper(UserMapper.class);
}
@Test
public void show() throws IOException {//查
List<User> userList = mapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
}
@Test
public void add() throws IOException {//增
User u = new User();//模拟数据
u.setUsername("张三");
u.setEmail("xxx@xx.com");
u.setPassword("123");
u.setPhoneNum("13899990000");
mapper.addOneUser(u);
show();
}
@Test
public void update() throws IOException {//改
User u = new User();//模拟数据
u.setId(1L);
u.setUsername("张三");
u.setPhoneNum("13866660000");
mapper.updateOneUser(u);
show();
}
@Test
public void delete() throws IOException {//删
mapper.deleteOneUser(3);
show();
}
🍉