ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Mybatis 区别-开发

2022-06-23 22:38:30  阅读:166  来源: 互联网

标签:Hibernate people 区别 People MyBatis 开发 Mybatis import public


三.MyBatis

主流的ORM 支持java .NET Ruby三种语言,MyBatis是对JDBC的封装

ORM框架Hibernate

区别:

1)sql 优化方面

  • Hibernate 使用 HQL(Hibernate Query Language)语句,独立于数据库。不需要编写大量的 SQL,就可以完全映射,但会多消耗性能,且开发人员不能自主的进行 SQL 性能优化。提供了日志、缓存、级联(级联比 MyBatis 强大)等特性。
  • MyBatis 需要手动编写 SQL,所以灵活多变。支持动态 SQL、处理列表、动态生成表名、支持存储过程。工作量相对较大。

2)开发方面

  • MyBatis 是一个半自动映射的框架,因为 MyBatis 需要手动匹配 POJO 和 SQL 的映射关系。
  • Hibernate 是一个全表映射的框架,只需提供 POJO 和映射关系即可。

3)缓存机制比较

  • Hibernate 的二级缓存配置在 SessionFactory 生成的配置文件中进行详细配置,然后再在具体的表-对象映射中配置缓存。
  • MyBatis 的二级缓存配置在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且 Mybatis 可以在命名空间中共享相同的缓存配置和实例,通过 Cache-ref 来实现。
  • Hibernate 对查询对象有着良好的管理机制,用户无需关心 SQL。所以在使用二级缓存时如果出现脏数据,系统会报出错误并提示。
  • 而 MyBatis 在这一方面,使用二级缓存时需要特别小心。如果不能完全确定数据更新操作的波及范围,避免 Cache 的盲目使用。否则脏数据的出现会给系统的正常运行带来很大的隐患。

4)Hibernate 优势

  • Hibernate 的 DAO 层开发比 MyBatis 简单,Mybatis 需要维护 SQL 和结果映射。
  • Hibernate 对对象的维护和缓存要比 MyBatis 好,对增删改查的对象的维护要方便。
  • Hibernate 数据库移植性很好,MyBatis 的数据库移植性不好,不同的数据库需要写不同 SQL。
  • Hibernate 有更好的二级缓存机制,可以使用第三方缓存。MyBatis 本身提供的缓存机制不佳。

5)Mybatis优势

  • MyBatis 可以进行更为细致的 SQL 优化,可以减少查询字段。
  • MyBatis 容易掌握,而 Hibernate 门槛较高。

6)应用场景

  • MyBatis 适合需求多变的互联网项目,例如电商项目、金融类型、旅游类、售票类项目等。
  • Hibernate 适合需求明确、业务固定的项目,例如 OA 项目、ERP 项目和 CRM 项目等。

总结:

总的来说,MyBatis 是一个小巧、方便、高效、简单、直接、半自动化的持久层框架,Hibernate 是一个强大、方便、高效、复杂、间接、全自动化的持久层框架。

开发

1.配置pom.xml

   <dependencies>
<!--        mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
<!--        mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.19</version>
        </dependency>
<!--        lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.10</version>
        </dependency>
    </dependencies>
<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </resource>
    </resources>
</build>

2.实体类:

package com.shouthwind.entity;

import lombok.Data;

@Data
public class People {
    private Integer Sno;
    private String Sname;
    private String Ssex;
    private Integer Sage;
    private String Sdept;
}

3.配置Mybatis的运行环境 config.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>
    <!-- 配置mybatis运行环境 -->
    <environments default="development">
    <environment id="development">
    <!-- 使用JDBC的事务管理 -->
    <transactionManager type="JDBC"/>
    <dataSource type="POOLED">
    <!-- MySQL数据库驱动 -->
    <property value="com.mysql.cj.jdbc.Driver" name="driver"/>
    <!-- 连接数据库的URL -->
    <property value="jdbc:mysql://localhost:3306/text?serverTimezone=UTC&amp;useUnicode=true&amp;characterEncoding=utf8" name="url"/>
    <property value="root" name="username"/>
    <property value="123456" name="password"/>
    </dataSource>
    </environment>
    </environments>
    <!-- 将mapper文件加入到配置文件中 -->
    <mappers>
    <mapper resource="com/shouthwind/Mapper/PeopleMapper.xml"/>
    </mappers>
