本文参考mybatis官方文档,做出大致解析

mybatis的git地址:GitHub - mybatis/mybatis-3: MyBatis SQL mapper framework for JavaMyBatis SQL mapper framework for Java. Contribute to mybatis/mybatis-3 development by creating an account on GitHub.https://github.com/mybatis/mybatis-3官方文档url:mybatis – MyBatis 3 | IntroductionGitHub - mybatis/mybatis-3: MyBatis SQL mapper framework for JavaMyBatis SQL mapper framework for Java. Contribute to mybatis/mybatis-3 development by creating an account on GitHub.https://github.com/mybatis/mybatis-3

mybatis框架是什么?有什么优点?
mybaties==》也叫Ibaties     它是一个开源,持久化,轻量级的框架

 JDBC – SQL夹在Java代码块里,耦合度高导致硬编码内伤 – 维护不易且实际开发需求中sql是有变化,频繁修改的情况多见

Hibernate和JPA – 长难复杂SQL,对于Hibernate而言处理也 不容易 – 内部自动生产的SQL,不容易做特殊优化。 – 基于全映 射的全自动框架,大量字段的POJO进行部分映射时比较困难。 导致数据库性能下降。

对开发人员而言,核心sql还是需要自己优化

sql和java编码分开,功能边界清晰,一个专注业务、 一个专注数据。

全局配置文件详解:configuration(配置)
编写前准备:
导入mybaties所需要的jar包:mybatis-3.4.1.jar
导入访问数据库所需要的jar包:mysql-connector-java-5.1.37-bin.jar
 编写全局配置文件,导入dtd
举例说明导入dtd文件,具有提示功能
eclipse或者myeclipse,找到window-->Preferences-->搜索xml-->xml Catalog后,如下图操作:

标签详解
properties(属性):
mybatis可以使用properties来引入外部properties配置文件的内容;

        resource:引入类路径下的资源,类路径就是源码包下的文件,如src根目录下
        url:引入网络路径或者磁盘路径下的资源
举例说明

<properties resource="dbconfig.properties"></properties>
 
settings包含很多重要的设置项
 

            setting:用来设置每一个设置项
            name:设置项名
            value:设置项取值
举例说明

开启驼峰命名,如数据库列表是dept_name==>javabean中就可以写成,deptId,由于mybatis中有自定义高级映射【基于了解程度】

<settings>
<!--开启驼峰命名法-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
 
<!--开启懒加载,延迟加载,分步查询或者按需查询sql语句-->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings> -->
 

typeAliases:别名处理器:可以为我们的java类型起别名,别名不区分大小写
举例说明


<typeAliases>
        <!-- 1、typeAlias:为某个java类型起别名
                type:指定要起别名的类型全类名;默认别名就是类名小写;employee
                alias:指定新的别名
         -->
        <!-- <typeAlias type="com.oracle.mybatis.bean.Employee" alias="emp"/> -->
        
        <!-- 2、package:为某个包下的所有类批量起别名 
                name:指定包名(为当前包以及下面所有的后代包的每一个类都起一个默认别名(类名小写),)
        -->
        <package name="com.oracle.mybatis.bean"/>
        
        <!-- 3、批量起别名的情况下,使用@Alias注解为某个类型指定新的别名
                注意:注解配置别名,需要与package连用
 -->
    </typeAliases>
 

environments:环境们,mybatis可以配置多种环境 ,default指定使用某种环境。可以达到快速切换环境。
 

environment:配置一个具体的环境信息;必须有两个标签;id代表当前环境的唯一标识
transactionManager:事务管理器;
type:事务管理器的类型;JDBC(JdbcTransactionFactory)|MANAGED(ManagedTransactionFactory), 自定义事务管理器:实现TransactionFactory接口.type指定为全类名
dataSource:数据源,
                    type:数据源类型;UNPOOLED(UnpooledDataSourceFactory)
                                |POOLED(PooledDataSourceFactory)
                                |JNDI(JndiDataSourceFactory)
                    自定义数据源:实现DataSourceFactory接口,type是全类名

举例说明

<environments default="mysql">
  <!-- 
  default="development":默认环境,可以切换
  id:唯一标识
  transactionManager:JDBC|MANAGED
  自定义
  dataSource:UNPOOLED|POOLED|JNDI
      自定义
   -->
  <!-- <environment id="oracle">
  <transactionManager type=""></transactionManager>
  <dataSource type=""></dataSource>
  </environment> -->
  
    <environment id="mysql">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
 

databaseIdProvider:支持多数据库厂商的;

         type="DB_VENDOR":VendorDatabaseIdProvider
             作用就是得到数据库厂商的标识(驱动getDatabaseProductName()),mybatis就能根据数据库厂商标识来执行不同的sql;
             MySQL,Oracle,SQL Server,xxxx

