当前位置: 首页 > java>阅读正文

java持久层框架-Mybatis入门参考

2021.10.8 朱丰华 616 次 留下评论 5282字

mybatis是一款优秀的持久层框架,它是半自动的、轻量级java框架,官方文档:mybatis.org

它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

mybatis是Apache开源的项目,原名ibatis,在2010年从apache software foundation迁移到google code,在2013年迁移到github。在github上不但能搜索到mybatis源码,还能找到一些对应的mybatis翻译、插件。

  • 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
  • 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
  • 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
  • 提供映射标签,支持对象与数据库的orm字段关系映射
  • 提供对象关系映射标签,支持对象关系组建维护
  • 提供xml标签,支持编写动态sql。

第一个mybatis项目

注释:第一个程序可参考mybatis官方文档:Mybatis-getting-start,mybatis不推荐使用注解,本程序基于xml。

首先,你需要创建数据库,本文使用mysql5.7。

create database mybatis;
use mybatis;
create table if not exists user(
    id int(20) primary key auto_increment,
    name varchar(30) default null,
    pwd varchar(30) default null
)engine innodb default character set utf8;
insert into user(name,pwd) values('张三','123456'),('李四','123'),('王五','666');

select * from user;

使用maven创建项目时导入mybatis坐标以及mysql坐标:

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.5.2</version>
</dependency>
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.6</version>
</dependency>

此外,因为maven是约定大于配置,如果你想在java目录使用resources,需要编写以下build规则

<build>
  <resources>
    <resource>
      <directory>src/main/resources</directory>
      <includes>
        <include>**/*.properties</include>
        <include>**/*.xml</include>
      </includes>
      <filtering>true</filtering>
    </resource>
    <resource>
      <directory>src/main/java</directory>
      <includes>
        <include>**/*.properties</include>
        <include>**/*.xml</include>
      </includes>
      <filtering>true</filtering>
    </resource>
  </resources>
</build>

核心配置文件

核心配置文件,也叫主配置文件,必须使用xml文件配置,通常在resource目录新建一个名为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://localhost/mybatis?useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="mybatis"/>
                <property name="password" value="YOUR_PASSWORD"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>
</configuration>

创建一个MybatisUtil工具类,以快速获取SqlSession

public class MybatisUtil {

    static SqlSessionFactory sqlSessionFactory;
    static{
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }

    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }
}

创建User实体类,主要注意,必须符合ORM规则,类属性和表字段一一对应

public class User {
    private int id;
    private String name;
    private String pwd;

    public User() {
    }

    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }


    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}

配置mapper

编写userMapper类,此类相当于jdbc的dao类,mybatis中一般不叫dao

import java.util.List;

public interface UserMapper {
    List<User> getUser();
}

编写userMapper.xml,此文件相当于jdbc的daoImpl

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="mapper.UserMapper">
    <select id="getUser" resultType="domain.User">
        select * from user;
    </select>
</mapper>

编写测试类

public class Test {

    public static void main(String[] args) {
        SqlSession sqlSession = MybatisUtil.getSqlSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> users = mapper.getUser();
        for (User user : users) {
            System.out.println(user);
        }
        sqlSession.close();
    }
}

运行程序,得到如下结果:

User{id=1, name='张三', pwd='123456'}
User{id=2, name='李四', pwd='123'}
User{id=3, name='王五', pwd='666'}

可能会遇到的错误:

  1. mapper未注册,每一个mapper.xml需要在主配置文件中注册
  2. 绑定接口错误,mapper.xml的namespace需要正确绑定mapper类
  3. 方法名不对,mapper.xml的select的id与方法名要匹配
  4. 返回类型不对,mapper.xml的resultType需要指定返回值类型
  5. maven导出资源问题,在java路径下的资源需要手动编写build规则

mybatis增删改查

以下对mapper的增删该查进行详细说明,此部分对应于官方文档:xml映射文件

select语句

在mapper类中,添加一个方法,通过ID查询用户

User getUserById(int id);

在mapper.xml中,添加一个select标签,内容如下:

<select id="getUserById" parameterType="int" resultType="domain.User">
    select * from user where id = #{id};
</select>

这里的#{id}表示预处理语句参数,parameterType表示参数的类型

在test中,通过mapper对象,使用getUserById方法查询用户

System.out.println("********");
User userById = mapper.getUserById(2);
System.out.println(userById);

得到如下结果:

********
User{id=2, name='李四', pwd='123'}

insert, update 和 delete

与select不同的是,insert,update 和 delete必须提交事务。

数据变更语句 insert,update 和 delete 的实现非常接近,以下以insert示例。

在mapper类增加一个方法,使用int作为返回值,作为操作结果的判断标志

int addUser(User user);

在mapper.xml中,添加一个insert标签,内容如下

<insert id="addUser" parameterType="domain.User">
    insert into user(name,pwd) values(#{name},#{pwd});
</insert>

接着,在test中,使用mapper对象执行addUser方法

int addResult = mapper.addUser(new User(1, "哈哈", "123"));
if(addResult>0){
    System.out.println("提交成功");
    sqlSession.commit();
}
System.out.println("*********");

注意,你必须提交事务,否则不生效。此外,不推荐使用Map传参,规范来说应该使用实体类。

本篇完,还有疑问?留下评论吧

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注