MyBatis基本使用

向SQL传参

日志输出设置

#{} ${} 的区别

Mybatis会将SQL语句中的#{}转换为问号占位符。${}形式传参,底层Mybatis做的是字符串拼接操作。

#{} 只能替代值的位置,不饿能替代 容器名 列名 sql关键字

eg : name = #{nameValue}  静态的列名,动态的值

${nameColumn} = #{nameValue}  动态的列名,动态的值

结论:实际开发中,能用#{}实现的,肯定不用${}。

特殊情况: 动态的不是值,是列名或者关键字,需要使用${}拼接

数据输入

指上层方法(例如Service方法)调用Mapper接口时,数据传入的形式。

- 简单类型:只包含一个值的数据类型
    - 基本数据类型:int、byte、short、double、……
    - 基本数据类型的包装类型:Integer、Character、Double、……
    - 字符串类型:String
- 复杂类型:包含多个值的数据类型
    - 实体类类型:Employee、Department、……
    - 集合类型:List、Set、Map、……
    - 数组类型:int[]、String[]、……
    - 复合类型:List<Employee>、实体类中包含集合……

单个简单类型

传入的是一个实体对象

多个简单类型

方式1:mybatis默认对应方式:按顺序一一对应入参

方式2:通过@Param注解指定

map类型输入????不循环?

数据输出

resultType 返回值类型

resultType = 返回值类型

返回值类型可以写类的全限定符号; eg:  java.lang.String

也可以写别名简称; eg: string

mybatis内部已经定义了部分别名,如下:

总结:基本数据类型:类型  int   别名 _int

包装数据类型   _integer     别名 int   _Double 别名   double

如果没有默认的别名,也可以配置文件中自定义

<!--给某个类起别名-->
    <typeAliases>
        <typeAlias type="com.xin.pojo.Employee" alias="employee"/>
    </typeAliases>
    
    <!--批量定义,批量将包下的类基于别名,别名就是类的首字母小写-->
    <typeAliases>
        <package name="com.xin.pojo"/>
    </typeAliases>

数据库列名和实体类属性名的自动映射

开启驼峰式映射

各个输出类型

返回值是集合,resultType 不需要指定集合类型,只需要指定泛型即可

原因:mybatis底层是ibatis,ibatis 中只有两种查询方法,selectOne  selectList, selectOne  底层调用了 selectList,所以本身就是以LIst结果类型去查的,所以只需要指定泛型即可

插入后返回主键值的实现

自增长主键
<!--传入的数据是实体对象时,直接 key = #{属性名即可}-->
    <!--useGeneratedKeys="true" 表示我们想要数据库自动增强的主键值-->
    <!--keyColumn="emp_id" 表示主键列-->
    <!--keyProperty="empId" 接收主键值的属性-->
    <insert id="insertEmployee" useGeneratedKeys="true" keyColumn="emp_id" keyProperty="empId">
        insert into t_emp(emp_name,emp_salary) values(#{empName},#{empSalary})
    </insert>

验证

非自增长主键
<!--order="BEFORE" 指在insert操作之前执行还是之后执行-->
    <!--select UUID() 是随机生成UUID 字符串-->
    <insert id="insert">
        <selectKey order="BEFORE" resultType="string" keyProperty="empId">
            select replace(UUID(),"-","")
        </selectKey>
        insert into t_emp(emp_id, emp_name,emp_salary) values(#{empId},#{empName},#{empSalary})
    </insert>

实体类属性和数据库字段对应关系

package com.xin.pojo;


import org.apache.ibatis.type.Alias;

// 如果设置批量别名后,不想用类名首字母小写作为别名,可以通过alias注解覆盖别名
// 但是@Alias注解只有再批量起别名的情况下才生效
@Alias("ergouzi")
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;
    }
}

方式一:别名方式

<!--    方式一:别名方式-->
    <select id="selectOne" resultType="com.xin.pojo.Employee">
        select emp_id empId,emp_name empName, emp_salary empSalary from
        t_emp where emp_id = ${empId}
    </select>

方式二:开启驼峰映射

<!--    方式二:开启驼峰映射-->
    <select id="selectTwo" resultType="com.xin.pojo.Employee">
        select emp_id ,emp_name , emp_salary  from
        t_emp where emp_id = ${empId}
    </select>

方式三:resultMap

注意:resultType 和 resultMap 之间只能同时使用一个。

<!--    方式三: resultMap,可以针对深层次对象(即对象有嵌套关系)也可以针对单层次对象-->
    <!-- 专门声明一个resultMap设定column到property之间的对应关系 -->
    <resultMap id="employeeMap" type="employee">
        <!-- 使用id标签设置主键列和主键属性之间的对应关系 -->
        <!-- column属性用于指定字段名;property属性用于指定Java实体类属性名 -->
        <id column="emp_id" property="empId"/>
        <!-- 使用result标签设置普通字段和Java实体类属性之间的关系 -->
        <result column="emp_name" property="empName"/>
        <result column="emp_salary" property="empSalary"/>
    </resultMap>
    <select id="selectThree" resultType="com.xin.pojo.Employee">
        select emp_id,emp_name,emp_salary from
        t_emp where emp_id = ${empId}
    </select>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值