举例说明

 <databaseIdProvider type="DB_VENDOR">
 
<!--在映射文件中,可以用value的值进行调用,实现了动态切换数据库厂商的实现-->
 
  <property name="Mysql" value="mysql"/>
  <property name="SQL Server" value="sqlserver"/>
  <property name="Oracle" value="oracle" />
</databaseIdProvider> 
 

mappers:将sql映射注册到全局配置中 -->

    <mappers>
        <!-- 
            mapper:注册一个sql映射 
                注册配置文件

                resource:引用类路径下的sql映射文件
                    mybatis/mapper/EmployeeMapper.xml

                url:引用网路路径或者磁盘路径下的sql映射文件
                    file:///var/mappers/AuthorMapper.xml

                    

                注册接口

                class:引用(注册)接口,
                    有sql映射文件,映射文件名必须和接口同名,并且放在与接口同一目录下;
                    没有sql映射文件,所有的sql都是利用注解写在接口上;
                    推荐:
                        比较重要的,复杂的Dao接口我们来写sql映射文件
                        不重要,简单的Dao接口为了开发快速可以使用注解;

</mappers>

举例说明

<mappers>
<!--当前例子是放在根目录下,即是src或者其他的源码包,如果想放在特定的包下,导入要加入包名,
如:
com/test/customerMapper.xml
-->
    <mapper resource="customerMapper.xml"/>
</mappers>
 

数据库映射文件,即:开发过程中,带有命名xxxMapper.xml的文件配置详解
在这个文件中,我们以前可以用数据库直接映射javaBean属性,只要数据库列表与javaBean的属性名字相同或者驼峰命名法,我们就能够查到数据,在开发过程中,注意:我们经常是映射数据库接口,即dao层,下面我举例说明,映射dao层

简单的举例说明文件配置

<?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="dao.CustomerDao">  
 
<!-- 
Customer select(int id); ==>dao层方法
 
select:查询语句
 
id:唯一标识,绑定dao层中方法名,第二处绑定
 
resultType:查询结果,返回值类型,一般写全类名,如果开启了别名处理,就可以写上别名
 
select * from customer where id = #{id} and customer_name=#{customerName};==> 查询语句
 
#{id}==>获取从方法中传过来的参数,这个是通过原生jdbc的preparedStatement设置值,所以可以有效的防止sql注入
 
-->
 <select id="select" resultType="po.Customer">    
select * from customer where id = #{id} and customer_name=#{customerName}; 
</select>  
 
</mapper>
dao层传参说明:

单个参数:mybatis不会做特殊处理,
    #{参数名/任意名}:取出参数值。
    

多个参数:mybatis会做特殊处理。
    多个参数会被封装成 一个map,
        key:param1...paramN,或者参数的索引也可以
        value:传入的参数值
    #{}就是从map中获取指定的key的值;

注意:抛出异常

org.apache.ibatis.binding.BindingException: 
    Parameter 'id' not found. 
    Available parameters are [1, 0, param1, param2]

操作:
        方法:public Employee getEmpByIdAndLastName(Integer id,String lastName);
        取值:#{id},#{lastName}==>正确如下

【命名参数】:明确指定封装参数时map的key;@Param("id")
    多个参数会被封装成 一个map,
        key:使用@Param注解指定的值
        value:参数值
    #{指定的key}取出对应的参数值

举例说明

//多参数取值,传值,dao层
    public Customer getCustomer(@Param("id")int id,@Param("cus")Customer customer);
 
对应的mapper文件
 
<select id="getCustomer" resultType="po.Customer">
    select * from customer where id = #{id} and customer_name=#{cus.customerName}
  </select>
返回list集合:
 
    //通过id查询多条记录,dao层
    public List<Customer> getCustomers(String customer_name);
 
    对应的mapper文件
<!-- resultType:集合里面的元素类型 -->
   <select id="getCustomers" resultType="po.Customer">
    SELECT * FROM customer WHERE customer_name LIKE #{customer_name};
  </select>
 

返回map集合,没有指定封装规则
//传值map,dao层
    public Map<String,Object> getMap(int id);
 
//对应的mapper文件
 <!--
   传值map 
  resultType:返回map类型
-->
    <select id="getMap" resultType="map">
    SELECT * FROM customer WHERE id=#{id};
  </select>
 

返回map集合,指定封装规则,主键为map的key,当前javaBean为value
//查询customer,键值对改变,对应的dao层
 
    //指定你需要的键,设置注解@MapKey("键名"),这个可以自己指定其他列作为key
    @MapKey("id")
    public Map<Integer, Customer> getMaps(int id);
 
