MyBatis 上【持久化框架】

这篇文章我们学习一下Mybatis,希望大家提出宝贵的建议。

一:什么是Mybatis?

MyBatis 是一个基于Java的持久层框架。它提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。
MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJO(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder从一个xml配置文件或者一个预定义的配置类的实例获得配置信息。

二:Mybatis的运行流程与原理?

我更喜欢用自己的图来表达Mybatis的整个的执行流程。如下图所示:
a.流程图

图片1.png

b.原理详解:

MyBatis应用程序根据XML配置文件创建SqlSessionFactory,
SqlSessionFactory在根据配置,配置来源于两个地方,一处是配置文件,一处是Java代码的注解,获取一个SqlSession。SqlSession包含了执行sql所需要的所有方法,可以通过SqlSession实例直接运行映射的sql语句,完成对数据的增删改查和事务提交等,用完之后关闭SqlSession。

c.mybatis配置详解

1、SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
2、 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
3、 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
4、 mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
5、 Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
6、 Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过 Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
7、 Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过 Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
8、Sqlsession:对应着一次数据库会话。由于数据库回话不是永久的,因此Sqlsession的生命周期也不应该是永久的,相反,在你每次访问数据库时都需要创建它(当然并不是说在Sqlsession里只能执行一次sql,你可以执行多次,当一旦关闭了Sqlsession就需要重新创建它)。创建Sqlsession的地方只有一个,那就是SqlsessionFactory的openSession方法。

三:案例演示

例1:
1、创建User.java

private Integer id;//主键
private String username;//用户名
private String password;//密码
private String email;//邮箱
private String mobile;//手机号
private Integer age;//年龄
private String birth;//出生日期
(set,get 方法省略...........)

2、SqlMapConfig.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>
    <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://127.0.0.1:3306/test" />
            <property name="username" value="root"/>
            <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
      <mapper resource="User.xml"/>
    </mappers>
 </configuration>

3、User.xml

<?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="User">
    <!-- 按id号查询用户信息 -->
    <!-- 
       id就是statement的id
        parameterType:输入参数的数据类型
        resultType:输出参数的类型
       #{}写什么。。如果是基本类型,可以统一用value
     -->
    <select id="queryById" parameterType="int" resultType="com.aiyin.mybatis01.entity.User">
       select * from user where id=#{value}
    </select>
    <!-- 查询名字有“五”字的用户信息 -->
    <select id="queryByUserName" parameterType="java.lang.String" resultType="com.aiyin.mybatis01.entity.User">
        SELECT * FROM USER WHERE username like '%${value}%'
    </select>
</mapper>

4、Test.java

public class TestMyBatis {

    @Test
    public void queryById() {

        // 使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
        InputStream is = TestMyBatis.class.getClassLoader()
                .getResourceAsStream("SqlMapConfig.xml");
        // 构建sqlSession的工厂SqlSessionFactory 
        SqlSessionFactoryBuilder sessionFactory = new SqlSessionFactoryBuilder();
        SqlSessionFactory sf = sessionFactory.build(is);
        // 先获取SqlSession
        SqlSession session = sf.openSession();
        // 执行查询返回一个唯一user对象的sql
        /**
         * 映射sql的标识字符串, User是User.xml文件中mapper标签的namespace属性的值,
         * queryById是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
         */
        User user = session.selectOne("User.queryById", 1);
        System.out.println(user);
    }
    
    @Test
    public void queryByUserName() {

        // 使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
        InputStream is = TestMyBatis.class.getClassLoader()
                .getResourceAsStream("SqlMapConfig.xml");
        // 构建sqlSession的工厂
        SqlSessionFactoryBuilder sessionFactory = new SqlSessionFactoryBuilder();
        SqlSessionFactory sf = sessionFactory.build(is);
        // 先获取SqlSession
        SqlSession session = sf.openSession();
        // 执行查询返回一个唯一user对象的sql
        /**
         * 映射sql的标识字符串, User是User.xml文件中mapper标签的namespace属性的值,
         * queryById是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
         */
        List<User> userList = session.selectList("User.queryByUserName","刘");
        System.out.println(userList);
    }

queryById()方法即可查询出数据库User表中Id为1 的用户信息。
queryByUserName()方法查询出User表中姓名含有“刘”字的所有用户信息。

一个小属性
typeAiases(类型别名)

   <!-- 
           批量定义别名
           name是全路径名
           别名必须是类名(可以首字母小写)
-->
<!--<typeAlias type="com.aiyin.mybatis01.entity.User" alias="user"/> -->
    批量指定别名 <package name="com.aiyin.mybatis.entity"/>
   </typeAliases>
resultType="com.aiyin.mybatis01.entity.User"------>resultType="user"

例二:拓展带入if where等标签

<sql id="queryAllInfo">
       select id,username,password,email,mobile,age,birth from user
    </sql>
    <!-- 查询年龄大于20,名字有'强'字的用户信息
      ongl找到对应的User类中的属性 -->
      <select id="queryByAge" parameterType="user" resultType="user">
      <include refid="queryAllInfo"></include>
        where age>#{age} and username like '%${username}%'
      </select>

@Test
    public void queryByAge(){
        SqlSession sqlSession=TestMyBatis2.newInstance();
        User user=new User();
        user.setAge(25);
        user.setUsername("强");
        List<Regist> list= sqlSession.selectList("User.queryByAge",user);
        log.debug(list);
    }

下次详解:基于Mapping映射的Dao开发

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容