`
dyy_gusi
  • 浏览: 207231 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Mybatis初探

阅读更多

 一、了解什么是Mybatis

      MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。用xml文件构建SqlSessionFactory实例是非常简单的事情。推荐在这个配置中使用类路径资源 (classpath resource),但你可以使用任何Reader实例,包括用文件路径或file://开头的url创建的实例。MyBatis有一个实用类 ----Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。

 二、前期准备

下载jar包或者使用maven加入依赖,如果使用maven,可加入以下依赖:

<dependency>

	<groupId>org.mybatis</groupId>

	<artifactId>mybatis</artifactId>

	<version>3.3.0</version>

</dependency>

 

三、配置整体Mybatis配置文件(Configuration.xml)

基本配置文件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>

<!-- 这些先暂时不用

  <settings>

    //有很多属性可以设置,比如是否使用自动生成的主键,等等。。。

    <setting name="useGeneratedKeys" value="false"/>

    <setting name="useColumnLabel" value="true"/>

  </settings>

 -->

<!--定义别名,方便别处引用,不是必须的-->

  <typeAliases>

    <typeAlias alias="UserAlias" type="com.gusi.demo.chat.pojo.User"/>

  </typeAliases>

 

  <!--设置数据库相关的连接信息等-->

  <environments default="development">

    <environment id="development">

      <transactionManager type="JDBC">

        <property name="" value=""/>

      </transactionManager>

      <dataSource type="UNPOOLED">

        <property name="driver" value="com.mysql.jdbc.Driver"/>

        <property name="url" value="jdbc:mysql://127.0.0.1:3306/autochat"/>

        <property name="username" value="root"/>

        <property name="password" value="root"/>

      </dataSource>

    </environment>

  </environments>

  <!--设置实体类的映射配置文件xml-->

  <mappers>

    <mapper resource="com/gusi/demo/chat/pojo/User.xml"/>

  </mappers>

</configuration>

  

四、书写实体类以及映射配置文件 User.java, User.xml)

User.java 省略

User.xml:

<!DOCTYPE mapper

    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

 

<mapper namespace="User">//命名空间,需要唯一

 

  <resultMap type="com.gusi.demo.chat.pojo.User" id="UserResult">//将查询结果映射成JavaBean

    <id column="id" jdbcType="INTEGER" property="id"/>//数据库中主键映射

    <result column="username" jdbcType="VARCHAR" property="username"/>//column表示sql查询返回的列名

    <result column="password" jdbcType="VARCHAR" property="password.encrypted"/>//property表示JavaBean中属性名

    <result column="administrator" jdbcType="BOOLEAN" property="administrator"/>//jdbcType表示数据库字段类型

  </resultMap>

 

//该语句通过命名空间和ID唯一标识,在java代码中调运该语句即可执行该语句对应的sql

//parameterType是参数类型,可以是基本类型,也可是JavaBean类型

//resultMap表示使用定义的哪个映射关系将结果集合转换为JavaBean

  <select id="find" parameterType="long" resultMap="UserResult">

   SELECT * FROM user WHERE id = #{id:INTEGER}

  </select>

 

//如果返回的是基本数据类型,就不用resultMap,直接使用resultType指定返回数据类型

  <select id="version" parameterType="long" resultType="int">

    SELECT version FROM user WHERE id = #{id,jdbcType=INTEGER}

  </select>

 

//如果没有返回结果,resultMap和resultType都不需要

  <delete id="delete" parameterType="com.gusi.demo.chat.pojo.User">

    DELETE FROM user WHERE id = #{id:INTEGER}

  </delete>

 

//在此可以使用别名,方便书写,比如下面的UserAlise是在整体的配置文件中声明的别名

  <insert id="insert" parameterType="UserAlias" useGeneratedKeys="false">

    INSERT INTO user

    ( id,

    username,

    password,

    administrator

    )

    VALUES

    ( #{id},

    #{username,jdbcType=VARCHAR},

    #{password.encrypted:VARCHAR},

    #{administrator,jdbcType=BOOLEAN}

    )

  </insert>

 

  <update id="update" parameterType="UserAlias">

    UPDATE user SET

    username = #{username,jdbcType=VARCHAR},

    password = #{password.encrypted,jdbcType=VARCHAR},

    administrator = #{administrator,jdbcType=BOOLEAN}

    WHERE

    id = #{id,jdbcType=INTEGER}

  </update>

 

  <!--   Unique constraint check -->

  <select id="isUniqueUsername" parameterType="map" resultType="boolean">

    SELECT (count(*) = 0)

    FROM user

    WHERE ((#{userId,jdbcType=BIGINT} IS NOT NULL AND id != #{userId,jdbcType=BIGINT}) OR #{userId,jdbcType=BIGINT} IS

    NULL)  <!-- other than me -->

    AND (username = #{username,jdbcType=VARCHAR})

  </select>

</mapper>

  

五、通过Mybatis获取的数据库的会话session

// 1通过配置文件获取数据库连接信息

InputStream inputStream = Resources.getResourceAsStream("Configuration.xml");

//创建SessionFactoryBuilder

SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();

//通过SessionFactoryBuilder获得SessionFactory

SqlSessionFactory sqlSessionFactory = builder.build(inputStream);

//通过SessionFactory获得session

SqlSession sqlSession = sqlSessionFactory.openSession();

 

  六、通过session,对数据库操作(编写dao类)
SqlSession sqlSession = sessionFactory.openSession();//获得session

List list = sqlSession.selectList("Namespace.sqlId", paramObj);//查询列表集合

Object obj = sqlSession.selectOne("Namespace.sqlId", paramObj);//查询一条记录

sqlSession.insert("Namespace.sqlId", paramObj);//插入记录

sqlSession.update("Namespace.sqlId", paramObj);//修改记录

sqlSession.delete("Namespace.sqlId", paramObj);//删除记录

sqlSession.commit();//默认事物是不提交的,需要手动自动提交

 

 七、编写测试
@Test

public void shouldInsertNestedPasswordFieldOfComplexType() throws Exception {

SqlSession sqlSession = sqlSessionFactory.openSession();

try {

  //Create User

  User user = new User();

  user.setId(500000L);

  user.setPassword(new EncryptedString("secret"));

  user.setUsername("johnny" + Calendar.getInstance().getTimeInMillis());//random

  user.setAdministrator(true);

  sqlSession.insert("User.insert", user);

  //Retrieve User

  user = (User) sqlSession.selectOne("User.find", user.getId());

  assertNotNull(user.getId());

  sqlSession.rollback();

} finally {

  sqlSession.close();

}

}

 

    到此基本流程完毕!接下来重点说明配置文件User.xml等

 

 

配置文件xml详细解释:

    整个框架的核心就是实体映射配置文件xxx.xml(User.xml)文件中。通过配置该文件,实现数据库中的数据和JavaBean的交互(读写)。每一个和数据库交互的语句都被放在一个selectinsertupdatedelete标签内。每个这样的标签有一个唯一标识,java代码就是通过该唯一标识去执行特定的语句,比如上面的sqlSession.selectList("Namespace.sqlId",parameObj)中的“NameSapce.sqlId”就是一条sql语句的唯一标识。标签内的语句可以接受java代码传递的参数,比如上面parameObj就是传递和接收的参数,该参数可以是具体的java基本类型和String类型,也可以是复杂的对象类型或者集合类型,如果是基本类型或者String类型那么在配置文件中通过#{_parameter}获取,如果是集合类型那么在配置文件中通过#{list}获取,如果是复杂对象类型那么在配置文件中通过#{objattribute}直接获取。然后根据条件以及接收的参数动态拼装sql,动态拼装sql的时候,会使用的ognl表达式一个各种条件标签如<if><foreach><where><set><trim>等标签。通过上面一系列的操作,最终会得到一个sql语句,Mybatis执行该sql语句以后如果有返回结果,返回结果是基本类型就直接用returnType限定,如果是复杂类型或者集合类型,就通过returnMap转换,然后将转化的结果返回给java代码中的调运结果。整个流程简单总结就是:参数映射->sql解析->sql执行->结果映射,对于数据写入和读取都是同样流程。


 

配置文件xml标签总结:

标签类型

标签

说明

定义sql语句

select

查询语句

 

insert

插入语句

 

update

更新语句

 

delete

删除语句

结果映射

resultMap

结果集合和javaBean映射配置

 

collection

一对多中多方集合映射

 

association

多对一中一放对象映射

动态sql拼接

if

条件标签

 

choose/when/otherwise

条件选择标签

 

foreach

循环迭代标签

格式化输出

where

查询时候快捷拼接条件

 

set

更新时候快捷拼接值

 

trim

指定前缀后缀等,可达到where/set效果

常量定义使用

sql

定义一段常量

常量引用使用

include

引用一段常量

 
配置文件xml中易错点总结:

resultMap

结果集合映射到JavaBean中,返回的结果是JavaBean

resultType

结果返回的是一个Java基础类型或者String类型,不需要映射

parameterMap

请求参数的JavaBean映射,不推荐使用

parameterType

定义请求参数的class类型,可以是JavaBean类型,也可以是基础java类型或者String

#{}/${}

#{}表示的是问好(?)占位符,更常用。${}表示的是直接用参数代替,不会加引号,一般在排序的时候可能会用到。

#{}/ognl内容取值

简单类型参数用#{_parameter},集合类型用#{list},JavaBean类型直接用#{attribute}

    到此,Mybatis已经基本能完成日常使用,但是一个优秀的ORM框架怎么可能只有这么点东西?

 

2
1
分享到:
评论

相关推荐

    spring+mybatis初探

    NULL 博文链接:https://cdxs2.iteye.com/blog/1974942

    springmvc+mybatis初探

    NULL 博文链接:https://cdxs2.iteye.com/blog/1975789

    mybatis-spring-boot-starter初探 代码.zip

    关于mybatis的spring boot可执行代码,对应的解说博客地址在:https://blog.csdn.net/heidashou/article/details/105812796,含有全过程截图和解说。

    mybatisStudyRecords:记录自己学习mybatis的代码

    mybatisStudyRecords 记录自己学习mybatis的代码 code1教程MyBatis学习(一)之初探MyBatis大体结构与简单实现:

    MyBatisCN:《通用通用阅读指导书——MyBatis源码详解》配套注释版

    在本书的在阅读MyBatis源码的过程中,本书使用了运行初探,模块归类,合理猜测,类比阅读,网格阅读等多种原始码阅读方法,逐步这些原始码阅读方法进行了进一步的总结整理。 本书适合架构师,程序员提升自己的源码...

    初探微服务与Spring Boot

    快速搭建一个spring案例, 手把手教你使用SpringBoot搭建一个增删改查的小项目,里面还用到了idea的Mybatis-Generator的插件。

    springboot项目整合.zip

    第七篇:整合Mybatis] 第八篇:通用Mapper与分页插件的集成] 第九篇:整合Lettuce Redis] 第十篇:使用Spring Cache集成Redis] 第十一篇:集成Swagger在线调试] 第十二篇:初探RabbitMQ消息队列] 第十...

    C# 通过反射初探ORM框架的实现原理(详解)

    以前学的Java进行开发,多用到Mybatis,Hiberante等ORM框架,最近需要上手一个C#的项目,由于不是特别难,也不想再去学习C#的ORM框架,所以就想着用反射简单的实现一下ORM框架的内容,简单的增删改查,没有用到多表...

    Java Springboot学习资料.rar

    整合Mybatis 通用Mapper与分页插件的集成 整合Lettuce Redis 使用Spring Cache集成Redis 集成Swagger在线调试 初探RabbitMQ消息队列 RabbitMQ延迟队列 actuator 服务监控与管理 actuator与spring-boot-admin 定时...

Global site tag (gtag.js) - Google Analytics