</configuration>

4.Mabytatis开发:

  • 原生接口

  • Mapper代理实现自定义接口

    一:原生接口开发:

    1.Mapper文件

    <?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="com.shouthwind.Mapper.PeopleMapper">
        <select id="finBySno" parameterType="java.lang.Integer" resultType="com.shouthwind.entity.People">
            select *from student where  Sno=#{Sno}
        </select>
    </mapper>
    

    2.config.xml注册

        -<mappers>
        <mapper resource="com/shouthwind/Mapper/PeopleMapper.xml"/>
    </mappers>
    

    3.测试类:

    package com.shouthwind.Test;
    
    import com.shouthwind.entity.People;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    import java.io.InputStream;
    
    public class Test {
        public static void main(String[] args) {
            //加载配置文件
            InputStream inputStream =Test.class.getClassLoader().getResourceAsStream("config.xml");
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder =new SqlSessionFactoryBuilder();
            SqlSessionFactory sqlSessionFactory=  sqlSessionFactoryBuilder.build(inputStream);
            //获得sqlSession对象
            SqlSession sqlSession =sqlSessionFactory.openSession();
            //调用mybatis的原生接口
            String statement ="com.shouthwind.Mapper.PeopleMapper.finBySno";
            People people =sqlSession.selectOne(statement,1);
            System.out.println(people);
            sqlSession.close();
        }
    
    }
    

二.Mapper自定义的代理接口

开发者只需要定义接口不需要实现,具体的实现由Mapper代理实现

1.自定义接口

package com.shouthwind.repository;

import com.shouthwind.entity.People;

import java.util.List;

public interface UserRepository {
    public int save(People people);
    public int deleteById(Integer Sno);
    public  int update(People people);
    public People findById(Integer Sno);
    public List<People> findAll();
}

2.创建peopleMappertaining.xml

更据规则:

  • peopleMappertaining.xml中的namepsce为接口的全限定类目(带着包名的类名)
  • peopleMappertaining.xml中的statement的id必须接口中的方法名一致
  • peopleMappertaining.xml中的paramType和接口的对应方法的参数类型一致
  • peopleMappertaining.xml中的resultType和接口中的对应方法的返回值一致

1.mapper.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="com.shouthwind.repository.UserRepository">
    <insert id="save" parameterType="com.shouthwind.entity.People">
        insert into people(name,money) values(#{name},#{money})
    </insert>

    <delete id="deleteById" parameterType="java.lang.Integer">
        delete from people where  id=#{id}
    </delete>

    <update id="update" parameterType="com.shouthwind.entity.People">
        update people set name=#{name} ,money=#{money} where id=#{id}
    </update>

    <select id="findById" parameterType="java.lang.Integer" resultType="com.shouthwind.entity.People">
        select *from people where id=#{id}
    </select>

    <select id="findAll" resultType="com.shouthwind.entity.People">
         select *from people
    </select>
</mapper>

2.接口:

package com.shouthwind.repository;

import com.shouthwind.entity.People;

import java.util.List;

public interface UserRepository {
    public int save(People people);
    public int deleteById(Integer id);
    public  int update(People people);
    public People findById(Integer id);
    public List<People> findAll();
}

3.测试类

package com.shouthwind.Test;


import com.shouthwind.entity.People;
import com.shouthwind.repository.UserRepository;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;

public class Test2 {
    public static void main(String[] args) {
        InputStream inputStream =Test2.class.getClassLoader().getResourceAsStream("config.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder= new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory =sqlSessionFactoryBuilder.build(inputStream);
        SqlSession sqlSession=sqlSessionFactory.openSession();
        //获取实现了自定义代理接口的对象
        UserRepository userRepository=sqlSession.getMapper(UserRepository.class);
//        添加、修改、删除、查询
        People people =new People();
        people.setId(1);
        people.setName("小王");
        people.setMoney(999);
//        int row=userRepository.save(people);
        int row =userRepository.update(people);
        System.out.println(row);
//        People people=userRepository.findById(1);
//        System.out.println(people);
        //提交事物
        sqlSession.commit();
        sqlSession.close();
    }


}

标签:Hibernate,people,区别,People,MyBatis,开发,Mybatis,import,public
来源: https://www.cnblogs.com/HJZ114152/p/16406962.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有