我爱编程

一起来学习Mybatis:第一篇

2018-05-25  本文已影响148人  __y

1.Mybatis的基本概念

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


image.png

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

2.为什么要用Mybatis

3.Mybatis入门

开发所需要的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
上一篇下一篇

猜你喜欢

热点阅读