当前位置: 首页 > 编程笔记 >

MyBatis入门介绍(超简单)

殷承恩
2023-03-14
本文向大家介绍MyBatis入门介绍(超简单),包括了MyBatis入门介绍(超简单)的使用技巧和注意事项,需要的朋友参考一下

MyBatis 简介

MyBatis的前身叫iBatis,本是apache的一个开源项目, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis。MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录。

首先介绍一下Mybatis是什么?mybatis是Java的持久层框架, JAVA操作数据库是通过jdbc来操作的,而mybatis是对jdbc的封装。

  使用mybatis之后,开发者只需要关注sql语句本身,而不必花时间去注册驱动、创建connection、statement、手动设置参数,结果集检索等jdbc繁琐的代码。

  mybatis基本过程:Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

  下面通过一个根据用户id查询用户信息来学习mybatis:

     先介绍一下mybatis的两种主要的配置文件:

        SqlMapConfig.xml(mybatis全局配置文件,名称不固定,用来配置运行环境(数据源、事务)

        类名+mapper.xml 主要用来配置sql语句

  一、首先我们需要在mybatis的全局配置文件(SqlMapConfig.xml)中配置jdbc连接池,和加载mapper.xml.

当系统启动时,会加载这个全局配置文件,然后通过全局配置文件加载到mapper.xml文件。mapper.xml文件中配置了sql语句。

  二、编写SqlSessionFactory。mybatis的核心就是这个SqlSessionFactory。通过这个SqlSessionFactory将配置文件以参数的形式传入之后,创建了一个会话。

然后通过sqlsession来操作数据库,进行增删改查。

  下面来对第一步和第二步分别做个细致的分析。首先贴上代码:

sqlMapperConfig.xml

<environments default="development">
    <environment id="development">
    <!-- 使用jdbc事务管理-->
      <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>
    <!-- 通过resource引用mapper的映射文件 -->
    <mapper resource="sqlmap/User.xml" />
  </mappers>

 通过这个配置文件可以看出总的配置文件是配置一些主要信息和加载别的配置文件。当mybatis和Spring整合之后,environment就会被废除。同时,这种全局配置文件只会有一个。而 "表名+mapper.xml"这种配置文件则会有很多。

下面来分析 "表名+mapper.xml"

<!-- namespace命名空间,为了对sql语句进行隔离,方便管理 ,mapper开发dao方式,使用namespace有特殊作用
mapper代理开发时将namespace指定为mapper接口的全限定名
 -->
<mapper namespace="test">
<!-- 在mapper.xml文件中配置很多的sql语句,执行每个sql语句时,封装为MappedStatement对象
mapper.xml以statement为单位管理sql语句
 -->
  <!-- 根据id查询用户信息 -->
  <!-- 
    id:唯一标识 一个statement
    #{}:表示 一个占位符,如果#{}中传入简单类型的参数,#{}中的名称随意
    parameterType:输入 参数的类型,通过#{}接收parameterType输入 的参数
    resultType:输出结果 类型,不管返回是多条还是单条,指定单条记录映射的pojo类型
   -->
  <select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">
    SELECT * FROM USER WHERE id= #{id}
  </select>

    从代码中可以看出这个配置文件是用来配置sql语句的。但是应当注意,最上面的namespace的注释,namespace命名空间,为了对sql语句进行隔离,方便管理 ,mapper开发dao方式,使用namespace有特殊作用,mapper代理开发时将namespace指定为mapper接口的全限定名。

在后面的SQLSessionFactory类中就能看出其作用了。

  这个配置文件中的每个sql语句,其实都是jdbc中的statement,这样的话,其实mybatis内部也是在操作statement。

  这里的<select>标签里面传参用到的是#{},而我们要用模糊查询的时候是不能用这个直接加上%的。

  但是有一种方法就是 使用${}接收参数!如下:

<!-- 根据用户名称查询用户信息,可能返回多条
  ${}:表示sql的拼接,通过${}接收参数,将参数的内容不加任何修饰拼接在sql中。
   -->
  <select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User">
    select * from user where username like '%${value}%'
  </select>

但是上面这种方法是不加任何修饰的拼接在sql中的,也就是不能防止sql注入,所以这种方法也不能应用到实际项目中!

所以,我在百度上搜到了另一种方式来进行模糊查询,不知道有没有什么bug,但是我测试是可以用的。

<!-- 根据用户名模糊查询查询出员工的信息 -->
  <select id="search" resultType="Employee">
    SELECT 
      <include refid="allColumns"/>
    FROM employee a where a.name like concat(concat('%',#{name}),'%')
  </select>

下面来看看sqlsessionFactory会话工厂的代码:

public class MybatisFirst {
  // 会话工厂
  private SqlSessionFactory sqlSessionFactory;
  // 创建工厂
  @Before
  public void init() throws IOException {
    // 配置文件(SqlMapConfig.xml)
    String resource = "SqlMapConfig.xml";
    // 加载配置文件到输入 流
    InputStream inputStream = Resources.getResourceAsStream(resource);
    // 创建会话工厂
    sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  }
  // 测试根据id查询用户(得到单条记录)
  @Test
  public void testFindUserById() {
    // 通过sqlSessionFactory创建sqlSession
    SqlSession sqlSession = sqlSessionFactory.openSession();
    // 通过sqlSession操作数据库
    // 第一个参数:statement的位置,等于namespace+statement的id
    // 第二个参数:传入的参数
    User user = null;
    try {
      user = sqlSession.selectOne("test.findUserById", 2);
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      // 关闭sqlSession
      sqlSession.close();
    }
    System.out.println(user);
  }

会话工厂的代码很简单,就是:家在配置文件、创建会话工厂、通过会话操作数据库、关闭会话:

但是请注意第35行的参数。就是我们前面提到的namespace的test,是为了隔离sql而写的,这里体现的它的作用!

还有就是selectOne这两个参数各自的意义:第一个参数就是我们所说的“表名+mappe.xml”中定义的sql语句,其实就是一个statement.第二个参数就是sql语句需要传入的参数,也就是id

总结

以上所述是小编给大家介绍的MyBatis入门介绍,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!

 类似资料:
  • 1.1 ABP总体介绍 - 入门介绍 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称。 ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点,它旨在成为一个通用的WEB应用程序基础框架和项目模板。 ASP.NET Boilerplate 基于DDD的经典分层架构思想,实现了众多DDD的概念(但没有实现所

  • Spring Security是什么? Spring Security提供了基于Java EE的企业应用软件全面的安全服务。这里特别强调支持使用Spring框架构建的项目,Spring框架是企业软件开发Java EE方案的领导者 . 如果你还没有使用Spring来开发企业应用程序,我们热忱的鼓励你仔细的看一看。熟悉Spring特别是依赖注入原理将帮助你更快更方便的使用Spring Secirity

  • 欢迎阅读 “Rust 程序设计语言”,一本介绍 Rust 的书。Rust 是一门着眼于安全、速度和并发的编程语言。其程序设计兼顾底层语言的性能与控制,并不失高级语言强大的抽象能力。其特性适合那些有类 C 语言经验,正在寻找更安全的替代品的开发者;同样适合有着类 Python 语言背景,寻求在不牺牲表现力的前提下,编写更高性能代码的开发者。 本书的目标读者至少应了解一门其它编程语言。阅读本书之后,你

  • 英文原文:http://emberjs.com/guides/getting-started/index.html 欢迎来到Ember.js世界!本入门指南将使用Ember.js来创建一个简单的应用,并简单介绍整个框架背后的一些核心概念。阅读本指南需要熟悉一些基本的Web技术,比如Javascript、HTML、CSS和一些诸如浏览器Web审查器。 本入门指南采用非常流行的TodoMVC示例 应用

  • 1. 前言 大家好,从本小节开始,我们将一起学习MyBatis wiki系列。 MyBatis 是目前国内 Java 领域中使用最为广泛的持久化框架,它简单易用,却功能强大。 我们希望整理出 MyBatis “百分之二十”的知识,帮你办到“百分之八十”的事情,当然这里的知识远非百分之二十。 作为 MyBatis 系列的第一小节,我们将为你简单的介绍什么是 MyBatis,MyBatis 能做什么以

  • 本文向大家介绍Mercurial入门学习介绍,包括了Mercurial入门学习介绍的使用技巧和注意事项,需要的朋友参考一下 Mercurail是一种分步式的版本控制器,和git类似,但是和传统的svn有着很大的区别,可以参与这个讨论:Mercurial vs Subversion 安装 Ubuntu 1. 下载源代码[http://mercurial.selenic.com/wiki/Downlo