一 Mybatis概述&与Hibernate的区别&CRUD

Posted  Island

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一 Mybatis概述&与Hibernate的区别&CRUD相关的知识,希望对你有一定的参考价值。

 

Mybatis是类似Hibernate的ORM持久层框架

 

为什么学习Mybatis?

  1.  是目前国内主流的持久层框架,面向sql(相较于Hibernate,Mybatis一定要用sql)
  2.  Hibernate学习门槛不低,要精通门槛更高(在于如何设计O/R映射,性能和对象模型之间取得平衡,怎样用好Hibernate缓存与数据加载策略)
  3.  sql优化方面,Hibernate的查询会将表中的所有字段查询出来,会有性能消耗。如果自己写sql语句进行查询,则破坏了Hibernate开发的简洁性。如果有个查询要关联多张表,比如5张表,10张表,而我们只取其中几张表的部分字段,这时用Hibernate就会显得非常力不从心,后续维护也令人发狂。

 

JDBC存在的问题

1 频繁的创建和打开,关闭数据库,太消耗资源

2 sql语句存在硬编码,不利于维护

3 sql参数设置硬编码,不利于维护

4 结果集获取与遍历复杂,存在硬编码,不利于维护,期望能够查询后返回一个java对象

 

Mybatis介绍:

Mybatis本是Apache的一个开源项目iBatis.是面向sql的持久层框架,对jdbc进行了封装。

开发中,可以只专注于sql语句本身的拼装,其他复杂过程交给MyBatis完成

 

 

MyBatis入门:

  • 根据用户ID查询用户信息
  • 根据用户名查找用户列表
  • 添加用户
  • 修改用户
  • 删除用户

 

工程搭建:

  1. 导入依赖jar包
  2. 配置SqlMapConfig.xml
  3. 配置log4j.properties
  4. pojo
  5. 配置sql查询映射文件
  6. 加载映射文件

包结构:config为Source文件,与src相同

 

导入依赖jar包

 

配置SqlMapConfig.xml映射文件,映射加载:项目名/文件名 , 默认在config文件下,mybatis包下加载

 

 

配置log4j.properties,输出到控制台

 

 

pojo:与Hibernate的domain相同,提供属性的getset方法

 

配置sql查询映射文件  user.xml , namesapce:命名空间, select  id   等  见下图

 

 

 

 

 

 

根据用户ID查询用户信息:

  1. 编写sql语句
  2. 配置关系映射
  3. 单元测试

 

 

根据用户名查找用户列表

  1. 编写sql语句
  2. 配置关系映射
  3. 单元测试

方式一:手动在sql语句里面设置查询,#{name}

方式二:直接在user.xml中设置,${}是字符串拼接指令,如果入参为普通数据类型,括号内只能写value

一:

映射:

单元测试:

 二:${}是字符串拼接指令,如果入参为普通数据类型,括号内只能写value

 单元测试:

 

 

 

添加用户

映射:

单元测试:如果不想手动提交事务,设置openSession(true)

 

添加用户返回主键:

方式一:

 

方式二:方式1的简写,使用自增,底层调用函数

 

 

添加并返回uuid:方式二覆盖方式一,不返回id,返回uuid2。后设置覆盖前设置

 

修改和删除操作:

配置:

 

测试:

 

 

/MyBatis/config/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>
    <!-- 和spring整合后 environments配置将废除 -->
    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事务管理 -->
            <transactionManager type="JDBC" />
            <!-- 数据库连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url"
                    value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
                <property name="username" value="root" />
                <property name="password" value="fungsumyuet" />
            </dataSource>
        </environment>
    </environments>
    
    <!-- 加载映射文件 -->
    <mappers>
       <mapper resource="MyBatis/user.xml" />
    </mappers>
</configuration>

 

/MyBatis/config/mybatis/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">

