【MyBatis框架点滴】——初识+环境搭建

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:   前段时间用几篇博客总结了一下Hibernate,下面再一起回顾总结一下另一套优秀的持久层框架——MyBatis。MyBatis的前身是iBatis,2010年改名为MyBatis~  同样是持久层框架,MyBatis和Hibernate有什么区别呢?做为初学者的我,不敢妄加评论,网上找了一些大牛的解释:

 前段时间用几篇博客总结了一下Hibernate,下面再一起回顾总结一下另一套优秀的持久层框架——MyBatis。MyBatis的前身是iBatis,2010年改名为MyBatis~

 同样是持久层框架,MyBatis和Hibernate有什么区别呢?做为初学者的我,不敢妄加评论,网上找了一些大牛的解释:


 ● hibernate的优点在于对象化,处理复杂的业务逻辑什么的比较实用,但是应付大批量的查询跟修改性能可能会差一点,特别是不懂怎么使用hibernate的情况下。


 ● 普通查询用hibernate ,复杂级联用mybatis.


 ● hibernate更像是一部面向对象的机器,而Xbatis或者spring jdbc更像是一个SQL工具,对于复杂的需求(包括更高的性能要求),使用工具的好处是便于自己灵活的扩展(说白了就是想怎么写sql就怎么写sql),而使用机器的前提是你要能够熟练的配置和架构,而这一点学习曲线是很高的,因为hibernate不仅仅是insert update delete的替代品,它的三态和cache让它更像是server级产品。但是尽管hibernate软件思想更好,设计更OO,回到现实出于很多实际需求和环境的要求,使用xbatis和spring jdbc依然是更好的选择。


 ● 在维护方面,ibatIS也许只要改改sql xml文件,hibernate则需改动源代码程序


 还看到一位网友用了一个超经典的比喻来回答“Hibernate和MyBatis应该选哪个?”这个问题:Hibernate和MyBatis感觉就像自动挡和手动挡一样看你要哪种快感了


 小编比较喜欢的学习方式是先实战后理论,所以废话不再多说,大概了解MyBatis原理和Hibernate区别后,先来搭建个精简的框架,后续渐近深入~


 搭好的框架结构如下:



0.png

1、最基本的jar包:


mybatis-3.3.0.jar(mybatis核心jar包)

 ibatis-common-2.jar(这个jar包主要在mybatis加载配置文件的时候用)

 mysql-connector-java-5.1.20-bin.jar(mysql驱动)


2、建立实体类


  User.java

public class User implements Serializable {
  private int id;
  private String username;
  private int sex;
  private Date birthday;
  private String address;
  //getter、setter省略
}


3、添加配置文件


 如上面的框架结构图(图1)中,User.xml是对应实体的配置文件(名字可以自定义,一般ibatis中都这么起名,mybatis习惯命名方式为 “***Mapper.xml”,这个后面到Mapper代理时再说。),这个配置文件中配置了所有对它对应实体的进行数据库操作的sql语句。如下例子中配置了对User的对象进行增删改查四个方法:


 namespace就是命名空间,相当于java中的包名,下面执行语句如select、insert标签中的id就是当下命名空间唯一标识的sql语句,就和在java中找某个类一样需要有它的包名一样,当执行此sql语句时,需要指定此方法的包名+id,比如在执行这个select方法,需要指定com.danny.mybatis.findUserById。

parameterType为传入参数的类型(java对象的类型),resultType为执行结果返回类型。


  User.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD iBatis Mapper 3.0 //EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="com.danny.mybatis">
  <!-- 查询用户-->
  <select id="findUserById" parameterType="int"
    resultType="com.danny.mybatis.po.User">
    select * from user where id=#{id}
  </select>
  <!-- 添加用户-->
  <insert id="insertUser" parameterType="com.danny.mybatis.po.User">
    <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
      select LAST_INSERT_ID()
    </selectKey>
    insert into user(id,username,birthday,sex,address) values (#{id},#{username},#{birthday},#{sex},#{address})
  </insert>
  <!-- 删除用户-->
  <delete id="deleteUser" parameterType="java.lang.Integer">
    delete from user where id=#{id}
  </delete>
  <!-- 更新用户-->
  <update id="updateUser" parameterType="com.danny.mybatis.po.User">
    update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id} 
  </update>
