MyBatis是一个半自动化的持久化层的ORM框架。
所谓的持久化层就是dao。
ORM:(Object Relation Mapping) 对象关系映射
将Java中的对象Bean 与数据库中的表建立映射关系。表中建立关系是通过外键->主键
优势:只需要配置好配置文件,那么久可以通过操作Java中的对象就能影响数据库表中的数据。
半自动化:
全自动化Hibernate:无需手写SQL,自动生成sql语句,自动生成的SQL,性能太低。无法优化SQL语句。当然Hibernate也支持原生手写SQL,但是还是写的太麻烦了。
而MyBatis是半自动化,需要手写SQL,但是SQL可以做自动的拼接。
ibatis
https://mybatis.net.cn/
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
导入jar包
编写配置文件
使用核心类库
mybatis |
"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"> war
UTF-8 UTF-8
mybaits的核心jar包 --> mybaits的核心jar包 -->
|
mybaits的核心就这一个jar包,所以是轻量级的。
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`; |
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; } } |
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
abstract public Integer selectCount();
abstract public Map
abstract public List
// 执行插入数据操作,自增主键会放入实体类对象的id属性 // 方法返回值还是受影响行数 abstract public int insertWithKey(Emp emp);
abstract public List }
|
这里我们换成了EmpMapper,新名字我们就适应新的写法,去掉前面的I,当然也可以不去掉叫IEmpMapper。
Mybaits比较特殊有两个配置文件,一是,核心(全局)配置文件,二是,映射文件(编写sql语句的映射文件)
位置:resources目录下,只有一个
名称:核心配置名字推荐使用:mybaits-config.xml。
这里,我们习惯上命名为mybaits-config.xml,这个文件名只是建议,并非强制要求的。将来和Spring整合之后,这个配置文件可以省略。目前大家操作时,可以直接复制,粘贴。
将来mybaits和Spring整合了之后,mybatis-config这个全局配置文件 ,可以保留,也可以省略,省略之后,可以放在spring中配置文件中进行mybatis相关文件的配置。
核心配置模板,直接从官网拷贝。
"1.0" encoding="UTF-8" ?>
PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> "driver" value="${driver}" /> "url" value="${url}" /> "username" value="${username}" /> "password" value="${password}" /> |
将黄色的地方改写
"1.0" encoding="UTF-8" ?>
PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> "driver" value="com.mysql.jdbc.Driver" /> "url" value="jdbc:mysql://127.0.0.1:3306/mybatisdb01?characterEncoding=UTF8" /> "username" value="root" /> "password" value="root" />
|
在实际的工作中,一般都有是哪个环境,开发,测试,部署,设置连接的数据库都可以不一样,简单的说就是,可以连接不同的数据库,比如:连接Oracle的环境。
事务管理器和数据源以后都是在spring中进行配置的,spring在它的声明式事务里面, Spring给我们提供了事务管理器,Spring帮我们做事务的管理,包括开启事务,提交事务或是回滚事务,包括释放数据库的连接,管理数据源,这些都是Spring帮我们去管理。所以这一部分配置以后都要移植到Spring的配置文件中的。
现在暂时在这里面配置好,帮助我们去学习,操作就行了。
映射文件位置:resources/mapper => 相当于dao
映射文件名称:XxxMapper <=>接口名Mapper,比如EmpMapper ,DeptMapper
将来mybaits和Spring整合了之后,mybatis-config这个全局配置文件 ,可以保留,也可以省略,省略之后,可以放在spring中配置文件中进行mybatis相关文件的配置。
但是XxxMapper映射文件必须保留。
从官网拷贝:https://mybatis.net.cn/getting-started.html
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
select * from Blog where id = #{id}
|
注意:以前我们叫dao,现在叫mapper,本质上都是持久化层的类,只是命名习惯的区别而已。
注意:EmpMapper.xml所在的目录要和mybatis-config.xml中使用的mapper标签配置的一致。
"1.0" encoding="UTF-8" ?> PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
select emp_id empId,emp_name empName,emp_pwd empPwd,emp_gender empGender , emp_salary empSalary from sys_emp where emp_id = #{empId}
|
这里是符合SQL语句的命名标准,但是不符合JavaBean的命名习惯,所以要加别名。
所谓的注册Mapper:就是指定Mybaits映射文件的具体位置。
在mybatis-config.xml全局配置文件中,通过mapper标签,配置一个具体的XxxMapper.xml映射文件。
resource属性:指定Mapper映射文件的实际存储位置,对于maven工程的目录结构来说,对Maven工程的目录结构来说,resources目录下的内容会直接放入类路径。
所以,这里我们以resources目录为基准 ,不加/的相对路径,就是相对resources目录 。
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。
XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)。
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的实现类了。只写接口即可。