Rubin's Blog

  • 首页
  • 关于作者
  • 隐私政策
享受恬静与美好~~~
分享生活的点点滴滴~~~
  1. 首页
  2. MyBatis
  3. 正文

MyBatis之基本应用

2021年 5月 7日 851点热度 0人点赞 0条评论

前言

本博文主要讲述MyBatis的一些基本的应用示例,以供学习参考。也作为笔者学习框架的笔记。

快速入门

入门案例开发

开发步骤

我们的入门案例开发步骤如下:

  1. 添加依赖坐标
  2. 创建数据表
  3. 编写数据表对应的实体类
  4. 编写Mapper映射文件
  5. 编写MyBatis的核心配置文件
  6. 编写测试类测试结果

下面我们分步进行。

添加依赖坐标

MyBatis的依赖坐标如下:

<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>
<!--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>5.1.6</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>

创建数据表

数据表SQL如下:

DROP TABLE IF EXISTS user;
CREATE TABLE user (
    id INT(11) NOT NULL,
    username VARCHAR(50),
    password VARCHAR(50),
    PRIMARY KEY(userId)
);

编写数据表对应的实体类

实体类如下:

public class User {  
    private int id;  
    private String username;  
    private String password;
    //省略get个set方法
}

编写Mapper映射本件

映射文件如下:

<?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="userMapper">  
    <select id="findAll" resultType="com.rubin.entity.User">    
        select * from user  
    </select>
</mapper>

编写MyBatis的核心配置文件

配置文件示例:

<!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:///test"/>
                   <property name="username" value="root"/>
                   <property name="password" value="root"/>      
               </dataSource>    
           </environment>  
        </environments>  
    <mappers>
        <mapper resource="com/rubin/mapper/UserMapper.xml"/>
    </mappers>
</configuration>

编写测试类测试结果

测试类示例如下:

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

其他操作示例

插入操作

Mapper映射如下:

<mapper namespace="userMapper">  
    <insert id="add" parameterType="com.rubin.entity.User">    
        insert into user values(#{id}, #{username}, #{password})  
    </insert>
</mapper>

测试类示例如下:

InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
int insert = sqlSession.insert("userMapper.add", user);
System.out.println(insert);
//提交事务
sqlSession.commit();
sqlSession.close();

插入操作需要注意以下几点:

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

修改操作

Mapper映射如下:

<mapper namespace="userMapper">
   <update id="update" parameterType="com.rubin.entity.User">
       update user set username=#{username},password=#{password} where id=#{id}
   </update>
</mapper>

测试类示例如下:

InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
int update = sqlSession.update("userMapper.update", user);
System.out.println(update);
sqlSession.commit();
sqlSession.close();

修改操作需要注意以下几点:

  • 修改语句使用update标签。
  • 修改操作使用的API是sqlSession.update("命名空间.id",  实体对象);。
  • 修改操作涉及数据库数据变化,所以要使用sqlSession对象显示的提交事务,即sqlSession.commit()。

删除操作

Mapper映射如下:

<mapper namespace="userMapper">
   <delete id="delete" parameterType="java.lang.Integer">
       delete from user where id=#{id}
   </delete>
</mapper>

测试类示例如下:

InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
int delete = sqlSession.delete("userMapper.delete",3);
System.out.println(delete);
sqlSession.commit();
sqlSession.close();

删除操作需要注意以下几点:

  • 删除语句使用delete标签。
  • SQL语句中使用#{任意字符串}方式引用传递的单个参数。
  • 删除操作使用的API是sqlSession.delete(“命名空间.id”, Object);。
  • 删除操作涉及数据库数据变化,所以要使用sqlSession对象显示的提交事务,即sqlSession.commit()。

核心配置文件简述

MyBatis的核心文件层级如下图所示:

下面我们介绍一下我们常用的标签以及注意事项。

environments标签

数据库环境的配置,支持多环境配置。环境标签的详情如下图所示:

其中,事务管理器(transactionManager)类型有两种:

  • JDBC:这个配置就是直接使用了JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
  • MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false来阻止它默认的关闭行为。

其中,数据源(dataSource)类型有三种:

  • UNPOOLED:这个数据源的实现只是每次被请求时打开和关闭连接。
  • POOLED:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来。
  • JNDI:这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。

mapper标签

该标签的作用是加载映射的,加载方式有如下几种:

常用api简述

SqlSessionFactoryBuilder(SqlSession工厂构建器)

常用API: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 中加载资源文件。

SqlSessionFactory(SqlSession工厂对象)

SqlSessionFactory 有多个个方法创建SqlSession 实例。常用的有如下两个:

SqlSession(会话对象)

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

执行语句的方法主要有:

操作事务的方法主要有:

Mybatis的Dao层实现

传统开发方式

编写UserDao接口:

public interface UserDao {
   List<User> findAll() throws IOException;
}

编写UserDaoImpl实现:

public class UserDaoImpl implements UserDao {
   public List<User> findAll() throws IOException {
     InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
     SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
     SqlSession sqlSession = sqlSessionFactory.openSession();
     List<User> userList = sqlSession.selectList("userMapper.findAll");
     sqlSession.close();
     return userList;
  }
}

编写测试代码测试传统方式:

@Test
public void testTraditionDao() throws IOException {
   UserDao userDao = new UserDaoImpl();
   List<User> all = userDao.findAll();
   System.out.println(all);
}

代理开发方式

介绍

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

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

  • Mapper.xml文件中的namespace与mapper接口的全限定名相同。
  • Mapper接口方法名和Mapper.xml中定义的每个statement的id相同。
  • Mapper接口方法的输入参数类型和mapper.xml中定义的每个SQL的parameterType的类型相同。
  • Mapper接口方法的输出参数类型和mapper.xml中定义的每个SQL的resultType的类型相同。

实现案例

UserMapper接口和配置文件如下图:

编写测试用例:

@Test
public void testProxyDao() throws IOException {
   InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
   SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
   SqlSession sqlSession = sqlSessionFactory.openSession();
   //获得MyBatis框架生成的UserMapper接口的实现类
   UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
   User user = userMapper.findById(1);
   System.out.println(user);
   sqlSession.close();
}

链接

MyBatis官网地址:http://www.mybatis.org/mybatis-3/

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: MyBatis
最后更新:2022年 6月 9日

RubinChu

一个快乐的小逗比~~~

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复
文章目录
  • 前言
  • 快速入门
    • 入门案例开发
      • 开发步骤
      • 添加依赖坐标
      • 创建数据表
      • 编写数据表对应的实体类
      • 编写Mapper映射本件
      • 编写MyBatis的核心配置文件
      • 编写测试类测试结果
      • 其他操作示例
    • 核心配置文件简述
      • environments标签
      • mapper标签
    • 常用api简述
      • SqlSessionFactoryBuilder(SqlSession工厂构建器)
      • SqlSessionFactory(SqlSession工厂对象)
      • SqlSession(会话对象)
  • Mybatis的Dao层实现
    • 传统开发方式
    • 代理开发方式
      • 介绍
      • 实现案例
  • 链接
最新 热点 随机
最新 热点 随机
问题记录之Chrome设置屏蔽Https禁止调用Http行为 问题记录之Mac设置软链接 问题记录之JDK8连接MySQL数据库失败 面试系列之自我介绍 面试总结 算法思维
Netty进阶 ZooKeeper之基本应用 RocketMQ之架构与实战 MySQL之MyCat实战 Docker之常用命令 数据结构之散列表

COPYRIGHT © 2021 rubinchu.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

京ICP备19039146号-1