Mybatis 基本应用

1. 快速入门

MyBatis 官网地址:http://www.mybatis.org/mybatis-3/
在这里插入图片描述

1.1. 开发步骤

  1. 添加 MyBatis 的坐标
  2. 创建 user 数据表
  3. 编写 User 实体类
  4. 编写映射文件 UserMapper.xml
  5. 编写核心文件 SqlMapConfig.xml
  6. 编写测试类

1.2. 环境搭建

  • 导入 MyBatis 的坐标和其他相关坐标
<?xml version="1.0" encoding="UTF-8"?>
<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">
  <parent>
    <artifactId>Mybatis</artifactId>
    <groupId>com.study</groupId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>

  <artifactId>mybatis-quick-stater</artifactId>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
    <java.version>1.8</java.version>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <!--引入依赖-->
  <dependencies>
    <!--mybatis坐标-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.5</version>
    </dependency>
    <!--mysql驱动坐标-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.13</version>
      <scope>runtime</scope>
    </dependency>
    <!--单元测试坐标-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
    <!--⽇志坐标-->
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.12</version>
    </dependency>
  </dependencies>
</project>
  • 创建 user 数据表
    在这里插入图片描述
  • 编写 User 实体
package com.study.pojo;

public class User {

    private Integer id;

    private String username;

    public Integer getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public String toString() {
        return "User{" +
        "id=" + id +
        ", username='" + username + '\'' +
        '}';
    }
}
  • 编写 UserMapper 映射文件
<?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">

<!--namespace : 命名空间,与id组成sql的唯一标识-->
<mapper namespace="userMapper">

  <!--resultType :表明返回值类型-->
  <select id="findAll" resultType="com.study.pojo.User">
    select * from User
  </select>
</mapper>
  • 编写 MyBatis 核心文件
<?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 运行环境-->
  <environments default="development">
    <environment id="development">
      <!--当前事务交由JDBC进行管理-->
      <transactionManager type="JDBC"/>
      <!--当前使用 mybatis 提供的连接池-->
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.cj.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="UserMapper.xml"/>
  </mappers>

</configuration>
  • 编写测试代码
package com.study.test;

import com.study.pojo.User;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MybatisTest {


    @Test
    public void test1() throws IOException {
        //加载核心配置文件
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        //获得sqlSession工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //获得sqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行sql语句
        List<User> userList = sqlSession.selectList("userMapper.findAll");
        //打印结果
        System.out.println(userList);
        //释放资源
        sqlSession.close();
    }
}

1.3. MyBatis 的增删改查操作

1.3.1. MyBatis 的插入数据操作

  • 编写 UserMapper 映射文件
<?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">

<!--namespace : 命名空间,与id组成sql的唯一标识-->
<mapper namespace="userMapper">    
  <!--添加用户   parameterType:参数类型-->
  <insert id="saveUser" parameterType="com.study.pojo.User">
    INSERT INTO user VALUES (#{id},#{username})
  </insert>
</mapper>
  • 编写插入实体 User 的代码
package com.study.test;

import com.study.pojo.User;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MybatisTest {

    @Test
    public void test2() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        User user = new User();
        user.setId(2);
        user.setUsername("Jack");
        sqlSession.insert("userMapper.saveUser",user);
        // 提交事务
        sqlSession.commit();
        sqlSession.close();
    }
}

插入操作注意问题:

  • 插入语句使用 insert 标签
  • 在映射文件中使用 parameterType 属性指定要插入的数据类型
  • Sql 语句中使用 #{实体属性名} 方式引用实体中的属性值
  • 插入操作使用的 APIsqlSession.insert(“命名空间.id”,实体对象)
  • 插入操作涉及数据库数据变化,所以要使用 sqlSession 对象显示的提交事务,即 sqlSession.commit()

1.3.2. MyBatis 的修改数据操作

  • 编写 UserMapper 映射文件
<?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">

<!--namespace : 命名空间,与id组成sql的唯一标识-->
<mapper namespace="userMapper">
  <!--修改-->
  <update id="updateUser" parameterType="com.study.pojo.User">
    UPDATE user SET username = #{username} WHERE id = #{id}
  </update>
</mapper>
  • 编写修改实体 User 的代码
package com.study.test;

import com.study.pojo.User;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MybatisTest {

    @Test
    public void test3() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        User user = new User();
        user.setId(2);
        user.setUsername("Eric");
        sqlSession.insert("userMapper.updateUser",user);
        // 提交事务
        sqlSession.commit();
        sqlSession.close();
    }
}

