数据输入
单个的就不说了
有多个参数的时候可以用@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);
也不是说返回吧,就是一种将主键值回写在传入参数中的方法
非自增长主键映射
-
非自增长类型主键
而对于不支持自增型主键的数据库(例如 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>