Mybatis笔记

Mybatis简介

  • Mybatis是一个持久层框架
  • 支持定制化SQL存储过程以及高级映射

为什么使用Mybatis

  • 与Hibernate的区别
    • Mybatis相比较与Hibernate更加简单易学
    • Mybatis没有任何第三方依赖,最简单的安装只需要两个Jar文件
    • Mybatis的使用不会对应用程序或数据库的现有设计有任何影响,灵活性强
    • SQL语句写在XML文件里,解除了SQL语程序代码的耦合,通过提供DAO层将业务逻辑与数据访问逻辑分离,程序可维护性高
    • 支持动态编写SQL

运行流程(框架架构)

  1. 加载配置
  2. SQL解析
  3. SQL执行
  4. 结果映射

涉及Jar包

  • 核心包
    • mybatis-x.x.x.jar
    • Maven坐标
      <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
          <version>3.4.6</version>
      </dependency>
      
  • 数据库驱动包
    • mysql-connector-java-x.x.x-bin.jar
    • Maven坐标
      <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>5.0.7</version>
      </dependency>
      

具体使用以及配置

  • 查询
    1. 加载配置
      • 配置文件结构

        • 依赖
        <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
        
        • 具体SqlMapConfig配置

          <configuration>
          <!-- 配置环境,设置使用的连接以及所使用的数据库,可以配置多个环境 -->
          	<environments default="development">
          		<environment id="development">
          			<transactionManager type="JDBC" />
          			<dataSource type="POOLED">
          			<!-- 驱动、连接地址、用户名、密码的配置-->
          				<property name="driver" value="com.mysql.jdbc.Driver" />
          				<property name="url" value="${jdbc.url}" />
          				<property name="username" value="${jdbc.username}" />
          				<property name="password" value="${jdbc.password}" />
          			</dataSource>
          		</environment>
          	</environments>
          	<!-- 配置映射,可以通过resource直接调用其他mapper文件 -->
          	<mappers>
          		<mapper resource="Map.xml"/>
          		<mapper namespace="">
          			<select id="findAllUser" resultType="packagename.User">
          				select * from user
          			</select>
          		</mapper>
          	</mappers>
          </configuration>
          

          注意,使用驱动不同时,property的name可能也会不同

          • Map.xml文件配置
            • 主要结构就是一个mapper标签,namespace作为文件的标识
            • mapper标签中,可以配置想要的语句,程序利用mapper的namespace+语句的id去定位要使用的SQL语句
      • 将配置文件加载

        • 主要是为了开启SQLSession以执行对数据库的操作
        //加载资源
        InputStream inputStream = Reasources.getResourceAsStream("SqlMapConfig.xml");	//具体路径视情况修改
        //创建SqlSessionFactory对象
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(inputStream);
        //由SqlSessionFactory对象开启SqlSession
        SqlSession ss = ssf.openSession();
        
    2. 调用方法进行查询
      ss.selectOne("语句");
      //此处的语句为在Map.xml配置文件中配置的namespace+id,即可以执行对应标签中的SQL语句
      
      • 常用的查询方法
      Object selectOne("语句");		//查询一条数据,其类型为在Map.xml文件中定义的resultType
      List selectList("语句");			//查询多条数据
      
    3. 结果输出
    4. 资源回收
    ss.close();
    
  • 增加记录
    • Map.xml的标签为
    • 调用SqlSession的insert方法
    sqlSession.insert("语句",Object);		
    //Object为要插入的pojo类,此时的Pojo类可以视为一个参数列表
    
  • 删除记录
    • Map.xml的标签为
    • 调用SqlSession的delete方法
    sqlSession.delete("语句",Object);		
    //Object为要删除的pojo类,此时的Pojo类依然视为一个参数列表
    
  • 修改记录
    • Map.xml的标签为
    • 调用SqlSession的update方法
    sqlSession.update("语句",Object);		
    //Object为要修改的pojo类,此时的Pojo类依然视为一个参数列表
    

动态SQL

  • 传递参数
    • 主要意义
      • 实现了程序对SQL语句的控制
    • ${}与#{}的区别
      • #{}可以实现参数的输入,即Java与jdbc的类型转换,可以防止SQL注入
      • ${}只能起到字符串拼接的作用,而且括号中只能是value,无法防止SQL的注入问题
  • 动态SQL
    • Mybatis支持动态的标签输入
    • if
      • if标签中test即为判断条件,条件为真则输出if标签内的语句
      • 需要做多条件判断时连接符为and而不是&&
        select * from tableName 
        where 1=1 
        <if test="id!=null">
        	and id=#{id}
        </if>
        
    • where
      • where标签可以处理第一个and
        select * from tableName 
        <where>
        	<if test="id!=null and id!=''">
        		and id=#{id}
        	</if>
        	<if test="username!=null and username!=''">
        		and username like '%${username}%'
        	</if>
        </where>
        
    • foreach
      • collection为迭代的集合
      • item为迭代变量
      • separator为变量之间的分隔符
      • open描述输出位置
        <foreach collection="ids" open=" and id in(" close=")" item="id" separator="," >
        	#{id}
        </foreach>
        
    • sql片段
      • 实现SQL语句的封装,以供调用
      • 其他部分调用封装的SQL语句时使用include标签,在refid中填入SQL标签的id即可
        <include refid="SqlId"/>
        

与Spring整合相关

  • 主要思路
    • 让Spring管理SqlSessionFactory对象,使其在整个应用中作为单例存在
    • SqlSession对象可以从Spring容器中获取,简化操作
    • Mapper代理中,可以从Spring容器中获取Mapper的代理对象
    • 数据库的连接以及数据库连接池事务管理都交由Spring管理,MyBatis只做数据库操作

单独使用mybatis是有很多限制的,比如无法实现跨越多个session的事务,而且很多业务系统本来就是使用spring来管理的事务,因此mybatis最好与spring集成起来使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值