版权声明:转载请注明原始链接 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>
<!--<!–sql片段–>-->
<!--<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);
}
}
}