mybatis框架

本地资料:D:\qq\Mybatis资料-idea版

Mybatis框架原理(掌握)

  • 什么是Mybatis?

    •   mybatis是一个持久层的框架,是apache下的顶级项目。

    •   mybatis托管到goolecode下,后来托管到github下:mybatis Github地址

    •   mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成(半自动化,大部分需要程序员编写sql)满足需要sql语句。

    •   mybatis可以将向 preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。(输出映射)

 

  1. 建立mybatis项目步骤  

    1. 添加依赖包  4个  数据库   Junit  mybatis   1.8jdk

    2. 编写pojo对象(domain)

    3. 编写核心配置文件(config.xml)

    4. 编写核心配置文件编写映射文件(sqlMapper.xml)

    5. 测试框架

  2.   具体实现

    1.  添加依赖包  4个  数据库   Junit  mybatis   1.8jdk

      1.   在maven中创键项目,用maven管理jar包

      2.         配置maven pom.xml文件,

      3.  pom.xml源码模板
      4. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
          
          <groupId>org.lanqiao.maven</groupId>
          <artifactId>HelloWorld</artifactId>
          <version>0.0.1-SNAPSHOT</version>
        		
        		<name>HelloWorld</name>
        	<dependencies>
        	
           <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
           <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.20</version>
        </dependency>
           	  <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>5.1.6</version>
                </dependency>
                <dependency>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                    <version>4.12</version>
                </dependency>
                <dependency>
                    <groupId>org.mybatis</groupId>
                    <artifactId>mybatis</artifactId>
                    <version>3.4.5</version>
                </dependency>
           
            </dependencies>	
        	
        </project>

         

    2.   编写核心配置文件(config.xml)

      1. <?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">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mydb1"/>
                <property name="username" value="root"/>
                <property name="password" value="yjy"/>//密码
                
              </dataSource>
            </environment>
          </environments>
          <mappers>
            <mapper resource="com/java/dao/impl/BookDaoImpl/Book.xml"/>
          </mappers>
        </configuration>

         

         
    3.   编写核心配置文件的映射文件(sqlMapper.xml)

      1. sqlMapper.xml模板

      2. <?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.java.dao.impl.BookDaoImpl">
        	<insert id = "insertbook">
        	INSERT INTO	emp	SET	ff='范雨欣'
        	</insert>
          
        </mapper>

         

    4.   测试框架

      1.   测试文件

  3. package com.java.dao.impl.BookDaoImpl;
    import java.io.IOException;
    import java.io.InputStream;
    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;
    
    public class BookDaoImpl {
    
    	public static void main(String[] args) throws IOException {
    		  SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    		  InputStream is = Resources.getResourceAsStream("mybatis.xml");
    	        SqlSessionFactory build = sqlSessionFactoryBuilder.build(is);
    	        SqlSession sqlSession = build.openSession();
    	        sqlSession.insert("com.java.dao.impl.BookDaoImpl.insertbook");
    	        sqlSession.commit();//提交
    	}
    }
    

    成功:

  4.  

  5. 带参数的插入操作:

 利用map数组传递

 

 

 修改:

 

 

 删除:

 

 

 

可以定义sql元素,然后在select等操作中通过引用:

<sql id='x'>
    id,role_name,note
</sql>
<select ...>
    select <include refid="x"/> from t_role
</select>

六.resultMap结果集映射,现在支持resultMap的查询,不支持更新、删除和修改。
1.resultMap组成:

    constructor元素用于指定构造方法
    id用于表示主键,允许多个主键:联合主键。
    result是POJO到sql列名的映射。

2.可以使用Map存储结果集(根据key读取结果),但是可读性较低,一般推荐POJO方式。

3.使用POJO存储结果集支持自动映射,也可以使用resultMap自定义映射。

4.级联:
- 一对一:association
- 一对多:collection,多对多可以转化为一对多
- discriminator:鉴别器,根据实际选择采用哪个类作为实例

5.延迟加载:
- 1+N问题:查询主数据,是1次查询,查询出n条记录;根据这n条主记录,查询从记录,共需要n次,所以叫数据库1+n问题;这样会带来性能问题,比如,查询到的n条记录,我可能只用到其中1条,但是也执行了n次从记录查询,这是不合理的。
- mybatis通过设置全局参数:lazyLoadingEnabled(是否开启延迟加载功能)和aggressiveLazyLoading(对任意延迟属性发的调用会使带有延迟加载属性的对象完整加载,反之按需加载)解决该问题。由于mybatis延迟加载是按层执行的,因此aggressiveLazyLoading设置为true表示按层加载,false为按需加载。
- 全局设置不灵活,可以在association、collection和discriminator中使用fetchType=”lazy”属性设置懒加载(延迟加载)或者fetchType=”eager”即时加载。
- 延迟加载的实现原理是通动态代理实现的。

七.缓存cache
1.默认支持一级缓存:同一个sqlsession对象调用mapper的方法,没超时和刷新的情况下只执行一次sql。不同的sqlsession还是会多次发送sql执行。
2.开启二级缓存要求POJO是可序列化的(实现serializable接口),然后在配置文件中打开缓存。这会导致:
- select语句会缓存
- insert/update/delete会刷新缓存
- 缓存默认使用LRU(最近最少使用)算法回收
二级缓存是sqlsessiofactory级别共享的。一级缓存是sqlsession级别共享的。
3.二级缓存属性:
- eviction:缓存策略,LRU/FIFO/SOFT/WEAK
- flushInterval:刷新时间
- size:缓存数目
- readOnly:是否只读,不能修改
4.支持自定义缓存,例如缓存到redis等,需要实现Cache接口。
第五章 动态SQL

支持的动态sql如下:

一.if
常用test合用,根据test结果判断是否调用,如:

select role_no from t_role where 1=1
<if test="roleName!=null and roleName!=''">
    and role_name like concat('%',#{roleName},'%')
</if>

 

二.choose/when/otherwise
实现switch…case…default逻辑
三.trim/where/set
1.为了避免上面的1=1,可以使用where元素:

<where>
<if test="roleName!=null and roleName!=''">
    and role_name like concat('%',#{roleName},'%')
</if>
</where>

2.trim用于去掉and、or等语句。
- prefix:表示语句前缀
- prefixOverrides:需要去掉的字符串
3.set用于更新部分字段而不是全部时去掉不需要字段后面的逗号。
四.foreach
遍历集合,支持数组、List、Set。
五.test
用于条件判断
六.bind
通过OGNL表达式自定义一个上下文变量。如用于处理模糊搜索时mysql的使用连接的concat连接,而oracle使用||连接。

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值