前言
搭建SpringBoot环境下的mybatis,详见《SpringBoot集成mybatis实践,源码》https://blog.csdn.net/qq_35642849/article/details/107038989
正文
一、解析mapper.xml
<?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必须唯一 -->
<mapper namespace="com.lbc.mybatisDemo.book.mapper.UserMapper">
<resultMap id="userMap" type="com.lbc.mybatisDemo.book.model.SysUser">
<id property="id" column="id"/>
<result property="userName" column="user_name"/>
<result property="userPassword" column="user_password"/>
<result property="userEmail" column="user_email"/>
<result property="userInfo" column="user_info"/>
<result property="headImg" column="head_img" jdbcType="BLOB"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
</resultMap>
<select id="selectById" resultMap="userMap">
select * from sys_user where id = #{id}
</select>
<insert id="insert2" useGeneratedKeys="true" keyProperty="id">
insert into sys_user (user_name,user_password,user_email,user_info,head_img,create_time)
value (#{userName},#{userPassword},#{userEmail},#{userInfo},#{headImg,jdbcType = BLOB},#{createTime,jdbcType =TIMESTAMP})
</insert>
<insert id="insert3" >
insert into sys_user (user_name,user_password,user_email,user_info,head_img,create_time)
value (#{userName},#{userPassword},#{userEmail},#{userInfo},#{headImg,jdbcType = BLOB},#{createTime,jdbcType =TIMESTAMP})
<selectKey keyColumn="id" resultType="long" keyProperty="id" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
</insert>
<delete id="deleteById" >
delete from sys_user where id = #{id}
</delete>
<update id="update" >
update sys_user
set user_name= #{userName},
user_password=#{userPassword},
user_email=#{userEmail},
user_info=#{userInfo},
head_img = #{headImg,jdbcType = BLOB},
create_time =#{createTime,jdbcType =TIMESTAMP}
where id = #{id}
</update>
</mapper>
<mapper namespace="com.lbc.mybatisDemo.book.mapper.UserMapper">
namespace指向的是Mapper的接口类
<select><insert><upate><delete>:映射增删改查的使用标签
id:命名空间中的唯一标识符,可用来代表这条语句
resultMap:用于设置返回值的类型和映射关系
<select>sql语句</select> #{id}表示参数
下面详细说明resultMap标签
id:必填,且唯一
type:必填,用于配置查询列所映射到的java对象类型
extends:选填,可以配置当前的resultmap继承自其他的resultMap
autoMapping :选填,可为true或false 用于配置是否启用非映射字段的自动映射功能,改配置可覆盖resultMap的id
以上是resultMap的属性,还包含以下的标签
contructor:配置使用构造方法注入结果,包含idArg . arg
id:一个id结果,标记唯一值,可帮助提高整体性能
result:注入java对象属性的普通结果
association:一个复杂类型关联,许多结果将包成这种类型,可用于一对多,多对多的对象映射
collection:复杂类型的集合,用于管理java对象中的集合对象
discriminator:根据结果值来决定使用哪个结果映射
case:基于某些值的结果映射
二、增删改查实现
通过mapper的接口类@Mapper可以跟mapper.xml关联,在增删改查的标签内添加相应的sql语句如上
实现如下:
@SpringBootApplication
@MapperScan("com.lbc.mybatisDemo.book.mapper")
public class MybatisTestSpringBoot implements CommandLineRunner {
@Autowired
UserMapper userMapper;
public static void main(String[] args) {
SpringApplication.run(MybatisTestSpringBoot.class, args);
}
public void run(String... args) throws Exception {
/**s
SysUser user = userMapper.selectById(1L);
System.out.println(user);*/
/**
SysUser sysUser = new SysUser();
sysUser.setCreateTime(new Date());
sysUser.setHeadImg(null);
sysUser.setUserName("mybatis测试");
sysUser.setUserPassword("123456");
sysUser.setUserEmail("123@123.com");
sysUser.setUserInfo("测试测试");
int row = userMapper.insert2(sysUser);
System.out.println(row);*/
/**
int row = userMapper.insert3("mybatis","123456","321568@123.com","ceshi",null,new Date());
System.out.println(row );*/
/**
SysUser sysUser = new SysUser();
sysUser.setId(1004L);
int row = userMapper.deleteById(sysUser);
System.out.println(row);*/
SysUser sysUser = new SysUser();
sysUser.setId(1006L);
sysUser.setCreateTime(new Date());
sysUser.setHeadImg(null);
sysUser.setUserName("mybatis测试");
sysUser.setUserPassword("123456");
sysUser.setUserEmail("123@123.com");
sysUser.setUserInfo("xiugai");
int row = userMapper.update(sysUser);
System.out.println(row);
}
}
这里发现几个问题:
1、在mapper.xml中同样的#{参数},在使用的时候,可以传java对象,还可以传@param,两个区别
2、在插入数据的时候,遇到id自增怎么办?怎么设置
针对第一个问题,其实在#{参数}中,如果用户传入的是对象,则mybatis会将其属性查找处理,将他们的值传入预处理语句的参数中,参考https://mybatis.org/mybatis-3/zh/sqlmap-xml.html#Result_Maps 。还可以用@param将参数传入。
针对第二个问题,如果传入的是javaBean的对象,则可以在insert标签中加useGeneratedKeys="true" keyProperty="id",还可以在语句下添加
<selectKey keyColumn="id" resultType="long" keyProperty="id" order="AFTER"> SELECT LAST_INSERT_ID() </selectKey>
也可以做到id自动的目的。注:由于数据库的不同order取值也不同,mysql数据库中order设置AFTER,而在oracle数据库中则应使用BEGORE。