MyBatis学习:基本使用

学习之前:

        MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。

2.1 向SQL语句传参

2.1.1 mybatis日志输出配置

MyBatis配置文件详解:





    
    
        
        
            
            
            
            
                
                
                
                
                
            
        
    

    
        
        
        
        
        
    

官方文档:mybatis – MyBatis 3 | 简介

标签:

用于选择MyBatis配置环境的标签,如开发、测试和生产环境需要不同的配置。更换环境,只需更开标签中的default属性值即可。如上述XML文件中的配置说明当前使用的是开发环境。标签则配置了不同环境需要的配置信息。

标签:

MyBatis中有两种事务管理器:type = "JDBC" / "MANAGED"

JDBC:直接使用JDBC的提交和回滚功能。(常用)

MANAGED:不提交或回滚一个连接(基本什么都不做),需要自己提交。

标签:

配置数据源,使用JDBC数据源接口来配置JDBC连接对象的资源。

UNPOOLED:每次请求时打开和关闭连接。

POOLED:利用“池”的概念讲JDBC连接对象组织起来。(常用)

标签:

定义SQL映射语句,告诉MyBatis去哪里找到这些语句。

使用类的全限定符来定位Mapper映射文件。

如何打开日志?

按照配置文件的顺序,声明标签。标签内声明标签,name="logImpl",value="STDOUT_LOGGING"。


    

2.1.2 传参的两种形式

#{key} 形式

以?占位符的形式动态传参

${key}形式

以字符串拼接的形式传参

推荐使用#{key} 形式传参:

防止注入攻击。但是#{key}形式不能动态传入标签、列名、SQL关键字

故动态传入列名或表名时,可以用${key}形式传入



    

2.2 数据输入

2.2.1 传入单个简单数据类型

key名可以任意指定


   delete from t_emp where emp_id = #{id123}

2.2.2 传入单个实体数据类型

传入对象时,key名需要对应为对象的属性名(严格对应)


        insert into t_emp(emp_id, emp_name, emp_salary) values(#{empId}, #{empName}, #{empSalary})

 传入对应的Employee类

public class Employee {

    private Integer empId;

    private String empName;

    private Double empSalary;

    //getter | setter

    public Integer getEmpId() {
        return empId;
    }

    public void setEmpId(Integer empId) {
        this.empId = empId;
    }

    public String getEmpName() {
        return empName;
    }

    public void setEmpName(String empName) {
        this.empName = empName;
    }

    public Double getEmpSalary() {
        return empSalary;
    }

    public void setEmpSalary(Double empSalary) {
        this.empSalary = empSalary;
    }
}

2.2.3 多个简单数据类型

有多个简单数据类型时,key值不可以随便传入!

方案1:(推荐)

@Param(value="keyName")注解指定

List queryByNameAndSalary(@Param("name") String name,@Param("salary") Double salary);

方案2:

MyBatis默认机制:从左至右按顺序依次传入 name = param1/args0, salary = param2/args1

 2.2.4 Map数据类型

传入的keyName与Map的keyName对应即可


        insert into t_emp(emp_name, emp_salary) values (#{name}, #{salary})

2.3 数据输出

2.3.1 概述

数据输出:resultType一般有两种形式:

        增、删、改操作所影响的行数:返回值为int类型

        查询操作的查询结果所对应的数据类型

2.3.2 单个简单类型

resultType = "类的全限定符" / “别名简称”。


        delete from t_emp where emp_id = #{id};



如果自定义类没有别名,可以自己声明别名:

标签后,标签前,声明标签。


        

或通过指定包名,自动将类名首字母小写的名称作为别名Alias。 (批量定义)


    

同时,批量设置后,可以使用@Alias("otherName"),把默认的首字母小写别名改为指定的otherName,如在Employee类上方声明@Alias("name")即可把emp作为别名

2.3.3 返回实体对象类型

resultType = "返回类型的全限定符" / "别名"

要求:

返回单个实体类型时,要求返回的列名和对象实体的属性名保持一致,这样才可以实现属性映射。

设置:

若emp_id 去掉下划线 -> empId 能够与属性名对应,则可以实现属性映射。

标签中设置如下:


        ...
        

2.3.4 返回Map类型

直接讲resultType声明为"map"即可。列名为key,查询结果为value。

Map selectEmpNameAndSalary(int id);

2.3.5 返回List类型 

如果返回值有多个同类型的实体对象,需要用List集合承接,resultType类型无需声明为List,声明为集合类对应的泛型,及同类型的实体对象即可。


// 查询工资高于传入值的员工姓名
List queryEmpNameBySalary(double salary);
// 查询全部员工
List queryAllEmp();

因为MyBatis框架底层都是按照selectList方法进行查询,即都是按照集合去查询,故resultType只要声明为泛型类即可!

2.3.6 返回主键值

插入对象时想获得对象primary_key的value值用于后续操作:需要返回主键值。

当主键auto increament时,标签中声明属性:

        userGeneratedKeys="true":需要数据库自增长的主键值

        keyColumn="emp_id":主键列的名称

        keyProperty="empId":接收主键列值得属性


        insert into t_emp(emp_name, emp_salary) values(#{empName}, #{empSalary})

 当主键没有自增长时:

标签内声明标签:在插入之前先指定一段sql语句用于生成主键值

        order:声明selectKey中得语句在插入语句前或后执行 value="BEFORE" | "AFTER"

        resultType:返回值类型

        keyProperty:查询结果给哪个动态key赋值



        
            select uuid()
        
        insert into teacher(t_id, t_name)
            values (#{tId}, #{tName})

2.3.7 实体类属性



    
        
        
    
    

 resultMap:自定义属性映射方式,实现深层次映射

id:resultMap的唯一标识,其他组件引用id以引用map组件

tyep:返回值对应类型:别名 | 全限定符 | 泛型

你可能感兴趣的:(mybatis,学习,java)