</mapper>


  SqlMapConfig.xml就是MyBatis的核心配置文件,类似于Hibernate中的hibernate.cfg.xml。

   SqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
  <environments default="development">
    <environment id="development">
      <!-- 使用jdbc事务管理,事务控制由mybatis管理 -->
      <transactionManager type="JDBC" />
      <!-- 数据库连接池 ,由mybatis管理 -->
      <dataSource type="POOLED">
        <property name ="driver" value ="com.mysql.jdbc.Driver" />
        <property name ="url" value ="jdbc:mysql://127.0.0.1:3306/mybatisdemo?characterEncoding=utf-8"/>
        <property name ="username" value ="root" />
        <property name ="password" value ="dannyhoo" />
      </dataSource>
    </environment>
  </environments>
  <!-- 加载映射文件 -->
  <mappers>
    <mapper resource="sqlmap/User.xml"/>
  </mappers>
</configuration>

 这里只是搭建纯的mybatis框架,不与其他框架(如Spring)整合,所以事务、连接池暂时由mybatis管理。与Hibernate另一个共同点是,User.xml也需要配置在MyBatis的核心配置文件SqlMapConfig.xml中。


4、添加接口、对应实现类


  UserDao.java


package com.danny.mybatis.dao;
import com.danny.mybatis.po.User;
/**
 * @ClassName:UserDao
 * @Description:用户Dao接口
 * @author Danny
 */
public interface UserDao {
  /**
   * 根据id查询用户信息
   * @param id
   * @return
   * @throws Exception
   */
  public User findByUserId(int id) throws Exception;
  /**
   * 添加用户信息
   * @param user
   * @throws Exception
   */
  public int insertUser(User user) throws Exception;
  /**
   * 删除用户信息
   * @param id
   * @throws Exception
   */
  public void deleteUser(int id) throws Exception;
  /**
   * 
   * @param 更新用户
   * @throws Exception
   */
  public void updateUser(User user) throws Exception;
}


   UserDaoImpl.java


package com.danny.mybatis.dao;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import com.danny.mybatis.po.User;
/**
 * @ClassName:UserDaoImpl
 * @Description:用户Dao实现类
 * @author Danny
 */
public class UserDaoImpl implements UserDao{
  //通过构造方法注入sqlSessionFactory
  private SqlSessionFactory sqlSessionFactory;
  public UserDaoImpl(SqlSessionFactory sqlSessionFactory){
    this.sqlSessionFactory=sqlSessionFactory;
  }
  /**
   * 根据id查询用户信息
   */
  @Override
  public User findByUserId(int id) throws Exception {
    SqlSession session=sqlSessionFactory.openSession();
    User user=(User)session.selectOne("com.danny.mybatis.findUserById",id);
    session.close();
    return user;
  }
  /**
   * 添加用户信息
   */
  @Override
  public int insertUser(User user) throws Exception {
    SqlSession session=sqlSessionFactory.openSession();
    int i=session.insert("com.danny.mybatis.insertUser", user);
    return i;
  }
  /**
   * 删除用户信息
   */
  @Override
  public void deleteUser(int id) throws Exception {
    SqlSession session=sqlSessionFactory.openSession();
    session.delete("com.danny.mybatis.deleteUser", id);
  }
  /**
   * 更新用户
   */
  @Override
  public void updateUser(User user) throws Exception {
    SqlSession session=sqlSessionFactory.openSession();
    session.update("com.danny.mybatis.updateUser", user);
  }
}


5、测试类:


   UserDaoImpl.java


package com.danny.mybatis.dao;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import com.danny.mybatis.po.User;
import com.ibatis.common.resources.Resources;
/**
 * @ClassName:UserDaoImplTest
 * @Description:TODO
 * @author Danny
 * @date 2016年5月10日上午9:26:50
 */
