Mybatis --05.mybatis中的ResultMap、Sql片段

版权声明:转载请注明原始链接 https://blog.csdn.net/sswqzx/article/details/83753146

一、ResultMap自定义属性名和表结构字段映射

ResultMap是mabatis中最重要最强大的元素、使用resultMap可以解决二大问题:

1)、pojo属性名和表结构字段名不一致的问题(有些情况下也不是标准的驼峰格式)

2)、完成高级查询、如、一对一、一对多、多对多

解决表字段和属性名不一致的问题有二种方法:

1、如果是驼峰似的命名规则可以在mybatis核心配置中设置<setting name = "mapUnderscoreToCamelCasse" value="true" />

2、使用ResultMap解决

3、加别名

下面使用ResultMap解决表结构和javaBean类字段名不一致问题

UserDaoMappers.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">
<!--映射文件的作用:用来存放sql语句
    namespace:命名空间
-->
<mapper namespace="UserDaoMapper">

    <!--resultMap自定义结果集映射关系-->
    <!--id:唯一标识-->
    <!--type:映射结果的类型-->
    <!--autoMapping:开启自动映射、列名对应相同名字属性、如果开启了驼峰匹配。会按照驼峰来匹配-->
    <!--id标签:映射主键、不要省略、column指库列名、property指定实体类属性名-->
    <!--result标签:映射普通属性-->
    <resultMap id="userMap" type="User" autoMapping="true">
        <id column="id" property="id" />
        <result column="user_name" property="userName" />
    </resultMap>

    <!--查询所有用户-->
    <select id="findAllUsers" resultType="User" resultMap="userMap">
        select * from tb_user;
    </select>

</mapper>

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>
    <!--引入外部属性资源文件-->
    <properties resource="jdbc.properties"/>
    <!--开启驼峰、让实体类的属性和数据库中的键一一映射-->
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="false"/>
    </settings>
    <!--开启别名-->
    <typeAliases>
        <!--<typeAlias type="com.sswblog.domain.User" alias="User" />-->
        <package name="com.sswblog.domain"/>
    </typeAliases>
    <!--
        environments标签:用于配置多个环境(测试环境、生产环境)
            default属性:默认环境的id
        environment标签:配置一个具体的环境
            id属性:一个具体环境的id
        transactionManager标签:指定事务的类型
            type属性:可以取的值有:JDBC|MANAGED
                JDBC:表示从数据源获取数据库连接来提交或回滚事务
                MANAGED:表示把事务交给容器来管理,一般不用
        dataSource标签:配置数据源
            type属性:指定数据源类型,可以取的值有:UNPOOLED|POOLED|JNDI
                UNPOOLED:无连接池的数据源,每次都重新获取数据库连接,使用完后关闭连接
                POOLED:带连接池的数据源
                JNDI:使用JNDI数据源
    -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--指定驱动类名-->
                <property name="driver" value="${jdbc.driverClass}"/>
                <!-- 指定连接地址 -->
                <property name="url" value="${jdbc.url}"/>
                <!-- 指定用户名 -->
                <property name="username" value="${jdbc.username}"/>
                <!-- 指定密码 -->
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--引入映射文件-->
    <mappers>
        <mapper resource="UserMappers.xml"></mapper>
        <mapper resource="UserDaoMappers.xml"></mapper>
    </mappers>

</configuration>

pojo、user.java

package com.sswblog.domain;

import java.io.Serializable;
import java.util.Date;

/**
 * @ Author     :ssw.
 * @ Date       :Created in 19:44 2018/11/4
 */
public class User implements Serializable {
    private static final long serialVersionUid = 1L;
    private Long id;
    private String userName;
    private String password;
    private String name;
    private Integer age;
    private Integer sex;
    private Date birthday;
    private Date created;
    private Date updated;

