Mybatis教程

MyBatis

介绍

简介

  • MyBatis 是一款优秀的持久层框架(也叫ORM框架)
  • MyBatis 极大简化 JDBC 操作
  • MyBatis 通过简单的XML或注解来操作数据源

Hibernate 和 MyBatis 的区别

截取于http://c.biancheng.net/view/4302.html

1)sql 优化方面
  • Hibernate 不需要编写大量的 SQL,就可以完全映射,提供了日志、缓存、级联(级联比 MyBatis 强大)等特性,此外还提供 HQL(Hibernate Query Language)对 POJO 进行操作。但会多消耗性能。
  • MyBatis 手动编写 SQL,支持动态 SQL、处理列表、动态生成表名、支持存储过程。工作量相对大些。
2)开发方面
  • MyBatis 是一个半自动映射的框架,因为 MyBatis 需要手动匹配 POJO、SQL 和映射关系。
  • Hibernate 是一个全表映射的框架,只需提供 POJO 和映射关系即可。
3)Hibernate 优势
  • Hibernate 的 DAO 层开发比 MyBatis 简单,Mybatis 需要维护 SQL 和结果映射。
  • Hibernate 对对象的维护和缓存要比 MyBatis 好,对增删改查的对象的维护要方便。
  • Hibernate 数据库移植性很好,MyBatis 的数据库移植性不好,不同的数据库需要写不同 SQL。
  • Hibernate 有更好的二级缓存机制,可以使用第三方缓存。MyBatis 本身提供的缓存机制不佳。
4)Mybatis优势
  • MyBatis 可以进行更为细致的 SQL 优化,可以减少查询字段。
  • MyBatis 容易掌握,而 Hibernate 门槛较高。

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

第一个MyBatis(基于Spring)

过程不懂可以查看官方文档

结构图如下:
在这里插入图片描述

依赖

1. mybatis 依赖包 (mybatis框架)
2. mysql 依赖包(连接mysql使用)
3. log4j 依赖包(日志查看用)
4. junit 依赖包(做测试类用)

# 自行在maven仓库查找
https://mvnrepository.com/search?q=sharding-transaction-spring-boot-starter

配置文件

文件名称任意

<!--
	配置jdbc连接 和 Mapper.xml(编写SQL的文件)
-->

<?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">
           <!--JDBC连接语句对应的键值-->
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/word"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
         <!--声明(注册)Mapper.xml文件-->
      <!-- resource 文件路径 -->
    <mapper resource="org/mybatis/example/BlogMapper.xml"/>
  </mappers>
</configuration>

Mapper配置文件

编写SQL的文件,温馨提示

  1. 配置文件名建议和Dao接口名一样,如:Dao层有个接口是UserDao,那XML创建名也是UserDao.xml
  2. Mapper文件是可以创建多个的
  3. 编写完成需要到上方配置文件里进行注册
<?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="对应Dao层接口的全类名"
-->
<mapper namespace="org.mybatis.example.BlogMapper">
  <!-- 
	select:查询语句
	id:接口里对应的方法名
	resultType:返回类型,基本类型除外需要全类名
	parameterType:传入的参数类型,基本类型除外需要全类名
	-->
    <select id="getUser" resultType="String" parameterType="String">
    select * from Blog where id = #{id}
  </select>
</mapper>

Dao层

Dao层一般用来存放操作SQL相关的内容,可以自定义名称不过相关路径配置也要修改,问题不大

在Dao层里面创建UserDao接口

package dao;
public interface UserDao {
   
    //@Param是为了规范,让逻辑更加严谨,《拓展》章节会讲,这里不加也可以
   	//不加@Param String getUser(Integer a);
    String getUser(@Param("id") Integer a);
}

调用

原始的调用方法,到了springboot就不用这样子了,实在是麻烦

public class test {
   
