MyBatis 速成手册

本文全面介绍了MyBatis的使用,包括全局配置、数据源、映射文件、增删改查操作、参数处理、自增主键、缓存机制等内容。通过案例展示了如何配置MyBatis的typeAliases、mappers,以及如何通过接口和映射文件实现数据操作。同时,讨论了#{}和${}的区别,resultMap的使用以及缓存的实现原理和配置。
摘要由CSDN通过智能技术生成

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。

既然MyBatis有如此多的优势,那么下面就一起来看看MyBatis的用法吧。

入门案例

现有一张数据表:

mysql> use mybatis;
Database changed
mysql> select * from tbl_employee;
+----+-----------+--------+-------------+
| id | last_name | gender | email |
+----+-----------+--------+-------------+
|  1 | tom | 0      | tom@163.com |
+----+-----------+--------+-------------+
1 row in set (0.00 sec)

该如何通过MyBatis对其进行查询?首先创建对应的Java类:

package com.wwj.mybatis.bean;

public class Employee {
 
 private Integer id;
 private String lastName;
 private String email;
 private String gender;
 
 public Integer getId() {
  return id;
 }
 public void setId(Integer id) {
  this.id = id;
 }
 public String getLastName() {
  return lastName;
 }
 public void setLastName(String lastName) {
  this.lastName = lastName;
 }
 public String getEmail() {
  return email;
 }
 public void setEmail(String email) {
  this.email = email;
 }
 public String getGender() {
  return gender;
 }
 public void setGender(String gender) {
  this.gender = gender;
 }
 
 @Override
 public String toString() {
  return "Employee [id=" + id + ", lastName=" + lastName + ", email=" + email + ", gender=" + gender + "]";
 }
}

其次编写MyBatis的全局配置文件(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>
  <environments default="development">
  <environment id="development">
   <transactionManager type="JDBC"/>
         <dataSource type="POOLED">
           <property name="driver" value="com.mysql.jdbc.Driver"/>
           <property name="url" value="jdbc:mysql:///mybatis"/>
          <property name="username" value="root"/>
           <property name="password" value="123456"/>
         </dataSource>
     </environment>
 </environments>
 <mappers>
  <mapper resource="EmployeeMapper.xml"/>
 </mappers>
</configuration>

全局配置文件中主要配置的是数据源信息,然后是最后的mappers标签,该标签配置的是sql语句的映射文件。

所以我们接着创建sql语句的映射文件(EmployeeMapper.xml):

<?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.wwj.mybatis.bean.Employee">
  <select id="selectEmp" resultType="com.wwj.mybatis.bean.Employee">
     select id,last_name lastName,email,gender from tbl_employee where id = #{id}
   </select>
</mapper>

其中mapper标签的namespace属性设置的是需要映射的类全名;select标签表示查询语句,其中的id属性是该sql的唯一标识,resultType表示返回值的类型;然后在select标签中编写需要执行的sql语句。

一切准备就绪后,开始编写测试代码:

@Test
void test() throws IOException {
 String resource = "mybatis-config.xml";
 InputStream inputStream = Resources.getResourceAsStream(resource);
 SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
 SqlSession session = sessionFactory.openSession();
 Employee employee = session.selectOne("com.wwj.mybatis.bean.Employee.selectEmp",1);
 System.out.println(employee);
 session.close();
}

通过全局的配置文件去创建一个SqlSessionFactory,并通过该对象获得SqlSession,就可以使用SqlSession进行增删改查了。这里调用了selectOne方法,表示从数据表中查询一行数据,其中的第一个参数需要填入刚才在sql映射文件中设置的id,但为了避免该id与其它sql语句重复,一般都会在id前加上namespace;第二个参数则是需要传入sql的参数。

增删改查的新方式

在入门案例中我们已经成功通过MyBatis查询了数据表的数据,但是这种方式的缺点也是显而易见的,为此,MyBatis提供了一种更加完美的方式来操作数据表。

定义一个接口:

package com.wwj.mybatis.dao;

public interface EmployeeMapper {
 
 public Employee getEmpById(Integer id);
}

MyBatis神奇的地方就在于你不需要去实现该接口,只需要将该接口与对应的sql映射文件绑定即可,MyBatis会自动创建代理对象调用对应的方法。

所以我们需要对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="com.wwj.mybatis.dao.EmployeeMapper">
  <select id="getEmpById" resultType="com.wwj.mybatis.bean.Employee">
     select id,last_name lastName,email,gender from tbl_employee where id = #{id}
   </select>
</mapper>

首先是namespace,现在该属性应该指向的是接口的全类名;然后是select标签的id属性,该属性也应该指向接口中对应的方法名,其它地方不变。

测试代码:

@Test
void test2() throws IOException{
 String resource = "mybatis-config.xml";
 InputStream inputStream = Resources.getResourceAsStream(resource);
 SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
 SqlSession session = sessionFactory.openSession();
 //Mybatis会为接口自动创建代理对象,并由代理对象执行增删改查
 EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
 Employee employee = mapper.getEmpById(1);
 System.out.println(employee);
 session.close();
}

这里同样是通过全局配置文件创建SqlSessionFactory,并通过该对象获得SqlSession,不同的是,这里需要通过SqlSession对象调用getMapper方法去获得指定的接口的实现类,该实现类是MyBatis自动生成的代理对象,并通过该对象调用指定的方法完成数据表的操作。

通过properties标签引入外部属性文件

这个操作已经是再熟悉不过了,这里直接贴出代码:

<?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 resource="dbconfig.properties"></properties>
 
  <environments default="development">
  <environment id="development">
   <transactionManager type="JDBC"/>
         <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>
  <mapper resource="EmployeeMapper.xml"/>
 </mappers>
</configuration>

typeAliases

这是一个全局配置文件的标签,通过该标签能够为某个Java类型设置别名,比如:

<typeAliases>
 <!-- type:指定要起别名的类型全类名,默认别名为类名字母小写:employee 
   也可以使用alias属性为其设置指定的别名
 -->
 &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值