MyBatis映射器

Posted nuist__NJUPT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis映射器相关的知识,希望对你有一定的参考价值。

MyBatis映射器

MyBatis映射器主要内容有:核心配置文件,SQL映射文件,级联查询;MyBatis的强大之处在于SQL映射文件的编写。

MyBatis的核心配置文件配置了许多影响MyBatis行为的信息,这些配置信息通常只会配置在一个文件中,不会轻易改变,另外MyBatis与Spring整合后,MyBatis的核心配置文件将配置到Spring配置文件中,因此,在实际开发中,开发者需要修改MyBatis核心配置文件的情况并不多。
注意:MyBatis核心配置文件中的元素配置顺序不能颠倒,一旦颠倒,MyBatis的启动阶段将会发生异常。

映射器是MyBatis最重要的组件,有一个接口和一个XML文件组成,SQL映射文件常用的配置元素有select,insert,update,delete,sql,resultMap等
select元素:查询语句,可以自定义参数,返回结果集等
insert元素:插入语句,执行后返回一个整数,代表插入的行数。
update元素:更新语句,执行后返回一个整数,代表更新的行数
delete元素:删除语句,执行后返回一个整数,代表删除的行数
sql元素:定义一部分SQL,在多个位置被引用。
resultMap元素:提供映射规则,从数据库结果集中加载对象

下面演示一个案例:
1-创建web应用并在web文件夹的WEB-INF下导入相关jar包,并将jar包添加为项目库。


2- 创建mysql数据库spring,并在该数据库中创建表user,表中字段包括uid,usex,uname,并录入相关数据
3-在src目录下创建com.po包,在该包中创建持久化类MyUser,该类中的字段与数据库user表中一致。

public class MyUser {
    public Integer uid ; //主键
    public String uname ;
    public String usex ;

    public Integer getUid() {
        return uid;
    }

    public void setUid(Integer uid) {
        this.uid = uid;
    }

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public String getUsex() {
        return usex;
    }

    public void setUsex(String usex) {
        this.usex = usex;
    }
    @Override
    public String toString(){
        return "User [uid = " + uid + " uname = " + uname + " usex = " + usex + "]" ;
    }
}

4-在src目录下创建com.mybatis包,并在该包中创建SQL映射文件UserMapper.xml和MyBatis核心配置文件mybatis-config.xml
总结:select元素用于映射SQL的select语句,若要传递多个参数,可以使用Map对象传递多个参数,也可以使用JavaBean传递多个参数,insert元素用于SQL的插入语句,执行结果返回影响的行数,改元素有3个常用属性,分别为keyProperty:将插入或更新操作返回值赋值给PO的某个属性,keyColumn:设置哪一列是主键,userGeneratedKeys:获取数据库产生的主键,返回自增的字段作为主键,即主键回填;对于不支持主键回自动递增的数据库,例如Oracle,可以使用MyBatis的selectKey元素来自定义生成主键。使用update和delete映射SQL的更新和删除操作,对于结果集,可以使用Map对象或者POJO存储。
(1)SQL映射文件