    @Test
    public void dome1 () throws IOException {
   
        //配置文件(不是Mapper那个)读取到流中
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        //根据配置文件创建工厂
        SqlSessionFactory sqlSessionFactory = new 
            SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂获取SqlSession
        SqlSession session= sqlSessionFactory.openSession();
        //执行sql第一种方法(反射机制实例化对象,调用对象方法)
        UserDao ud = session.getMapper(UserDao.class);
        ud.getUser(1000);
        //执行sql第二种方法(调用session查询一条记录的方法)
        String a= session.selectOne("dao.UserDao.getUser",1000);
        //释放资源
        session.close();
    }}

配置文件说明

<?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>  
    <!--引用配置文件-->    
<properties resource="mybatis.properties"/>  
    <!--    设置交互的环境   
 	如:二级缓存、延迟加载、日志等等        
   (海量数据优化方法 1.SQL定义索引 2.使用缓存机制(redis数据库) 3.Elasticsearch与solr(针对电商))   
 	-->   
    <settings> 
       	<setting name="" value=""/>  
    </settings>  

	<!-- 别名:可以方便我们设置sql接受和返回类型时不用写全类名 -->
    <typeAliases> 
        <!--自定义类型的别名 type:类型的全类名 alias:自定义的别名 (特别方便,但不宜记忆和操作次数太大)-->
        <typeAlias type="domian.user" alias="u"/>
        <!--自动起别名 name=要起别名的文件/指定文件夹下的全部文件 (方便)
 		   自动别名的名称就是类名 如:com.xiao.domain.User 别名:User,其实不区分大小写 -->        
       	<package name="domian"/>    
    </typeAliases>   
    
    <environments default="development">        
        <environment id="development">            
            <transactionManager type="JDBC"/>           
            <dataSource type="POOLED">              
             <!--
    			JDBC连接语句对应的键值,不引用配置文件情况下

 				<property name="driver" value="com.mysql.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql://localhost:3306/word"/>
 				<property name="username" value="root"/> 
                 <property name="password" value="root"/>                
 			-->                
             <!-- 
				引用配置文件情况下(推荐,框架整合后维护性高)
				加上 <properties resource="配置文件名"/> 到刚刚上面写的 引用配置文件 那个位置
                  value = ${引用文件对应的键}

				引用配置文件mybatis.properties,mybatis.properties的内容如下:4个键值对
				url=jdbc:mysql://localhost:3306/word?useSSL=false&serverTimezone=UTC
				driver=com.mysql.jdbc.Driver
				password=root
				username=root
             -->               
                <property name="driver" value="${driver}"/>               
                <property name="url" value="${url}"/>               
                <property name="username" value="${username}"/>               
                <property name="password" value="${password}"/>            
            </dataSource>        
        </environment>   
    </environments>   
    <mappers>       
        <!--
        声明(注册)Mapper.xml文件,必须的
        写文件的相对路径
        -->        
        <mapper resource="src/main/java/dom/UserDao.xml"/>
        <mapper resource="src/main/resources/mybatis-config.xml"/>
    </mappers>
</configuration>
标签 作用
引用配置文件设置连接
自定义别名,返回或传递参数时填写别名即可,就不用填写全类名
自动别名,指定包下自动别名
设置交互的环境,里面有许多的配置,如:二级缓存、延迟加载、日志等等

动态SQL

什么是动态SQL

根据不同的条件生成不同的sql语句,由此就需要对条件进行判断等一系列操作

Spring

1)where(针对查询语法的自动解析)

自动解析where条件的语句,来达到SQL的正确表达式

如:为了防止if查询是 select * from u_user where and id = 1000 这种不合法的的结果
加上where标签就会变为 select * from u_user where id = 1000

2)If(判断条件是否满足)
<!--
        复杂查询(满足要求拼接where条件)
        当name为空age不为空,那么where=( age <(转义符&lt;) #{age} )
        当name和age都不为空,那么where=(name like '%' #{name} '%' and name like '%' #{age} '%')以此类推
    -->
    <select id="selectBlog5" resultType="User" >
        select * from u_user;
        <where>
            <if test="name!=null and name!=''">
                <!-- 模糊查询 %{0,n}个字符 _{0,1}个字符 -->
                name like '%' #{name} '%'
            </if>
            <if test="age!=null and age!=''">
                <!-- &lt <的转义符 --> 
                age &lt; #{age}
            </if>
        
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值