Springboot:mybatis与mapper.xml
(37条消息) Mybatis中mapper的实现原理_叩丁狼的博客-CSDN博客_mybatis中的mapper
(41条消息) 3.Mapper.xml 详解_Training.L的博客-CSDN博客_mapper.xml
Mybatis是一种利用Mapper接口来进行数据库查询和Java开发的ORM。
其中的Mapper接口(有时也称作Dao)中,只写了方法定义而没有具体的实现类,那它是如何实现具体的业务呢?
1、Mybatis的相关文件
1)mapper接口文件
接口文件中只是定义了方法,并没有具体的实现:
注:mapper接口有时也写成Dao
//dao包下写接口
public interface UserMapper { void save(User u); }
mapper只是个接口,在其中只是说了有哪些方法;
在映射文件mapper.xml中,写这些方法对应的SQL语句。
2)mapper.xml映射文件
<mapper namespace="com.mybatis.mapper.UserMapper"> <insert id="save" parameterType="com.entity.user"> INSERT INTO user (id, username, password) VALUES (NULL, #{username}, #{password}) </insert> </mapper>
以上边这段代码为例介绍,mapper映射文件(xml文件)如何与mapper接口方法相对应
①第一行:mapper的namespace属性为带包名的mapper接口
<mapper namespace="com.mybatis.mapper.UserMapper"> ... </mapper>
②<mapper>结构块内:构造增删改查对应的片段:
-
插入是<insert>、查询是<select>,删除是<delete>,更新是<update>;
-
片段的id属性是接口方法名;
-
片段的内容就是具体的SQL语句,其中的变量#{username},#{password}就是接口方法传入的Bean的成员变量,以上文为例,会自动组装为u.username和u.password。
本例中只是用到了INSERT方法,还可以用别的:
<!--对于想mysql这样的,支持自动增加key值得可以使用如下方式--> <insert id="insertStudent" parameterType="Student"useGeneratedKeys="true" keyProperty="studId"> INSERT INTO STUDENTS(NAME, EMAIL, PHONE) VALUES(#{name},#{email},#{phone}) </insert> <!--最后返回的id可以在传入的参数Student中找到,通过getXxx方法--> <!--对于像oracle这样的不支持的,需要通过某个queue来获取的,可以使用下面两种方式--> <insert id="insertStudent" parameterType="Student"> <selectKey keyProperty="studId" resultType="int" order="BEFORE"> SELECT ELEARNING.STUD_ID_SEQ.NEXTVAL FROM DUAL </selectKey> INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL, PHONE) VALUES(#{studId},#{name},#{email},#{phone}) </insert> <!--下面这种方式通过在表上建trigger来插入key,然后通过selectKey获取--> <insert id="insertStudent" parameterType="Student"> INSERT INTO STUDENTS(NAME,EMAIL, PHONE) VALUES(#{name},#{email},#{phone}) <selectKey keyProperty="studId" resultType="int" order="AFTER"> SELECT ELEARNING.STUD_ID_SEQ.CURRVAL FROM DUAL </selectKey> </insert> <update id="updateStudent" parameterType="Student"> UPDATE STUDENTS SET NAME=#{name}, EMAIL=#{email}, PHONE=#{phone} WHERE STUD_ID=#{studId} </update> <delete id="deleteStudent" parameterType="int"> DELETE FROM STUDENTS WHERE STUD_ID=#{studId} </delete> <!--返回值均为收此次sql语句执行影响到的数据行数-->
上文参数含义
- parameterType:Dao文件中的对应方法的参数类型;
- resultType:返回值类型(基本类型)
- resultMap:返回值类型(Bean)
问题
1、如何插入一条记录并获得该记录的ID?
通常我们在用insert往数据库中插入记录时,不会显式说明id的值,id是由数据库自行设置的自增主键,每当有新记录进来都会自动为其赋予一个id,那么如何获取这个id?
解决方法:
(41条消息) mybatis执行insert语句后,返回当前插入数据主键的方法_NmzI怼怼怼的博客-CSDN博客_mybatisinsert返回主键
(41条消息) Mybatis 在 insert 插入操作后返回主键 id_Aries66666的博客-CSDN博客_mybatisinsert返回主键
在mapper.xml中的插入项中,添加属性:
- useGeneratedKeys = "true"
- keyProperty="id"
这两项的含义是:
获取到的主键值会赋值给Bean(这个Bean由parameterType指定)的id属性。
<insert id="insertSearch" parameterType="com.zhz.selenium.pojo.Search" useGeneratedKeys="true" keyProperty="id"> insert into tab_search (keywordid, searchdate, successstate) VALUES(#{keyWordId}, #{searchDate}, #{successState}) </insert>
resultMap
当我们的JavaBean的属性与table的列名并非简单的一对一时(比如出现了属性名和列名不同、涉及嵌套等情况),可以在xml中通过resultMap的形式来指定它们的对应关系:
<?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" > <mapper namespace="com.yy.springbootmybatisxml.dao.UserDao" > <resultMap id="BaseResultMap" type="com.yy.springbootmybatisxml.bean.User" > <id column="id" property="id" jdbcType="INTEGER" /> <result column="name" property="name" jdbcType="VARCHAR" /> <result column="pwd" property="pwd" jdbcType="VARCHAR" /> <result column="age" property="age" jdbcType="INTEGER" /> </resultMap> <select id="login" resultType="java.lang.Long"> select u.id from t_user u where u.name=#{param1} and u.pwd=#{param2} </select> <select id="findUserById" resultMap="BaseResultMap"> select * from t_user u where u.id=#{id} </select> <insert id="register"> insert into t_user (name,age,pwd) values(#{param1},#{param2},#{param3}) </insert> </mapper>
以findUserById这段select为例:
<select id="findUserById" resultMap="BaseResultMap"> select * from t_user u where u.id=#{id} </select>
含义是,接口mapper中的findUserById方法,调用的select语句为select * from t_user u where u.id=#{id},返回结果为一个JavaBean,这个JavaBean由<resultMap>的type属性加以说明,是com.yy.springbootmybatisxml.bean.User,查询到的列与User的属性的对应关系,由resultMap的各行指定。
也就是说,resultType指定了返回结果为Java基本类型,而resultMap指定了返回结果不是基本类型,而是一个JavaBean。
注:#{id}的含义是,接口中该方法参数中的id
<sql>与<include refid="xxx">
mybatis include refid=“xxxx“的含义_bidianzhang的博客-CSDN博客
有时可能会出现下边这种SELECT语句
<sql id="Base_Column_List" > id, name, age, pwd </sql> <select id="findUserByName" resultMap="BaseResultMap"> select <include refid="Base_Column_List" /> from t_user where name=#{name} </select>
<include refid="xxx">的含义是,查询refid中指定的几个字段
3)配置文件.properties
在配置文件中,需要写明确mapper类及其对应的xml文件:
mybatis.typeAliasesPackage: com.yy.springbootmybatisxml.dao
mybatis.mapperLocations: classpath:mapper/*.xml
4)Service接口及实现类ServiceImpl
在Service类中调用mapper接口方法进行数据库操作。
需要用@Autowired注入之前的mapper接口
@Service public class UserServicesImpl implements UserServices { @Autowired private UserMapper userMapper; ... }
调用mapper方法
public Student save(User u){ userMapper.save(u); }