<!-- namespace:命名空间,用于隔离sql语句,后继有重要作用 #{}:占位符,相当于jdbc的?? -->
<mapper namespace="user">

    <!-- id:sql id, 语句的唯一标识 parameterType:入参数据类型 resultType:返回结果的数据类型 -->
    <select id="getUserById" parameterType="int" resultType="com.mybatis.pojo.User">
        SELECT *
        FROM `user` WHERE id = #{id2};
    </select>

    <!-- 模糊查询用户,结果为集合,设置resultType为pojo路径即可 -->
    <select id="getUserByUserName" parameterType="String"
        resultType="com.mybatis.pojo.User">
        SELECT
        `id`,
        `username`,
        `birthday`,
        `sex`,
        `address`
        FROM
        `user`
        <!-- WHERE username LIKE #{name}; -->
        WHERE username LIKE \'%${value}%\';
    </select>

    <!-- 插入用户,如果用户id为自增,则删去id.入参为user pojo -->
    <insert id="insertUser" parameterType="com.mybatis.pojo.User" useGeneratedKeys="true" keyProperty="id" >
    <!-- 
       selectKey:主键返回
       keyProperty:user中的主键属性
       resultType:主键的数据类型
       order:指定selectKey何时执行(在插入语句之前还是之后设置属性) 
     -->
    <!-- <selectKey keyProperty="id" resultType="int" order="AFTER">
         SELECT LAST_INSERT_ID();
    </selectKey> -->
    <!-- 设置uuid -->
    <selectKey keyProperty="uuid2" order="AFTER">
        SELECT UUID();
    </selectKey>
        INSERT INTO `user` (
        `username`,
        `birthday`,
        `sex`,
        `address`
        `uuid2`
        )
        VALUES
        (
        #{username},
        #{birthday},
        #{sex},
        #{address}
        #{uuid2}
        );
    </insert>

    <!-- 插入用户,同时配置,后配置的生效,主键为null,返回的是uuid, -->
    <insert id="insertUserUuid" parameterType="com.mybatis.pojo.User" useGeneratedKeys="true" keyProperty="id" >
    <!-- 
       selectKey:主键返回
       keyProperty:user中的主键属性
       resultType:主键的数据类型
       order:指定selectKey何时执行(在插入语句之前还是之后设置属性) 
     -->
    <!-- <selectKey keyProperty="id" resultType="int" order="AFTER">
         SELECT LAST_INSERT_ID();
    </selectKey> -->
    <!-- 设置uuid -->
    <selectKey keyProperty="uuid2" resultType="string" order="AFTER">
        SELECT UUID();
    </selectKey>
        INSERT INTO `user` (
        `username`,
        `birthday`,
        `sex`,
        `address`,
        `uuid2`)
        VALUES
        (#{username},
        #{birthday},
        #{sex},
        #{address},
        #{uuid2});
    </insert>
    
    <!-- 修改用户 -->
     <update id="updateUser" parameterType="com.mybatis.pojo.User" >
       UPDATE  `user`  SET `username` = #{username}  WHERE `id` = #{id};
    </update>
    
    <!-- 删除用户 -->
    <delete id="deleteUser" parameterType="int">
        delete from `user` where `id` = #{id}
    </delete>

</mapper>

 

/MyBatis/src/com/mybatis/test/MybatisTest.java

package com.mybatis.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import com.mybatis.pojo.User;
import com.mybatis.utils.SqlSessionFactoryUtils;

public class MybatisTest {  
    @Test
    //根据id查询对象
    public void testGetUserById() throws IOException{        
        //创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
        //创建核心配置文件输入流,Mybatis自带Resources方法加载配置
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        //通过输入流创建sqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = ssfb.build(inputStream);
        //创建sqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行查询,参数1:sql id , 参数2:入参
        User user = sqlSession.selectOne("user.getUserById", 1);
        //打印结果
        System.out.println(user);
        //释放资源
        sqlSession.close();        
    }

    @Test
    //根据username查询对象
    public void testgetUserByUserName() throws IOException{        
        //创建SqlSessionFactory对象,加载配置
        SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
        //创建sqlSession对象,打开会话
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行查询,参数1:sql id , 参数2:入参
//        List<User> list = sqlSession.selectList("user.getUserByUserName", "%张%");
        //方式二
        List<User> list = sqlSession.selectList("user.getUserByUserName", "%张%");
        //打印结果
        for (User user : list) {
            System.out.println(user);
        }
        //释放资源
        sqlSession.close();        
    }
    
    @Test
    //插入测试,返回主键
    public void testinsertUser() throws IOException{
        //创建sqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
        //打开会话
        SqlSession sqlSession = sqlSessionFactory.openSession();
        User user = new User();
        user.setUsername("插入测试");
        user.setSex("1");
        user.setBirthday(new Date());
        user.setAddress("河南郑州");
        //执行插入
        sqlSession.insert("user.insertUser",user);
        System.out.println(user);
        //提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();
    }
    
    @Test
    //插入测试,返回uuid
    public void testinsertUserUuid() throws IOException{
        //创建sqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
        //打开会话
        SqlSession sqlSession = sqlSessionFactory.openSession();
        User user = new User();
        user.setUsername("插入测试");
        user.setSex("1");
        user.setBirthday(new Date());
        user.setAddress("河南郑州");
        //执行插入
        sqlSession.insert("user.insertUserUuid",user);
        System.out.println(user);
        //提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();
    }
    
    @Test
    //修改用户
    public void testupdateUser(){
        SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
        SqlSession sqlSession = sqlSessionFactory.openSession();
        User user = new User();
        user.setId(32);
        user.setUsername("修改测试");
        sqlSession.update("user.updateUser", user);
        System.out.println(user);
        sqlSession.commit();
        sqlSession.close();
    }
    
    @Test
    //删除用户
    public void testdeleteUser(){    
        SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
        SqlSession sqlSession = sqlSessionFactory.openSession();
        sqlSession.delete("user.deleteUser", 28);
        sqlSession.commit();
        sqlSession.close();
    }
    
    
}

 

以上是关于一 Mybatis概述&与Hibernate的区别&CRUD的主要内容,如果未能解决你的问题,请参考以下文章

mybatis与hibernate对比

HIBERNATE与 MYBATIS的对比

HIBERNATE与 MYBATIS的对比

Mybatis与Hibernate的详细对比

实际开发mybatis都是使用自动生成的sql么

Mybatis从入门到精通系列 12——Mybatis 的一级缓存与二级缓存