美文网首页我爱编程
一起来学习Mybatis:第一篇

一起来学习Mybatis:第一篇

作者: __y | 来源:发表于2018-05-25 15:11 被阅读148次

    1.Mybatis的基本概念

    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis可以使用简单的 XML或注解来配置和映射原生信息,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。(官方说明)


    image.png

    简单的来说就是对JDBC封装的框架,减少开发过程中的繁杂的劳动,灵活得获取数据库的信息。简而言之就是偷懒。

    2.为什么要用Mybatis

    • 行业需要
    • 支持原生的sql,处理复杂业务的时候比hibernate方便
    • 相对学习成本低

    3.Mybatis入门

    开发所需要的jar包:

    • mybatis-3.1.1.jar
    • commons-logging-1.1.1.jar
    • log4j-1.2.16.jar
    • cglib-2.2.2.jar
    • asm-3.3.1.jar

    1.创建数据表

    CREATE TABLE `message` (
      `ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
      `COMMAND` varchar(16) DEFAULT NULL COMMENT '指令名称',
      `DESCRIPTION` varchar(32) DEFAULT NULL COMMENT '描述',
      `CONTENT` varchar(2048) DEFAULT NULL COMMENT '内容',
      PRIMARY KEY (`ID`)
    ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
    --插入数据
    INSERT INTO `message` VALUES (1, '查看', '精彩内容', '精彩内容');
    INSERT INTO `message` VALUES (2, '段子', '精彩段子', '如果你的月薪是3000块钱,请记得分成五份,一份用来买书,一份给家人,一份给女朋友买化妆品和衣服,一份请朋友们吃饭,一份作为同事的各种婚丧嫁娶的份子钱。剩下的2999块钱藏起来,不要告诉任何人');
    INSERT INTO `message` VALUES (3, '新闻', '今日头条', '7月17日,马来西亚一架载有298人的777客机在乌克兰靠近俄罗斯边界坠毁。另据国际文传电讯社消息,坠毁机型为一架波音777客机,机载约280名乘客和15个机组人员。\r\n乌克兰空管部门随后证实马航MH17航班坠毁。乌克兰内政部幕僚表示,这一航班在顿涅茨克地区上空被击落。马来西亚航空公司确认,该公司从阿姆斯特丹飞往吉隆坡的MH17航班失联,并称最后与该客机取得联系的地点在乌克兰上空。图为马航客机坠毁现场。');
    INSERT INTO `message` VALUES (4, '娱乐', '娱乐新闻', '昨日,邓超在微博分享了自己和孙俪的书法。夫妻同样写幸福,但差距很大。邓超自己都忍不住感慨字丑:左边媳妇写的。右边是我写的。看完我再也不幸福了。');
    INSERT INTO `message` VALUES (5, '电影', '近日上映大片', '《忍者神龟》[2]真人电影由美国派拉蒙影业发行,《洛杉矶之战》导演乔纳森·里贝斯曼执导。 \r\n片中四只神龟和老鼠老师都基于漫画和卡通重新绘制,由动作捕捉技术实现。\r\n其中皮特·普劳泽克饰演达芬奇(武器:武士刀),诺尔·费舍饰演米开朗基罗(武器:双节棍),阿伦·瑞奇森饰演拉斐尔(武器:铁叉),杰瑞米·霍华德饰演多拉泰罗(武器:武士棍)。\r\n该片计划于2014年8月8日在北美上映。');
    INSERT INTO `message` VALUES (6, '彩票', '中奖号码', '查啥呀查,你不会中奖的!');
    

    2.创建实体类

    public class Message {
        private Integer id;
        private String command;
        private String description;
        private String content;
    //对应的get,set方法
    }
    

    3.配置文件的基本设置

    <environments default="development">
        <environment id="development">
          <!--使用jdbc事务管理模式-->
          <transactionManager type="JDBC">
            <property name="" value=""/>
          </transactionManager>
          <!--使用连接池的方式获取数据库的连接-->
          <dataSource type="POOLED">
            <property name="driver" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
            <property name="username" value="root"/>
            <property name="password" value="12345"/>
          </dataSource>
        </environment>
      </environments>
    

    4.写一个类测试能不能连接成功

    public class DBUtil {
    
        public static SqlSession getSqlSession() {
    
            try {
                // 通过配置文件获取数据库连接信息
                Reader reader = Resources.getResourceAsReader("com/mybatis/config/Configuration.xml");
                // 通过配置信息构建一个SqlSessionFactory
                SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
                SqlSession sqlSession = sqlSessionFactory.openSession();
                return  sqlSession;
            }
            catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public static void main(String[] args) {
            //测试是否连接成功呢
            Connection conn = DBUtil.getSqlSession().getConnection();
            System.out.println(conn != null ? "连接成功" : "连接失败");
        }
    }
    
    image.png

    5.在mapper中配置查询的映射

    创建一个Message.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">
    <!--namespace:命名空间 唯一-->
    <mapper namespace="Message">
        <!--
        relultMap :和实体类的映射
        id:唯一的标识,执行查询语句的时候做关联
        type:实体类的路径
        -->
        <resultMap type="com.mybatis.entity.Message" id="MessageResult">
            <!--
            id:主键属性
            column:字段名称
            property:实体类的名称
            -->
            <id column="ID" jdbcType="INTEGER" property="id"/>
            <result column="COMMAND" jdbcType="VARCHAR" property="command"/>
            <result column="DESCRIPTION" jdbcType="VARCHAR" property="description"/>
            <result column="CONTENT" jdbcType="VARCHAR" property="content"/>
        </resultMap>
    
        <select id="queryMessageList" parameterType="com.mybatis.entity.Message" resultMap="MessageResult">
        SELECT ID,COMMAND,DESCRIPTION,CONTENT FROM  message WHERE  1=1
        </select>
        
    </mapper>
    

    咱们在这里配置后也要在mybatis的配置文件那加点东西

    <mappers>
        <mapper resource="com/mybatis/sqlxml/Message.xml"/>
      </mappers>
    

    好了在来测试一下:

    package com.mybatis.dao;
    
    import com.mybatis.db.DBUtil;
    import com.mybatis.entity.Message;
    import org.apache.ibatis.session.SqlSession;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 连接数据库获取Message表的数据
     */
    public class MessageDao {
        public List<Message> queryMessageList (String command, String description) {
            //获得数据库的sqlsession,通过sqlsess进行数据库的操作
            SqlSession sqlSession = DBUtil.getSqlSession();
            List<Message> messageList;
            messageList = sqlSession.selectList("queryMessageList");
            sqlSession.close();
            return  messageList;
        }
    
        public static void main(String[] args) {
            MessageDao md = new MessageDao();
            List<Message> list = md.queryMessageList(null,null);
            for (Message message : list) {
                System.out.println(message.getCommand());
            }
        }
    }
    
    
    image.png
    image.png

    看!数据都出来啦

    总结Mybatis的工作流程(敲黑板!):

    1.通过创建reader对象读取Mybatis的映射配置文件
    2.通过SqlSessionFactoryBuilder对象获得SqlSession对像
    3.获取SqlSession
    4.事务默认开启
    5.通过SqlSession读取映射文件(上文中的Message.xml)中的操作编号,执行sql语句
    6.提交事务
    7.关闭资源

    6.动态SQL

    上面都是静态的,要是用户想输入条件进行模糊查询呢?来,一起看怎么操作!
    在操作之前先介绍一下在mygatis上的OGNL(具体介绍百度);


    image.png image.png

    另外还要再介绍一下log4J框架:
    我们知道我们在xml中写SQL的时候无法调试的,连出错都不知道是什么原因;这个时候我们就要在我们的项目上加上这个框架,就可以在控制台看输出了。具体配置
    导包,创建log4j.properties文件。文件的配置如下

    log4j.rootLogger=DEBUG,Console
    log4j.appender.Console=org.apache.log4j.ConsoleAppender
    log4j.appender.Console.layout=org.apache.log4j.PatternLayout
    log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
    log4j.logger.org.apache=INFO
    

    效果图:


    image.png

    好了进入正题:
    首先我们看一下改造以后的动态sql

       <!--
        parameterType :传入的变量类型
        -->
        <select id="queryMessageList" parameterType="com.mybatis.entity.Message" resultMap="MessageResult">
            select ID,COMMAND,DESCRIPTION,CONTENT from MESSAGE
            <where>
                <if test="command != null and !&quot;&quot;.equals(command.trim())">
                    and COMMAND like '%' #{command} '%'
                </if>
                <if test="description != null and !&quot;&quot;.equals(description.trim())">
                    and DESCRIPTION like '%' #{description} '%'
                </if>
            </where>
    
        </select>
    

    我们可以看到传进来的参数是Message的对象类型,里面封装了传进来的条件包含了command和description数据。这个时候提一下:我们可以看到test中的判断条件有一些类似java中的方法。没错,这就是OGNL的强大之处,可以调用对象的方法,这给我们提供了很大的便利!
    DAO层:

       //获得数据库的sqlsession,通过sqlsess进行数据库的操作
            SqlSession sqlSession = DBUtil.getSqlSession();
            List<Message> messageList;
            //调用Message.xml中的queryMessageList查询
            messageList = sqlSession.selectList("Message.queryMessageList",message);
            sqlSession.close();
            return  messageList;
    

    7.删除(单条和批量)

    单条删除:
    XML配置

    <delete id="deleteOne" parameterType="int">
            delete from message where id = #{_parameter}
        </delete>
    

    DAO:

        public void deleteOne(Integer id) {
            SqlSession sqlSession = DBUtil.getSqlSession();
            sqlSession.delete("Message,deleteOne",id);
            //提交事务
            sqlSession.commit();
            sqlSession.close();
    
        }
    

    测试类调用后的结果:


    image.png
    image.png

    批量删除:

     public void deleteBath(List<Integer> ids) {
            SqlSession sqlSession = DBUtil.getSqlSession();
            sqlSession.delete("Message.deleteBath",ids);
            //提交事务
            sqlSession.commit();
            sqlSession.close();
    
        }
    

    XML:

      <delete id="deleteBath" parameterType="java.util.List">
            delete from message where id in (
                <foreach collection="list" item="item" separator=",">
                    #{item}
                </foreach>
            )
        </delete>
      
    
    image.png
    image.png

    8.增加

    public void inertOne(Message message) {
            SqlSession sqlSession = DBUtil.getSqlSession();
            sqlSession.insert("Message.insertOne",message);
            //提交事务
            sqlSession.commit();
            sqlSession.close();
    
        }
    

    XML:

     <insert id="insertOne"  parameterType="com.mybatis.entity.Message">
            insert into message(id,command,description,content) values (#{id},#{command},#{description},#{content})
        </insert>
    

    结果:


    image.png

    9.更新

     public void updateOne(Message message) {
            SqlSession sqlSession = DBUtil.getSqlSession();
            sqlSession.update("Message.updateOne",message);
            //提交事务
            sqlSession.commit();
            sqlSession.close();
        }
    

    XML:

    <update id="updateOne" parameterType="com.mybatis.entity.Message">
            update message set command = #{command} , description = #{description} ,content = #{content}
            where id = #{id}
        </update>
    

    结果:


    image.png

    相关文章

      网友评论

        本文标题:一起来学习Mybatis:第一篇

        本文链接:https://www.haomeiwen.com/subject/aflkjftx.html