目录
3.2 创建mapper接口,针对类中常见的增删改查方法的接口
3.3根据接口中的方法,在sqlMapper映射文件中写sql语句
一、Mybatis
1.1 什么是 MyBatis?
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
MyBatis是
框架:半成品,填充代码
支持自定义sql: 可以写sql语句
1.2 ORM思想
映射: 对象关系映射 ORM Object-Relational-Mapping 解决了java类和mysql数据库表的映射问题。
-
Hibernate
SSH框架 :Spring、Struts2、HIbernate
全自动的ORM框架(不需要写sql)
HIbernateUtil.query(User.class); 查询表中所有数据
HIbernateUtil.query(user); 查询当前对象相关的数据
开发效率高,运行效率低。
@TableName("user")
class User{
@Column("id");
private Integer id;
@One
private Role role;
@Many
private List<Account> list;
}
-
Mybatis(ibatis)
SSM框架:Spring、Springmvc、Mybatis
半自动的ORM框架(需要写sql语句,但是不需要手动的给参数赋值以及手动的封装结果集)
持久层技术对比
对比维度 | JDBC | Hibernate | MyBatis |
---|---|---|---|
底层/框架 | 底层 | 框架(全自动ORM) | 框架(半自动ORM) |
运行效率 | 最高 | 最低 | 中间 |
开发效率 | 最低 | 最高 | 中间 |
二、mybatis基础操作流程
2.1 引入jar包
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.17</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
2.2 mybatis核心配置文件
数据库环境配置
sqlmapper文件位置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<!--配置-->
<configuration>
<!--引入外部属性配置文件-->
<properties resource="db.properties"></properties>
<!--数据库连接环境配置 当前使用的默认环境-->
<environments default="development">
<!--单独的环境 id="环境名 唯一标识"-->
<environment id="development">
<!--事务管理 type="jdbc" 使用jdbc的事务管理机制-->
<transactionManager type="JDBC"/>
<!--数据源配置 type="POOLED|UNPOOLED" 使用连接池|不使用连接池-->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
<!--多个环境-->
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--映射器 指定sqlMapper文件位置-->
<mappers>
<mapper resource="mapper/AccountMapper.xml"/>
</mappers>
</configuration>
2.3 java文件和sql文件相分离
先创建javabean对象,与数据库表保持一致
@Data
public class Account {
private int id;
private String name;
private Double money;
}
sqlMapper映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--命名空间 唯一标识-->
<mapper namespace="com.hl.mybatis01.mapper">
<!--id=“sql语句唯一标识” resultType="返回结果集类型"-->
<select id="findAccount" resultType="com.hl.mybatis01.pojo.Account">
select * from account where id = #{id}
</select>
</mapper>
2.4 mybatis框架核心类,内部执行过程
-
MyBatis的核心类
-
资源加载
Resources
加载配置文件(如mybatis-config.xml
) -
工厂构建
SqlSessionFactoryBuilder
解析配置,创建单例SqlSessionFactory
-
会话创建
SqlSessionFactory
为每个数据库操作创建独立的SqlSession
-
SQL 执行
-
直接执行映射语句(已废弃方式)
-
推荐方式:通过
getMapper()
获取 Mapper 接口代理
-
-
内部执行流程
@Test
void query() throws IOException {
//1、加载mybatis核心配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2、创建SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//3、基于工厂获取会话连接
SqlSession session = factory.openSession();
//4、获取SqlMapper文件
//5、执行sql语句 ——45一起执行
Account account = session.selectOne("com.hl.mybatis01.mapper.findAccount", 1);
System.out.println(account);
//6、关闭流程
session.close();
}
三、mybatis面向接口开发
3.1 先创建javabean对象,与数据库表保持一致
@Data
public class Account {
private int id;
private String name;
private Double money;
}
3.2 创建mapper接口,针对类中常见的增删改查方法的接口
package com.hl.mybatis01.mapper;
import com.hl.mybatis01.pojo.Account;
import java.util.List;
public interface AccountMapper {
// 根据id查询单个账户
Account findAccount(int id);
// 查询所有的账户
List<Account> findAllAccount();
//更新一个账户 根据id更余额
int updateAccount(Account account);
// 删除一个用户
int deleteAccount(int id);
// 新增一个账户
int insertAccount(Account account);
}
3.3根据接口中的方法,在sqlMapper映射文件中写sql语句
其中的映射关系
- 命名空间=接口全路径
- sql的id=接口里面的方法名
- resultType返回结果类型和方法的返回值类型一致
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--命名空间 唯一标识-->
<mapper namespace="com.hl.mybatis01.mapper.AccountMapper">
<!-- 写sql语句 id="sql语句的唯一标识" resultType="返回结果集类型"-->
<select id="findAccount" resultType="com.hl.mybatis01.pojo.Account">
select * from account where id = #{id}
</select>
<!-- // 查询所有的账户-->
<!-- List<Account> findAllAccounts();-->
<select id="findAllAccount" resultType="com.hl.mybatis01.pojo.Account">
select * from account
</select>
<!-- //更新一个账户 根据id更余额-->
<!-- int updateAccount(Account account);-->
<update id="updateAccount" >
update account set money= #{money} where id = #{id}
</update>
<!-- // 删除一个用户-->
<!-- int deleteAccount(int id);-->
<delete id="deleteAccount">
delete from account where id = #{id}
</delete>
<!-- // 新增一个账户-->
<!-- int insertAccount(Account account);-->
<insert id="insertAccount">
insert into account (name, money) values (#{name}, #{money})
</insert>
</mapper>
3.4 测试类
package com.hl.mybatis01;
import com.hl.mybatis01.mapper.AccountMapper;
import com.hl.mybatis01.pojo.Account;
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.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
//@SpringBootTest
class MyBatis01ApplicationTests {
/*
MyBatis的核心类
Resources类
SqlSessionFactoryBuilder工厂建造者类
SqlSessionFactory工厂类
SqlSession会话
*/
@Test
void query() throws IOException {
// 1、加载mybatis核心配置文件
InputStream in=Resources.getResourceAsStream("mybatis-config.xml");
// 2、创建SqlSessionFactory工厂
SqlSessionFactory factory= new SqlSessionFactoryBuilder().build(in);
// 3、基于工厂获取会话连接
SqlSession session=factory.openSession();
// 4、获取SqlMapper文件 引号是sql语句的唯一标识=命名空间的唯一标识加sql语句的id
// 先获取接口文件,找到接口对象
AccountMapper accountMapper = session.getMapper(AccountMapper.class);
// 5、执行sql语句
// 执行sql语句,得到account对象
//查询按id查询单个账户
Account account = accountMapper.findAccount(1);
System.out.println(account);
//查询全部
List<Account> list = accountMapper.findAllAccount();
System.out.println(list);
//修改
Account account1 = new Account();
account1.setId(1);
account1.setMoney(23450.0);
int num = accountMapper.updateAccount(account1);
System.out.println("更新的数据条数:" + num);
//新增
Account account2 = new Account();
account2.setName("王五");
account2.setMoney(1000.0);
int num2 = accountMapper.insertAccount(account2);
System.out.println("插入的数据条数:" + num2);
//删除
int num3 = accountMapper.deleteAccount(4);
System.out.println("删除的数据条数:" + num3);
// !!!提交事务,如果不提交事务,数据不会更新到数据库,只针对增删改有效,产讯无效
session.commit();
// 6、关闭流程
session.close();
}
}