public class UserDaoImplTest {
  //会话工厂
  private SqlSessionFactory sqlSessionFactory;
  @Before
  public void setUp(){
    String myBatisResource="SqlMapConfig.xml";
    try {
      InputStream inputStream=Resources.getResourceAsStream(myBatisResource);
      sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  @Test
  public void testQuery() throws Exception{
    UserDao userDao=new UserDaoImpl(sqlSessionFactory);
    User user=userDao.findByUserId(1);
    System.out.println(user.getUsername());
  }
  @Test
  public void testInsert() throws Exception{
    //创建UserDao对象
    UserDao userDao=new UserDaoImpl(sqlSessionFactory);
    User user=new User();
    user.setUsername("DannyHoo");
    user.setSex(1);
    user.setBirthday(new Date());
    user.setAddress("Beijing");
    System.out.println(userDao.insertUser(user));
  }
  @Test
  public void testDelete() throws Exception{
    UserDao userDao=new UserDaoImpl(sqlSessionFactory);
    userDao.deleteUser(5);
  }
  @Test
  public void testUpdate() throws Exception{
    UserDao userDao=new UserDaoImpl(sqlSessionFactory);
    User user=userDao.findByUserId(8);
    user.setUsername("danny-8");
    userDao.updateUser(user);
  }
}


 贴了这么多代码,只有亲手尝试一下才会有感觉滴~这里用的数据库为mysql,所以再给个小提示,把表的存储引擎设置为InnoDB和MyISAM,上面的代码会有不同的结果哦~快去试试吧~

 最后总结一下mybatis框架的执行过程:


 1、配置mybatis的配置文件——SqlMapConfig.xml,且该配置文件名称可以自定义


 2、通过配置文件,加载mybatis运行环境,创建SqlSessionFactory会话工厂,SqlSessionFactory在实际使用时按单例方式


 3、通过SqlSessionFactory创建SqlSession(SqlSession是一个面向用户的接口,提供操作数据库的各种方法,它是线程不安全的,因此建议SqlSession在方法体内创建和应用)


 4、调用SqlSession的方法操作数据库,如果需要提交事务,调用SqlSession的commit方法


 5、释放资源,关闭SqlSession


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
6月前
|
SQL 缓存 Java
框架源码私享笔记(02)Mybatis核心框架原理 | 一条SQL透析核心组件功能特性
本文详细解构了MyBatis的工作机制,包括解析配置、创建连接、执行SQL、结果封装和关闭连接等步骤。文章还介绍了MyBatis的五大核心功能特性:支持动态SQL、缓存机制(一级和二级缓存)、插件扩展、延迟加载和SQL注解,帮助读者深入了解其高效灵活的设计理念。
|
8月前
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
353 29
|
6月前
|
Oracle 关系型数据库 Java
|
10月前
|
SQL Java 数据库连接
持久层框架MyBatisPlus
持久层框架MyBatisPlus
199 1
持久层框架MyBatisPlus
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
11月前
|
缓存 Cloud Native 安全
探索阿里巴巴新型ORM框架:超越MybatisPlus?
【10月更文挑战第9天】在Java开发领域,Mybatis及其增强工具MybatisPlus长期占据着ORM(对象关系映射)技术的主导地位。然而,随着技术的发展,阿里巴巴集团推出了一种新型ORM框架,旨在提供更高效、更简洁的开发体验。本文将对这一新型ORM框架进行探索,分析其特性,并与MybatisPlus进行比较。
375 0
|
SQL Java 数据库连接
【Java 第十三篇章】MyBatis 框架介绍
MyBatis 原名 iBATIS,2001 年由 Clinton Begin 创建,以其简易灵活著称。2010 年更名以重塑品牌形象。MyBatis 通过 SQL 映射文件将 SQL 语句与 Java 代码分离,支持编写原生 SQL 并与方法映射。具备对象关系映射功能,简化数据库记录处理。支持动态 SQL 构建,灵活应对不同查询条件。内置缓存机制,提升查询效率。相比全功能 ORM,MyBatis 提供更高 SQL 控制度和更好的维护性,并易于与 Spring 等框架集成,广泛应用于 Java 数据访问层。
186 0
|
druid Java 数据库连接
SpringBoot项目整合MybatisPlus持久层框架+Druid数据库连接池,以及实现增删改查功能
SpringBoot项目整合MybatisPlus和Druid数据库连接池,实现基本的增删改查功能。
1061 0
|
SQL Java 数据库连接
后端框架的学习----mybatis框架(5、分页)
这篇文章介绍了如何在MyBatis框架中实现分页功能,包括使用SQL的`limit`语句进行分页和利用MyBatis的`RowBounds`对象进行分页的方法。
|
SQL Java 数据库连接
后端框架的学习----mybatis框架(7、使用注解开发)
这篇文章讲述了如何使用MyBatis框架的注解方式进行开发,包括在接口上使用注解定义SQL语句,并通过动态代理实现对数据库的增删改查操作,同时强调了接口需要在核心配置文件中注册绑定。