MyBatis保姆级理解与使用专业学习eclipse版
1. MyBatis简介
1.1 MyBatis的特点
1.2 MyBatis简介
MyBatis是一个半自动化的持久化层的ORM框架。
所谓的持久化层就是dao。
ORM:(Object Relation Mapping) 对象关系映射
将Java中的对象Bean 与数据库中的表建立映射关系。表中建立关系是通过外键->主键
优势:只需要配置好配置文件,那么久可以通过操作Java中的对象就能影响数据库表中的数据。
半自动化:
全自动化Hibernate:无需手写SQL,自动生成sql语句,自动生成的SQL,性能太低。无法优化SQL语句。当然Hibernate也支持原生手写SQL,但是还是写的太麻烦了。
而MyBatis是半自动化,需要手写SQL,但是SQL可以做自动的拼接。
ibatis
1.3 MyBatis中文网
什么是 MyBatis?
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
2. 搭建Mybaits框架
导入jar包
编写配置文件
使用核心类库
2.1 通过maven下载mybaits
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> |
2.2 建立maven工程&编写pom文件
2.2.1 新建maven的web项目
2.2.2 mybaits需要的pom文件内容
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.hy</groupId> <artifactId>springmvc006</artifactId> <version>0.0.1</version> <packaging>war</packaging>
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <maven.compiler.encoding>UTF-8</maven.compiler.encoding> </properties>
<dependencies> <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic --> <!-- logback日志 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.20</version> </dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <!-- 数据库连接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.9</version> </dependency>
<!—mybaits的核心jar包 --> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> <!—mybaits的核心jar包 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.49</version> </dependency> <!-- mybaits相关jar包 --> </dependencies>
<build> <plugins> <!-- 指定jdk,防止update project --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> <!-- 项目编码 --> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build> </project> |
mybaits的核心就这一个jar包,所以是轻量级的。
2.3 准备工作
2.3.1 建立数据库mybaitsdb01,建表,插入数据
create table sys_emp( emp_id bigint auto_increment, emp_name varchar(20), emp_pwd varchar(20), emp_gender enum('m','f'), emp_salary double(10,5), primary key(emp_id) );
INSERT INTO `sys_emp` VALUES (null, '范冰冰', 'fbb', 'f', 100.5); INSERT INTO `sys_emp` VALUES (null, '李冰冰', 'lbb', 'f', 300); INSERT INTO `sys_emp` VALUES (null, '张彬彬', 'zbb', 'm', 599); INSERT INTO `sys_emp` VALUES (null, '万茜', 'wq', 'm', 4000); INSERT INTO `sys_emp` VALUES (null, '李若彤', 'lrt', 'm', 5000.8);
select * from `sys_emp`; |
2.3.2 编写实体bean
package com.hy.bean;
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;
@Data @NoArgsConstructor @AllArgsConstructor public class Emp { private Long empId; private String empName; private String empPwd; private String empGender; private Double empSalary;
//构造方法(去ID的) public Emp(String empName, String empPwd, String empGender, Double empSalary) { super(); this.empName = empName; this.empPwd = empPwd; this.empGender = empGender; this.empSalary = empSalary; } } |
2.3.2 编写mapper接口(dao接口)
EmpMapper
package com.hy.mapper;
import java.util.List; import java.util.Map;
import org.apache.ibatis.annotations.Param;
import com.hy.bean.Emp;
/** * 声明这个接口是为了方便上层代码调用Mybatis的具体功能 * Mapper配置文件的namespace属性要和接口的全类名一致,这样才能通过接口找到Mapper配置 * 接口中的方法名要和Mapper配置文件中SQL语句标签的id属性一致,这样才能通过方法名找到具体SQL语句 * 又因为在Mapper配置文件中id属性的值是不能重复的,所以当前接口中方名也不能重复——当前接口中的方法不能重载 */ public interface EmpMapper { /** * 通过这个方法对应Mapper配置文件中的SQL语句 * @param empId 当前方法的参数对应SQL语句中#{empId}声明的参数 * @return 当前方法的返回值类型和resultType属性指定的类型一致 */ abstract public Emp selectEmpById(Long empId);
/** * 执行插入操作 * @param emp * @return 受影响的行数 */ abstract public int insertEmp(Emp emp);
/** * 执行删除操作 * @param empId * @return 受影响的行数 */ abstract public int deleteById(long empId);
/** * 执行更新操作 * @param harry * Mybatis返回的受影响行数也可以不使用 */ abstract public void updateEmp(Emp harry);
/** * 模糊查询,根据员工姓名片段查询对应数据 * @param 查询条件 * @return 查询结果 */ abstract public Emp selectEmpByName(String empName);
// 使用@Param注解给方法形参命名,具体用法参照Mapper配置文件 abstract public void updateSalaryById(@Param("empId") Long empId, @Param("empSalary") Double salary);
abstract public void updateByMap(Map<String, Object> paramMap);
abstract public Integer selectCount();
abstract public Map<String, Object> selectForMap(int empId);
abstract public List<Emp> selectAll();
// 执行插入数据操作,自增主键会放入实体类对象的id属性 // 方法返回值还是受影响行数 abstract public int insertWithKey(Emp emp);
abstract public List<Emp> selectWithResultMap(); }
|
这里我们换成了EmpMapper,新名字我们就适应新的写法,去掉前面的I,当然也可以不去掉叫IEmpMapper。
2.4 编写配置文件
Mybaits比较特殊有两个配置文件,一是,核心(全局)配置文件,二是,映射文件(编写sql语句的映射文件)
2.4.1 如何编写核心(全局)配置文件[mybatis-config.xml]
位置:resources目录下,只有一个
名称:核心配置名字推荐使用:mybaits-config.xml。
这里,我们习惯上命名为mybaits-config.xml,这个文件名只是建议,并非强制要求的。将来和Spring整合之后,这个配置文件可以省略。目前大家操作时,可以直接复制,粘贴。
将来mybaits和Spring整合了之后,mybatis-config这个全局配置文件 ,可以保留,也可以省略,省略之后,可以放在spring中配置文件中进行mybatis相关文件的配置。
2.4.2 编写核心配置文件
核心配置模板,直接从官网拷贝。
<?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> <environments default="development"> <environment id="development"> <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> <mappers> <mapper resource="org/mybatis/example/BlogMapper.xml" /> </mappers> </configuration> |
将黄色的地方改写
<?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> <!-- environments表示配置Mybaits的开发环境,可以配置多个环境,使用default属性指定实际运行 时使用的环境。default属性的取值是environment标签的id属性的值。 --> <environments default="development"> <!-- environment表示配置Mybaits的一个具体的环境 --> <environment id="development"> <!-- Mybaits的内置的事务管理器 --> <transactionManager type="JDBC" /> <!-- 配置数据源,这里使用的是Mybaits内置的数据源 --> <dataSource type="POOLED"> <!-- 建立数据库连接的具体信息 --> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatisdb01?characterEncoding=UTF8" /> <property name="username" value="root" /> <property name="password" value="root" /> </dataSource> </environment> </environments> <!-- 设置映射文件的路径,还没有写 --> <mappers> <!-- Mapper注册:指定Mybaits映射文件的具体位置 --> <!-- mapper标签:配置一个具体的Mapper映射文件 --> <!-- resource属性:指定Mapper映射文件的实际位置, 这里是以类路径根目录为基础的相对路径 对Maven工程的目录结构来说,resources目录下的内容会直接放入类路径 所以,这里我们以resources目录为基准 --> <mapper resource="org/mybatis/example/BlogMapper.xml" /> </mappers> </configuration>
|
在实际的工作中,一般都有是哪个环境,开发,测试,部署,设置连接的数据库都可以不一样,简单的说就是,可以连接不同的数据库,比如:连接Oracle的环境。
<environment id="development"> 可以设置不同的环境
2.4.2.1 重点总结:
事务管理器和数据源以后都是在spring中进行配置的,spring在它的声明式事务里面, Spring给我们提供了事务管理器,Spring帮我们做事务的管理,包括开启事务,提交事务或是回滚事务,包括释放数据库的连接,管理数据源,这些都是Spring帮我们去管理。所以这一部分配置以后都要移植到Spring的配置文件中的。
现在暂时在这里面配置好,帮助我们去学习,操作就行了。
2.4.3 如何编写SQL语句的映射文件
映射文件位置:resources/mapper => 相当于dao
映射文件名称:XxxMapper <=>接口名Mapper,比如EmpMapper ,DeptMapper
将来mybaits和Spring整合了之后,mybatis-config这个全局配置文件 ,可以保留,也可以省略,省略之后,可以放在spring中配置文件中进行mybatis相关文件的配置。
但是XxxMapper映射文件必须保留。
2.4.3.1 ORM相关概念
2.4.4 设置相关映射文件
2.4.4.1 在resources目录下设置mappers目录
2.4.4.2 拷贝xml文件里的内容
从官网拷贝:https://mybatis.net.cn/getting-started.html
<?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="org.mybatis.example.BlogMapper"> <select id="selectBlog" resultType="Blog"> select * from Blog where id = #{id} </select> </mapper> |
注意:以前我们叫dao,现在叫mapper,本质上都是持久化层的类,只是命名习惯的区别而已。
注意:EmpMapper.xml所在的目录要和mybatis-config.xml中使用的mapper标签配置的一致。
2.4.4.3 编写SQL语句
<?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属性: 在Mybaits全局范围内找到一个具体的Mapper配置 --> <!-- 为了方便通过接口全类名来找到Mapper配置文件,通常将namespace属性设为接口的全类名 --> <!-- 程序通过全局配置文件中的mapper标签找到当前的映射文件。 当前的XxxMapper映射文件,才能进一步找到这里配置的SQL语句 为了让一个Java XxxMapper接口(Dao接口)直接对应这个XxxMapper映射文件,并且直接调用方法 ,必须让XxxMapper接口的全类名作为这个 映射文件中的mapper标签的namespace属性值。 --> <mapper namespace="com.hy.mapper.EmpMapper"> <!-- 编写具体的SQL语句: select语句使用select标签 insert语句使用insert标签 update语句使用update标签 delete语句使用delete标签 -->
<!-- id属性:使用id属性唯一标记一条SQL语句 注意:id名与方法名保持一致。(最好保持一致,不一致新方法不能使用) -->
<!-- resultType属性:指定封装查询结果的Java实体类的全类名 Mybaits负责解析结果集,将解析得到的数据封装到设置的JavaBean类中。 --> <select id="selectEmpById" resultType="com.hy.bean.Emp"> <!-- Mybatis负责把SQL语句中的#{empId}部分替换成"?"占位符 在#{}内部还是要声明一个见名知意的名称,一般与JavaBean中属性名保持一致 #{empId}这里是为了方便接收Java程序传过来的参数数据 --> select emp_id empId,emp_name empName,emp_pwd empPwd,emp_gender empGender , emp_salary empSalary from sys_emp where emp_id = #{empId} </select> </mapper>
|
这里是符合SQL语句的命名标准,但是不符合JavaBean的命名习惯,所以要加别名。
2.4.4.4 注册XxxMapper.xml映射文件
所谓的注册Mapper:就是指定Mybaits映射文件的具体位置。
在mybatis-config.xml全局配置文件中,通过mapper标签,配置一个具体的XxxMapper.xml映射文件。
resource属性:指定Mapper映射文件的实际存储位置,对于maven工程的目录结构来说,对Maven工程的目录结构来说,resources目录下的内容会直接放入类路径。
所以,这里我们以resources目录为基准 ,不加/的相对路径,就是相对resources目录 。
2.5 在Junit中编写测试类
2.5.1 从 XML 中构建 SqlSessionFactory
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。
XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)。
2.5.2 具体操作
package com.hy.mybatis.test;
import java.io.IOException; import java.io.InputStream;
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 com.hy.bean.Emp; import com.hy.mapper.EmpMapper;
public class TestEmpMapper { @Test public void testSelectEmpById() throws IOException { //1. 使用Mybaits的Resources类来读取Mybatis全局配置文件 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//2. 创建SqlSessionFactoryBuilder对象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3. 调用builder对象的build方法创建SqlSessionFactory类的对象(工厂设计模式) SqlSessionFactory sessionFactory = builder.build(inputStream);
//4. 通过SqlSessionFactory对象开启一个从Java程序到数据库的会话 SqlSession sqlSession = sessionFactory.openSession();
//5. 通过sqlSession对象找到Mapper映射文件中可以执行的SQL语句,并执行。 namespace Object obj = sqlSession.selectOne("com.hy.mapper.EmpMapper.selectEmpById",1);
//6. 打印结果 System.out.println(obj);
//7. 提交事务 sqlSession.commit();
//8. 关闭sqlSession sqlSession.close(); }
@Test public void testSelectEmpById2() throws IOException { //1. 使用Mybaits的Resources类来读取Mybatis全局配置文件 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//2. 创建SqlSessionFactoryBuilder对象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3. 调用builder对象的build方法创建SqlSessionFactory类的对象(工厂设计模式) SqlSessionFactory sessionFactory = builder.build(inputStream);
//4. 通过SqlSessionFactory对象开启一个从Java程序到数据库的会话 SqlSession sqlSession = sessionFactory.openSession();
//5. 通过sqlSession对象通过反射机制,直接生成一个EmpMapper接口的匿名类的对象 EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
//6. 执行语句,打印结果 Emp emp = empMapper.selectEmpById(2L); System.out.println(emp);
//7. 提交事务 sqlSession.commit();
//8. 关闭sqlSession sqlSession.close(); } }
|
1,2,3,4,7,8都是暂时写的,等和Spring整合后,代码就非常简单了。我们这里已经可以看出,不用写EmpMapper的实现类了。只写接口即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!