mybatis是一个半自动的ORM(Object Relational Mapping)框架,需要手动配置一些SQL语句或者注解,相对来说Mybatis留给程序员操作的空间灵活度更高,通常需要手动配置一些东西完成OR映射。当数据库表中的字段 和 POJO实体类不匹配时,这是就需要程序员手动完成字段的映射。
-
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="db.properties"/> <settings> <!-- 使用日志进行帮忙查看 --> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> <typeAliases> <!-- 取个别名 --> <typeAlias type="com.pojo.User" alias="user"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/dao/UserMapper.xml"/> </mappers> </configuration>
-
mybatisUtil加载工具类
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 java.io.IOException; import java.io.InputStream; public class mybatisUtil { private static SqlSessionFactory sqlSessionFactory = null; static { try { String resource = "mybatis-config.xml"; InputStream in = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); } catch (IOException e) { e.printStackTrace(); } } public static SqlSession getSqlsession(){ return sqlSessionFactory.openSession(); } }
-
POJO实体类User,为了方便简单实用Lombok注解,减少一些代码。
package com.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data //各种get / set方法 Tostring... @AllArgsConstructor //全参构造 @NoArgsConstructor //无参构造 public class User { private int id; //对应数据库中的id private String username; //对应数据库中的name private String password; //对应数据库中的pwd }
-
接口方法与对应的xml配置文件
package com.dao; import com.pojo.User; import java.util.List; public interface UserMapper { List<User> getUserList(); }
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="com.dao.UserMapper"> <select id="getUserList" resultType="user"> select *from user; </select> </mapper>
1. POJO实体类 和 数据表字段不匹配
@Test
public void test1(){
SqlSession session = mybatisUtil.getSqlsession();
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> list = mapper.getUserList();
for (User user : list) {
System.out.println(user.toString());
}
session.close();
}
POJO实体类中有两个字段和数据库的字段不匹配,最后获得结果的时对于匹配失败的属性会产生null空值。使用输出日志进行帮忙很容易看到区别。
简单的解决方案:就是SQL语句查询时给查询字段使用重命名。
select id, name as username, pwd as password from user
2. resultMap解决属性 - 字段不匹配问题
上面这种解决方案是能够解决问题的,但是有点冗余本身就要查全部的信息用的 * 做通配。这么一改需要每个字段都列出来,然后对极个别的字段进行取别名。试想一下当数据表中有几十个字段呢?而真正需要取别名的字段只有1 - 2个呢?因此mybatis提供了一个强大的机制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.dao.UserMapper">
<!--
1. id可以认为是定义方法名,整个resultMap是一个映射方法,调用这个方法就可以完成这个映射。
2. type是实体类的名称
-->
<resultMap id="FieldMap" type="user">
<!-- column 是数据库字段名 property是实体类属性名 -->
<result column="name" property="username"/>
<result column="pwd" property="password"/>
</resultMap>
<select id="getUserList" resultMap="FieldMap">
select *from user
</select>
</mapper>
resultMap标签的解释:
-
id可以认为定义方法的名称,下面select中的resultMap传入id的值就相当于使用这个方法完成映射。
-
type是实体类名
-
column对应数据库中的字段
-
property是实体类的属性。
转载:https://blog.csdn.net/weixin_43808717/article/details/116140200
查看评论