Mybatis的数据输入和输出

214 阅读4分钟

数据输入

单个的就不说了

有多个参数的时候可以用@parm()注解去给参数起个别名

在sql语句中传入参数的时候直接调用别名就行了

实体类传入的时候,sql中的参数就要和实体类内对应的变量名一致了

在mapper就口就传入类就行了

Map的输入是比较特殊的

首先在mapper接口中定义好Map的两个泛型

然后再xml 文件中创建动态sql

其中动态sql中传入的值要和传入中Map的键对应

MyBatis会根据传入参数对象中的键值对来替换SQL语句中的对应参数占位符。

因此,确保在编写SQL语句时,#{}中的键要与传入参数对象中的键一致,以确保参数绑定的正确性

数据的输出

概念:

数据的输出总体上有两种

1.增删改查返回影响的行数:哟个int和long接收即可

2.查询操作的查询结果

而我们要做的就是指定输出数据的类型既可以了

这个就是由标签中的resultType决定的

细节解释:

select标签,通过resultType指定查询返回值类型!

resultType = "全限定符 | 别名 | 如果是返回集合类型,写范型类型即可"

一般情况下也可以用别名作为输出结果

默认情况可以参照驼峰命名(首字母小写)

返回实体类对象最好直接用类的全限定符

返回Map类型

适用于SQL查询返回的各个字段综合起来并不和任何一个现有的实体类对应,没法封装到实体类对象中。能够封装成实体类类型的,就不使用Map类型。

resultType中直接传入map就行了

返回list类型

这个就比较特殊了,直接在返回类型那里传入list对应的泛型就行了

返回主键值

在插入语句中,主键如果是自增,我们就没必要在插入过程中传入主键值了

但是我们也不知道插入进去的主键是多少,而在标签中我们可以设置返回主键的值

以方便后续对该主键的一系列操作

<!-- int insertEmployee(Employee employee); -->
<!-- useGeneratedKeys属性字面意思就是“使用生成的主键” -->
<!-- keyProperty属性可以指定主键在实体类对象中对应的属性名,Mybatis会将拿到的主键值存入这个属性 -->
<insert id="insertEmployee" useGeneratedKeys="true" keyProperty="empId">
  insert into t_emp(emp_name,emp_salary)
  values(#{empName},#{empSalary})
</insert>
int insertEmployee(Employee employee);

也不是说返回吧,就是一种将主键值回写在传入参数中的方法

非自增长主键映射

  1. 非自增长类型主键

    而对于不支持自增型主键的数据库(例如 Oracle)或者字符串类型主键,则可以使用 selectKey 子元素:selectKey 元素将会首先运行,id 会被设置,然后插入语句会被调用!

    使用 selectKey 帮助插入UUID作为字符串类型主键示例:

<insert id="insertUser" parameterType="User">
    <selectKey keyProperty="id" resultType="java.lang.String"
        order="BEFORE">//在下列sql执行前执行
        SELECT UUID() as id  //随机用uUId找一个主键值赋给id
    </selectKey>
    INSERT INTO user (id, username, password)
    VALUES (
        #{id},
        #{username},
        #{password}
    )
</insert>
在上例中,我们定义了一个 `insertUser` 的插入语句来将 `User` 对象插入到 `user` 表中。我们使用 `selectKey` 来查询 UUID 并设置到 `id` 字段中。

通过 `keyProperty` 属性来指定查询到的 UUID 赋值给对象中的 `id` 属性,而 `resultType` 属性指定了 UUID 的类型为 `java.lang.String`。

需要注意的是,我们将 `selectKey` 放在了插入语句的前面,这是因为 MySQL 在 `insert` 语句中只支持一个 `select` 子句,而 `selectKey` 中查询 UUID 的语句就是一个 `select` 子句,因此我们需要将其放在前面。

最后,在将 `User` 对象插入到 `user` 表中时,我们直接使用对象中的 `id` 属性来插入主键值。

使用这种方式,我们可以方便地插入 UUID 作为字符串类型主键。当然,还有其他插入方式可以使用,如使用Java代码生成UUID并在类中显式设置值等。需要根据具体应用场景和需求选择合适的插入方式。

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

就是一种属性名与字段名对应不上的情况

  • 使用别名
  • 使用驼峰命名的方式
<!-- 使用settings对Mybatis全局进行设置 -->
<settings>

  <!-- 将xxx_xxx这样的列名自动映射到xxXxx这样驼峰式命名的属性名 -->
  <setting name="mapUnderscoreToCamelCase" value="true"/>

</settings>
  • 使用resultMap(多层映射,与resulttype二选一)
<!-- 专门声明一个resultMap设定column到property之间的对应关系 -->
<resultMap id="selectEmployeeByRMResultMap" type="com.atguigu.mybatis.entity.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>

<!-- Employee selectEmployeeByRM(Integer empId); -->
<select id="selectEmployeeByRM" resultMap="selectEmployeeByRMResultMap">

  select emp_id,emp_name,emp_salary from t_emp where emp_id=#{empId}

</select>