修改操作注意问题:

  • 修改语句使用 update 标签
  • 修改操作使用的 APIsqlSession.update(“命名空间.id”,实体对象)

1.3.3. MyBatis 的删除数据操作

  • 编写 UserMapper 映射文件
<?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">

<!--namespace : 命名空间,与id组成sql的唯一标识-->
<mapper namespace="userMapper">
  <!--删除-->
  <delete id="deleteUser" parameterType="int">
    DELETE FROM user where id = #{id}
  </delete>
</mapper>
  • 编写删除数据的代码
package com.study.test;

import com.study.pojo.User;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MybatisTest {

    @Test
    public void test4() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        sqlSession.insert("userMapper.deleteUser",2);
        // 提交事务
        sqlSession.commit();
        sqlSession.close();
    }
}

除操作注意问题:

  • 删除语句使用 delete 标签
  • Sql 语句中使用 #{任意字符串} 方式引用传递的单个参数
  • 删除操作使用的 APIsqlSession.delete(“命名空间.id”,Object)

1.4. MyBatis 的映射文件概述

在这里插入图片描述

1.5. Mybatis 相应 API 介绍

SqlSession 工厂构建器 SqlSessionFactoryBuilder

SqlSessionFactory build(InputStream inputStream)
通过加载 mybatis 的核心文件的输入流的形式构建一个 SqlSessionFactory 对象

String resource = "org/mybatis/builder/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);

其中, Resources 工具类,这个类在 org.apache.ibatis.io 包中。Resources 类帮助你从类路径下、文件系统或一个 web URL 中加载资源文件。

SqlSession 工厂对象 SqlSessionFactory

SqlSessionFactory 有多个个方法创建 SqlSession 实例。常用的有如下两个:
在这里插入图片描述
SqlSession 会话对象

SqlSession 实例在 MyBatis 中是非常强大的一个类。在这里你会看到所有执行语句、提交或回滚事务和获取映射器实例的方法。

执行语句的方法主要有:

<T> T selectOne(String statement, Object parameter) <E> List<E> selectList(String statement, Object parameter)
int insert(String statement, Object parameter)
int update(String statement, Object parameter)
int delete(String statement, Object parameter)

操作事务的方法主要有:

void commit() 
void rollback()

2. Mybatis 的 Dao 层实现

2.1. 传统开发方式

  • 编写 UserDAO 接口
package com.study.dao;

import com.study.pojo.User;

import java.io.IOException;
import java.util.List;

public interface UserDAO {

    List<User> findAll() throws IOException;
}
  • 编写 UserDAOImpl 实现
package com.study.dao.impl;

import com.study.dao.UserDAO;
import com.study.pojo.User;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class UserDAOImpl implements UserDAO {

    @Override
    public List<User> findAll() throws IOException {

        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        List<User> userList = sqlSession.selectList("userMapper.findAll");
        sqlSession.close();

        return userList;
    }
}
  • 测试传统方式
package com.study.test;

import com.study.dao.UserDAO;
import com.study.dao.impl.UserDAOImpl;
import com.study.pojo.User;

import java.util.List;

public class MybatisTest {

    @Test
    public void test5() throws IOException {

        UserDAO userDAO = new UserDAOImpl();
        List<User> userList = userDAO.findAll();
        System.out.println(userList);
    }
}

2.2. 代理开发方式

代理开发方式介绍

采用 Mybatis 的代理开发方式实现 DAO 层的开发,这种方式是我们后面进入企业的主流。
Mapper 接口开发方法只需要程序员编写 Mapper 接口(相当于 Dao 接口),由 Mybatis 框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边 Dao 接口实现类方法。

Mapper 接口开发需要遵循以下规范:

  1. Mapper.xml 文件中的 namespacemapper 接口的全限定名相同
  2. Mapper 接口方法名和 Mapper.xml 中定义的每个 statementid 相同
  3. Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个 sqlparameterType 的类型相同
  4. Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 sqlresultType 的类型相同
    在这里插入图片描述
  • 编写 UserMapper 接口
package com.study.dao;

import com.study.pojo.User;

public interface UserMapper {

    User findById(int id);
}
  • 测试代理方式
package com.study.test;

import com.study.dao.UserMapper;
import com.study.pojo.User;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MybatisTest {

    @Test
    public void test6() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.findById(1);

        System.out.println(user);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小松の博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值