//对应的mapper文件
<!-- key:主键,或者自己需要的key,
    value:实体类对象
    resultType:返回map中javaBean类型
     -->
    <select id="getMaps" resultType="po.Customer">
    SELECT * FROM customer WHERE id=#{id};
      </select>
 

参数获取
    #{}:可以获取map中的值或者pojo对象属性的值;
    ${}:可以获取map中的值或者pojo对象属性的值;
select * from tbl_employee where id=${id} and last_name=#{lastName}
Preparing: select * from tbl_employee where id=2 and last_name=?
    区别:
        #{}:是以预编译的形式,将参数设置到sql语句中;PreparedStatement;防止sql注入
        ${}:取出的值直接拼装在sql语句中;会有安全问题;
        大多情况下,我们去参数的值都应该去使用#{};
        
        原生jdbc不支持占位符的地方我们就可以使用${}进行取值
        比如分表、排序。。。;按照年份分表拆分
            select * from ${year}_salary where xxx;
            select * from tbl_employee order by ${f_name} ${order}

#{}:更丰富的用法:
    规定参数的一些规则:
    javaType、 jdbcType、 mode(存储过程)、 numericScale、
    resultMap、 typeHandler、 jdbcTypeName、 expression(未来准备支持的功能);

    jdbcType通常需要在某种特定的条件下被设置:
        在我们数据为null的时候,有些数据库可能不能识别mybatis对null的默认处理。比如Oracle(报错);
        
        JdbcType OTHER:无效的类型;因为mybatis对所有的null都映射的是原生Jdbc的OTHER类型,oracle不能正确处理;
        
        由于全局配置中:jdbcTypeForNull=OTHER;oracle不支持;两种办法
        1、#{email,jdbcType=OTHER};
        2、jdbcTypeForNull=NULL
            <setting name="jdbcTypeForNull" value="NULL"/>

mybatis高级映射,resultMap映射【开发重点】
级联属性:数据库1对1关系,数据库的关系如下图所示:
 

举例如下操作:association关键字查询

Emploee类中,有一个属性

//vo层,级联属性
    private Deptartment dept;

//查询员工所对应的的部门,dao层
    public Customer getCusDept(int id);
 
 
//对应的mapper文件
<!-- 
    resultMap:高级映射,自定义映射
    type:返回类型
    id:标识符,对应,resultMap="getCusDept",相对应
    column:对应的是数据库的列名
    property:对应的是java属性名字
    
     -->
<resultMap type="po.Customer" id="getCusDept">
    <id column="id" property="id"/>
    <result column="customer_name" property="customerName"/>
    <result column="customer_password" property="customerPassword"/>
    <!-- 方式一:级联方式查询 -->
    <!-- <result column="id" property="dept.id"/>
    <result column="dept_name" property="dept.dept_name"/> -->
    
    <!-- 方式二:使用关键字association:联合
    property:写的是java对象
    javaType:必须要有,不可省略,java类型
    对应的是一对一
    开发中,多用这种方式
     -->
    <association property="dept" javaType="po.Deptartment">
    <id column="id" property="id"/>
    <result column="dept_name" property="dept_name"/>
    </association>
    </resultMap>
 
 
<select id="getCusDept" resultMap="getCusDept">
        select * 
        from 
        customer c, dept d 
        where 
        c.fk_dept_cus_id=d.id and c.id=#{id};
    </select>
 

数据库1对n,在javaBean,Deptartment类中,有一个属性

//多个员工
    private List<Emploee> emploee;

举例如下操作:collection关键字查询

    //查询当前部门中所有的员工信息,dao层
    public Deptartment getDept(int id);
    
 
    //对应的mapper文件
 
<resultMap type="po.Deptartment" id="getDept">
    <id column="did" property="dept_id"/>
    <result column="dept_name" property="dept_name"/>
    <!-- 
    collection:集合
    property:java对象
    ofType:指定集合元素的类型,不可省略
     -->
    <collection property="customers" ofType="po.Customer">
    <id column="customer_id" property="customer_id"/>
    <result column="customer_name" property="customerName"/>
    <result column="customer_password" property="customerPassword"/>
    <result column="fk_dept_cus_id" property="fk_dept_cus_id"/>
    </collection>
    </resultMap>
 
 
<select id="getDept" resultMap="getDept">
        select 
        d.dept_id did,d.dept_name, c.customer_id,c.customer_name,c.customer_password 
        from 
        dept d 
        left join customer c 
        on
        c.fk_dept_cus_id=d.dept_id 
        where 
        d.dept_id=#{dept_id};
    </select>
大家有什么问题,欢迎在下方留言喔
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值