<?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.dao.UserDao">
    <!--select元素用来映射SQL语句select语句,可以自定义结果和返回参数-->
    <!--根据uid查询一个用户信息-->
    <select id = "selectUserById" parameterType = "Integer" resultType = "com.po.MyUser">
        select * from user where uid = #{uid}
    </select>
    <!--查询王姓男性的用户信息,使用map对象传递多个参数-->
    <select id = "selectAllUser" resultType = "com.po.MyUser" parameterType = "map">
        select * from user
        where uname like concat('%',#{uname},'%')
        and usex = #{usex}
    </select>
    <!--查询王姓男性的用户信息,使用JavaBean传递多个参数-->
    <select id = "selectAllUser1" resultType = "com.po.MyUser" parameterType = "com.pojo.SelectUserParam">
        select * from user
        where uname like concat('%',#{uname},'%') and usex = #{usex}
    </select>
    <!--insert元素用于映射插入语句,MyBatis执行完一条插入语句将返回一个整数,表示其影响的行数-->
    <!--MySQL,SQL server等数据库可以采用自增主键的字段作为主键,有时候需要使用这个刚刚产生的主键,用于关联其它业务-->
    <!--添加一个用户,成功后将主键回填给uid-->
    <insert id = "addUser" parameterType = "com.po.MyUser" keyProperty = "uid" useGeneratedKeys="true">
        insert into user (uname,usex) values (#{uname}, #{usex})
    </insert>
    <!--如果在实际工程中不支持主键自动递增,例如Oracle,或者取消了主键自动递增的规则,可以使用MyBatis的selectKey元素自定义生成主键-->
    <insert id = "insertUser" parameterType = "com.po.MyUser">
        <!--先使用selectKey元素定义主键,然后再定义SQL语句,BEFORE是先产生主键,再执行SQL语句,keyProperty属性指定新生主键返回给po类-->
        <selectKey keyProperty="uid" resultType = "Integer" order = "BEFORE">
        <!--若最大的uid是空,则让1做为新的uid,若最大的uid非空,则让最大的uid+1作为新的uid-->
            select if(max(uid) is null, 1, max(uid) + 1) as newUid from user
        </selectKey>
        insert into user (uid, uname, usex) values(#{uid}, #{uname}, #{usex})
    </insert>
    <!--修改一个用户-->
    <update id = "updateUser" parameterType = "com.po.MyUser">
        update user set uname = #{uname}, usex = #{usex} where uid = #{uid}
    </update>
    <!--删除一个用户-->
    <delete id = "deleteUser" parameterType = "com.po.MyUser">
        delete from user where uid = #{uid}
    </delete>
    <!--sql元素的作用在于可以可以定义SQL语句的一部分,以方便后面的SQL引用它,例如仿佛使用的列名,在MyBatis只需使用sql元素编写依次,便能在其它元素中引用它-->
    <sql id ="comColumns"> uid, uname, usex </sql>
    <select id = "selectUser" resultType = "com.po.MyUser">
        select <include refid = "comColumns"/> from user
    </select>
    <!--使用Map存储结果集,查询所有用户信息存储到Map中-->
    <select id = "selectAllUserMap" resultType = "map">
        select * from user
    </select>
    <!--使用POJO存储结果集,使用自定义结果集类型-->
    <resultMap type = "com.pojo.MapUser" id = "MyResult">
        <!--property是com.pojo.MapUser类中的属性,column是查询结果的列名,可以来自不同的表,将数据表的列名映射到对应类的属性上-->
        <id property = "m_uid" column = "uid"/>
        <result property = "m_uname" column = "uname"/>
        <result property = "m_usex" column = "usex"/>
    </resultMap>
    <!--使用自定义结果集查询所有用户-->
    <select id="selectResultMap" resultMap = "MyResult">
        select * from user
    </select>

</mapper>

(2)MyBatis核心配置文件MyBatis-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org/= /DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--告诉MyBatis映射文件的位置-->
    <mappers>
        <mapper resource = "com/mybatis/UserMapper.xml"/>
    </mappers>
</configuration>

5-在src目录下创建包com.dao,在该包中创建数据访问接口UserDao,此接口和UserMapper.xml组成映射器,在该接口中需要编写与映射文件id对应的接口方法,同时该接口需要使用@Mapper和@Repositirty注解.


import com.po.MyUser;
import com.pojo.MapUser;
import com.pojo.SelectUserParam;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;
//数据访问层的注解,表示该层交给Spring管理
@Repository
@Mapper
/**
 * Spring将指定包中使用@Mapper注解的接口自动装配为MyBatis的映射接口
 */
public interface UserDao {
    //接口方法与映射文件UserMapper.xml的id对应
    public MyUser selectUserById(Integer uid) ;
    //返回是List形式的MyUser类型数据,参数是map类型
    public List<MyUser> selectAllUser(Map<String,Object> param) ;
    //返回的是List形式的MyUser类型的数据,参数是普通Java类
    public List<MyUser> selectAllUser1(SelectUserParam param) ;
    //添加一个用户
    public Integer addUser(MyUser myUser) ;
    //添加用户
    public Integer insertUser(MyUser myUser) ;
    //修改用户信息
    public Integer updateUser(MyUser myUser) ;
    //删除用户信息
    public Integer deleteUser(MyUser myUser) ;
    //查询用户
    public List<MyUser> selectUser() ;
    //查询用户存储到Map中
    public List<Map<String,Object>> selectAllUserMap() ;
    //查询用户存储到POJO中
    public List<MapUser> selectResultMap() ;

}

6-在src目录下创建日志文件log4j.properties,保证在控制台输出

# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

7-为了使用JavaBean传递多个参数和使用POJO方式存储结果集,在src目录下创建包com.pojo,在该包中创建类SelectUserParam和MapUser
SelectUserParam类:

public class SelectUserParam {
    private String uname ;
    private String usex ;

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public String getUsex() {
        return usex;
    }

    public void setUsex(String usex) {
        this.usex = usex;
    }
}

MapUser 类:

public class MapUser {
    private Integer m_uid ;
    private String m_uname ;
    private String m_usex ;

    public Integer getM_uid() {
        return m_uid;
    }

    public void setM_uid(Integer m_uid) {
        this.m_uid = m_uid;
    }

    public String getM_uname() {
        return m_uname;
    }

    public void setM_uname(String m_uname) {
        this.m_uname = m_uname;
    }

    public String getM_usex() {
        return m_usex;
    }

    public void setM_usex(String m_usex) {
        this.m_usex = m_usex;
    }
    public String toString(){
        return "User [uid = " + m_uid + " uname = " + m_uname + " usex = " + m_usex + "]" ;
    }
}

8-在src目录下创建包com.controller,在该报中创建类UserController,在该类中调用数据访问接口的方法。


import com.dao.UserDao;
import com.po.MyUser;
import com.pojo.MapUser;
import com.pojo.SelectUserParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
//控制层的注解,表示该层交给Spring管理
@Controller
public class UserController {
    @Autowired //依赖注入,将数据访问层注入到控制层,不用自己new,实现控制翻转
    public UserDao userDao ;
    public void test(){
        MyUser myUser = userDao.selectUserById(1) ;
        System.out.println(myUser) ;
        //利用map对象传递多个参数
        Map<String,Object> param = new HashMap<>() ;
        param.put("uname", "王") ;
        param.put("usex", "男") ;
        List<MyUser> myUser1 = userDao.selectAllUser(param) ;
        for(MyUser user1 : myUser1){
            System.out.println(user1) ;
        }
        //利用JavaBean传递多个参数
        SelectUserParam param1 = new SelectUserParam() ;
        param1.setUname("王") ;
        param1.setUsex("男") ;
        List<MyUser> myUser2 = userDao.selectAllUser1(param1) ;
        for(MyUser user2 : myUser2){
            System.out.println(user2) ;
        }
        //添加一个用户,主键回填(自动递增)
        MyUser myUser3 = new MyUser() ;
        myUser3.setUname("陈恒") ;
        myUser3.setUsex("男") ;
        int add = userDao.addUser(myUser3) ;
        System.out.println("添加了" + add + "条记录") ;
        System.out.println("添加记录的主键是" + myUser3.getUid()) ;
        //自定义主键
        MyUser myUser4 = new MyUser() ;
        myUser4.setUname("张国庆") ;
        myUser4.setUsex("男") ;
        int number = userDao.insertUser(myUser4) ;
        System.out.println("插入了" + number + "条记录") ;
        System.out.println("插入记录的主键是" + myUser4.getUid()) ;
        //修改一个用户
        MyUser myUser5 = new MyUser() ;
        myUser5.setUid(3) ;
        myUser5.setUname("李沁") ;
        myUser5.setUsex("女") ;
        int number1 = userDao.updateUser(myUser5) ;
        System.out.println("修改了" + number1 + "条记录") ;
        System.out.println("修改记录的主键为" + myUser5.getUid()) ;
        //删除一个用户
        MyUser myUser6 = new MyUser() ;
        myUser6.setUid(1) ;
        int number2 = userDao.deleteUser(myUser6) ;
        System.out.println("删除了" + number2 + "条记录") ;
        //查询用户
        List<MyUser> myUsers = userDao.selectUser() ;
        for(MyUser myUser7 : myUsers){
            System.out.println(myUser7) ;
        }
        //查询用户信息,用Map存储结果,多个Map对象存储到List中
        /**
         * Map中的key是select语句查询的字段名,而Map的value是查询结果中字段对应的值,
         * 一条记录映射到一个Map对象,多个记录则将多个Map对象存储到List中
         */
        List<Map<String,Object>> map = userDao.selectAllUserMap() ;
        for(Map<String,Object> map1 : map){
            System.out.println以上是关于MyBatis映射器的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis 生成器 - 生成映射器实现

MyBatis XML 映射器 selectinsert update 和 delete参数

MyBatis映射器

MyBatis配置文件--mappers映射器

MyBatis数据库连接的基本使用-补充Mapper映射器

mybatis之映射器