    public static long getSerialVersionUid() {
        return serialVersionUid;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Integer getSex() {
        return sex;
    }

    public void setSex(Integer sex) {
        this.sex = sex;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public Date getCreated() {
        return created;
    }

    public void setCreated(Date created) {
        this.created = created;
    }

    public Date getUpdated() {
        return updated;
    }

    public void setUpdated(Date updated) {
        this.updated = updated;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", password='" + password + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", sex=" + sex +
                ", birthday=" + birthday +
                ", created=" + created +
                ", updated=" + updated +
                '}';
    }
}

UserDao.java

package com.sswblog.dao;

import com.sswblog.domain.User;

import java.util.List;

/**
 * @ Author     :ShaoWei Sun.
 * @ Date       :Created in 0:06 2018/11/5
 */
public interface UserDao {
    /**
     * 查询所有用户
     * @return
     */
    public List<User> findAllUsers();

}

UserDaoImpl.java

package com.sswblog.dao.Impl;

import com.sswblog.dao.UserDao;
import com.sswblog.domain.User;
import org.apache.ibatis.session.SqlSession;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @ Author     :ShaoWei Sun.
 * @ Date       :Created in 0:06 2018/11/5
 */
public class UserDaoImpl implements UserDao {
    //dao层增删除改查需要SqlSession
    private SqlSession sqlSession = null;

    //构造方法
    public UserDaoImpl(SqlSession sqlSession) {
        this.sqlSession = sqlSession;
    }

    @Override
    public List<User> findAllUsers() {
        List<User> users = this.sqlSession.selectList("UserDaoMapper.findAllUsers");
        this.sqlSession.close();
        return users;
    }

}

UserDaoImplTest.java

package com.sswblog.test;

import com.sswblog.dao.Impl.UserDaoImpl;
import com.sswblog.dao.UserDao;
import com.sswblog.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.InputStream;
import java.util.Date;
import java.util.List;

/**
 * @ Author     :ShaoWei Sun.
 * @ Date       :Created in 15:05 2018/11/5
 */
public class UserDaoImplTest {
    private UserDao userDao = null;

    @Before
    public void setUp() throws Exception {
        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        userDao = new UserDaoImpl(sqlSession);
    }

    @Test
    public void findAllUsers() {
        List<User> list = userDao.findAllUsers();
        for (User user : list) {
            System.out.println("user = " + user);
        }
    }

}

二、SQL片段

1、用法一:

在映射文件UserDaoMappers.xml中标签可以定义一个sql片段、再需要用到该sql片段、用include标签引入

UserDaoMappers.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">
<!--映射文件的作用:用来存放sql语句
    namespace:命名空间
-->
<mapper namespace="UserDaoMapper">

    <!--resultMap自定义结果集映射关系-->
    <!--id:唯一标识-->
    <!--type:映射结果的类型-->
    <!--autoMapping:开启自动映射、列名对应相同名字属性、如果开启了驼峰匹配。会按照驼峰来匹配-->
    <!--id标签:映射主键、不要省略、column指库列名、property指定实体类属性名-->
    <!--result标签:映射普通属性-->
    <resultMap id="userMap" type="User" autoMapping="true">
        <id column="id" property="id" />
        <result column="user_name" property="userName" />
    </resultMap>
    <!--sql片段-->
    <sql id="commonSql">
        id,user_name,password,name,age,sex,birthday,created,updated
    </sql>

    <!--查询所有用户 resultMap为上面自定义resultMap-->
    <select id="findAllUsers" resultType="User" resultMap="userMap">
        select <include refid="commonSql"></include>  from tb_user
    </select>

</mapper>

UserDao.java

package com.sswblog.dao;

import com.sswblog.domain.User;

import java.util.List;

/**
 * @ Author     :ShaoWei Sun.
 * @ Date       :Created in 0:06 2018/11/5
 */
public interface UserDao {

    /**
     * 查询所有用户
     * @return
     */
    public List<User> findAllUsers();
}

UserDaoImpl.java

package com.sswblog.dao.Impl;

import com.sswblog.dao.UserDao;
import com.sswblog.domain.User;
import org.apache.ibatis.session.SqlSession;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @ Author     :ShaoWei Sun.
 * @ Date       :Created in 0:06 2018/11/5
 */
public class UserDaoImpl implements UserDao {
    //dao层增删除改查需要SqlSession
    private SqlSession sqlSession = null;

    //构造方法
    public UserDaoImpl(SqlSession sqlSession) {
        this.sqlSession = sqlSession;
    }

    @Override
    public List<User> findAllUsers() {
        List<User> users = this.sqlSession.selectList("UserDaoMapper.findAllUsers");
        this.sqlSession.close();
        return users;
    }

}

UserDaoImplTest.java

package com.sswblog.test;

import com.sswblog.dao.Impl.UserDaoImpl;
import com.sswblog.dao.UserDao;
import com.sswblog.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.InputStream;
import java.util.Date;
import java.util.List;

/**
 * @ Author     :ShaoWei Sun.
 * @ Date       :Created in 15:05 2018/11/5
 */
public class UserDaoImplTest {
    private UserDao userDao = null;

    @Before
    public void setUp() throws Exception {
        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        userDao = new UserDaoImpl(sqlSession);
    }

    @Test
    public void findAllUsers() {
        List<User> list = userDao.findAllUsers();
        for (User user : list) {
            System.out.println("user = " + user);
        }
    }
}

2、用法二:

当同一个sql片段可能在很多个mapper文件里都有使用、这个 时候就要添加一个映射文件、来统一管理

sql片段

创建CommonSql.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">
<mapper namespace="CommonSqlSpace">
    <sql id="CommonSqlId">
        id,user_name,password,name,age,sex,birthday,created,updated
    </sql>
</mapper>

mybatis-config.xml中引入CommonSql.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>
    <!--引入外部属性资源文件-->
    <properties resource="jdbc.properties"/>
    <!--开启驼峰、让实体类的属性和数据库中的键一一映射-->
    <!--<settings>-->
        <!--<setting name="mapUnderscoreToCamelCase" value="false"/>-->
    <!--</settings>-->
    <!--开启别名-->
    <typeAliases>
        <!--<typeAlias type="com.sswblog.domain.User" alias="User" />-->
        <package name="com.sswblog.domain"/>
    </typeAliases>
    <!--
        environments标签:用于配置多个环境(测试环境、生产环境)
            default属性:默认环境的id
        environment标签:配置一个具体的环境
            id属性:一个具体环境的id
        transactionManager标签:指定事务的类型
            type属性:可以取的值有:JDBC|MANAGED
                JDBC:表示从数据源获取数据库连接来提交或回滚事务
                MANAGED:表示把事务交给容器来管理,一般不用
        dataSource标签:配置数据源
            type属性:指定数据源类型,可以取的值有:UNPOOLED|POOLED|JNDI
                UNPOOLED:无连接池的数据源,每次都重新获取数据库连接,使用完后关闭连接
                POOLED:带连接池的数据源
                JNDI:使用JNDI数据源
    -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--指定驱动类名-->
                <property name="driver" value="${jdbc.driverClass}"/>
                <!-- 指定连接地址 -->
                <property name="url" value="${jdbc.url}"/>
                <!-- 指定用户名 -->
                <property name="username" value="${jdbc.username}"/>
                <!-- 指定密码 -->
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--引入映射文件-->
    <mappers>
        <mapper resource="UserMappers.xml"></mapper>
        <mapper resource="UserDaoMappers.xml"></mapper>
        <mapper resource="CommonSql.xml"></mapper>
    </mappers>

</configuration>

UserDaoMappers.xml中使用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">
<!--映射文件的作用:用来存放sql语句
    namespace:命名空间
-->
<mapper namespace="UserDaoMapper">

    <!--resultMap自定义结果集映射关系-->
    <!--id:唯一标识-->
    <!--type:映射结果的类型-->
    <!--autoMapping:开启自动映射、列名对应相同名字属性、如果开启了驼峰匹配。会按照驼峰来匹配-->
    <!--id标签:映射主键、不要省略、column指库列名、property指定实体类属性名-->
    <!--result标签:映射普通属性-->
    <resultMap id="userMap" type="User" autoMapping="true">
        <id column="id" property="id" />
        <result column="user_name" property="userName" />
    </resultMap>
    <!--&lt;!&ndash;sql片段&ndash;&gt;-->
    <!--<sql id="commonSql">-->
        <!--id,user_name,password,name,age,sex,birthday,created,updated-->
    <!--</sql>-->

    <!--查询所有用户-->
    <select id="findAllUsers" resultType="User" resultMap="userMap">
        select <include refid="CommonSqlSpace.CommonSqlId"></include>  from tb_user
    </select>

</mapper>

测试类

package com.sswblog.test;

import com.sswblog.dao.Impl.UserDaoImpl;
import com.sswblog.dao.UserDao;
import com.sswblog.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.InputStream;
import java.util.Date;
import java.util.List;

/**
 * @ Author     :ShaoWei Sun.
 * @ Date       :Created in 15:05 2018/11/5
 */
public class UserDaoImplTest {
    private UserDao userDao = null;

    @Before
    public void setUp() throws Exception {
        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        userDao = new UserDaoImpl(sqlSession);
    }
    @Test
    public void findAllUsers() {
        List<User> list = userDao.findAllUsers();
        for (User user : list) {
            System.out.println("user = " + user);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/sswqzx/article/details/83753146