个人做电商网站icp,搞笑网站模板,wordpress 漫画主题,做文具的网站文章目录1 准备工作1.1 建表1.2 创建实体类1.3 引出一个问题方案1方案2方案32.完整代码项目结构EmpMapper接口Emp类SqlSessionUtils工具类EmpMapper.xmljdbc.propertieslog4j.xmlmybatis-config.xmlResultMapTest完整代码在后面
1 准备工作
1.1 建表
t_emp
添加测试数据
1.2 创建实体类
在src/main/java/com/rqs/mybatis/pojo下创建Emp类 Emp类
package com.rqs.mybatis.pojo;public class Emp {private Integer eid;private String empName;private Integer age;private String sex;private String email;public Integer getEid() {return eid;}public void setEid(Integer eid) {this.eid eid;}public String getEmpName() {return empName;}public void setEmpName(String empName) {this.empName empName;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex sex;}public String getEmail() {return email;}public void setEmail(String email) {this.email email;}public Emp() {}public Emp(Integer eid, String empName, Integer age, String sex, String email) {this.eid eid;this.empName empName;this.age age;this.sex sex;this.email email;}Overridepublic String toString() {return Emp{ eid eid , empName empName \ , age age , sex sex \ , email email \ };}
}1.3 引出一个问题 在之前实现查询功能的时候用到的都是resultType来设置默认的映射关系要求字段名数据库表中的字段名和属性名java类中的属性名保持一致例如下图所示字段名和属性名是一致的。 字段名 属性名 但是在本例中出现了字段名和属性名不一致的情况如下图 字段名要求单词与单词之间使用下划线连接
属性名单词与单词之间命名遵循驼峰原则 如下所示在进行查询操作的时候由于无法映射导致empName的查询结果为空
既然字段名和属性名不一致了那么该如何处理映射关系呢
方案1
在EmpMapper.xml的SQL语句中为字段起别名保持和属性名的一致 结果如下所示
方案2
在核心配置文件mybatis-config.xml中设置全局配置将_自动映射为驼峰 !--设置MyBatis的全局配置--!--将_自动映射为驼峰 --settingssetting namemapUnderscoreToCamelCase valuetrue//settings注意MyBatis核心配置文件标签的设置顺序要把settings放在properties和typeAlliases中间 properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?测试结果
方案3
在核心配置文件mybatis-config.xml中通过resultMap逐一设置自定义的映射关系 !--resultMap设置自定义映射关系id唯一标识不能重复type设置映射关系中的实体类类型子标签id专门用来设置主键的映射关系result设置普通字段的映射关系属性property设置映射关系中的属性名必须是type属性所设置的实体类类型中的属性名column设置映射关系中的字段名必须是sql语句查询出的字段名要注意1.属性名和字段名一致的话也要写property和column2.要在select标签中添加resultMap对应resultMap的id--resultMap idempResultMap typeEmpid propertyeid columneid/idresult propertyempName columnemp_name/resultresult propertyage columnage/resultresult propertysex columnsex/resultresult propertyemail columnemail/result/resultMap!--ListEmp getAllEmp();--select idgetAllEmp resultMapempResultMapselect * from t_emp/select测试结果
2.完整代码
项目结构 EmpMapper接口
package com.rqs.mybatis.mapper;import com.rqs.mybatis.pojo.Emp;
import org.apache.ibatis.annotations.Param;import java.util.List;public interface EmpMapper {/*** 查询所有的员工信息*/ListEmp getAllEmp();}
Emp类
package com.rqs.mybatis.pojo;public class Emp {private Integer eid;private String empName;private Integer age;private String sex;private String email;public Integer getEid() {return eid;}public void setEid(Integer eid) {this.eid eid;}public String getEmpName() {return empName;}public void setEmpName(String empName) {this.empName empName;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex sex;}public String getEmail() {return email;}public void setEmail(String email) {this.email email;}public Emp() {}public Emp(Integer eid, String empName, Integer age, String sex, String email) {this.eid eid;this.empName empName;this.age age;this.sex sex;this.email email;}Overridepublic String toString() {return Emp{ eid eid , empName empName \ , age age , sex sex \ , email email \ };}
}
SqlSessionUtils工具类
package com.rqs.mybatis.utils;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 SqlSessionUtils {public static SqlSession getSqlSession() {SqlSession sqlSession null;try {InputStream inputStream Resources.getResourceAsStream(mybatis-config.xml);SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(inputStream);sqlSession sqlSessionFactory.openSession(true);} catch (IOException e) {e.printStackTrace();}return sqlSession;}
}
EmpMapper.xml
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.rqs.mybatis.mapper.EmpMapper!--resultMap设置自定义映射关系id唯一标识不能重复type设置映射关系中的实体类类型子标签id设置主键的映射关系result设置普通字段的映射关系属性property设置映射关系中的属性名必须是type属性所设置的实体类类型中的属性名column设置映射关系中的字段名必须是sql语句查询出的字段名--resultMap idempResultMap typeEmpid propertyeid columneid/idresult propertyempName columnemp_name/resultresult propertyage columnage/resultresult propertysex columnsex/resultresult propertyemail columnemail/result/resultMap!--ListEmp getAllEmp();--select idgetAllEmp resultMapempResultMapselect * from t_emp/selectselect idgetAllEmpOld resultTypeEmp!--select eid,emp_name empName,age,sex,email from t_emp--select * from t_emp/select/mapperjdbc.properties
jdbc.drivercom.mysql.jdbc.Driver
jdbc.urljdbc:mysql://localhost:3306/mybatis
jdbc.usernameroot
jdbc.passwordrootlog4j.xml
?xml version1.0 encodingUTF-8 ?
!DOCTYPE log4j:configuration SYSTEM log4j.dtd
log4j:configuration xmlns:log4jhttp://jakarta.apache.org/log4j/appender nameSTDOUT classorg.apache.log4j.ConsoleAppenderparam nameEncoding valueUTF-8 /layout classorg.apache.log4j.PatternLayoutparam nameConversionPattern value%-5p %d{MM-dd HH:mm:ss,SSS}
%m (%F:%L) \n //layout/appenderlogger namejava.sqllevel valuedebug //loggerlogger nameorg.apache.ibatislevel valueinfo //loggerrootlevel valuedebug /appender-ref refSTDOUT //root
/log4j:configuration
mybatis-config.xml
?xml version1.0 encodingUTF-8 ?
!DOCTYPE configurationPUBLIC -//mybatis.org//DTD Config 3.0//ENhttp://mybatis.org/dtd/mybatis-3-config.dtd
configuration!-- MyBatis核心配置文件标签的顺序properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?--properties resourcejdbc.properties/properties!-- lt;!ndash;设置MyBatis的全局配置ndash;gt;settingssetting namemapUnderscoreToCamelCase valuetrue//settings--!--设置类型别名大小写不敏感。如果不设置alias则默认为类名大小写不敏感--typeAliases!--typeAlias: 设置某个类型的别名属性type 设置需要设置别名的类型alias 设置某个类型的别名如果不设置该属性那么该类型拥有默认的类名且不区分大小写--!--typeAlias typecom.rqs.mybatis.pojo.User aliasUser/typeAlias--!--推荐以包为单位将包下所有的类型设置默认的类型别名且不区分大小写--package namecom.rqs.mybatis.pojo//typeAliases!--设置连接数据库的环境--!--每一个environment都是具体连接数据库的环境--!--一个项目中只会用一个环境default用于使用默认使用的环境id表示连接数据库的环境的唯一标识 不能重复--environments defaultdevelopment!--transactionmanager:设置事务管理方式属性typeJDBC/MANAGEDJDBC: 在当前环境中执行sql时使用的时jdbc原声的事务管理方式需要手动的提交和回滚事务MANAGED被管理例如Spring--environment iddevelopmenttransactionManager typeJDBC/!-- dataSource配置数据源属性type设置数据源的类型typePOOLED:表示使用数据库连接池缓存数据库连接UNPOOLED表示不使用数据库连接池JNDI表示使用上下文中的数据源--dataSource typePOOLED!--设置连接数据库的驱动--property namedriver value${jdbc.driver}/!--设置连接地址--property nameurl value${jdbc.url}/!--注意如果在建sql表单的时候选了字符集如utf8这里的value要改成valuejdbc:mysql://localhost:3306/mybatis?characterEncodingutf8--!--用户名和密码--property nameusername value${jdbc.username}/property namepassword value${jdbc.password}//dataSource/environment/environments!--引入映射文件--mappers!--推荐以包为单位引入映射文件要求1。 mapper接口所在的包要和映射文件所在的包一致2。 mapper接口要和映射文件的名字一致--!-- com.rqs.mybatis.mapper创建包时要用/分隔这样才是目录否则这整一个就只是文件夹名字而已--package namecom.rqs.mybatis.mapper//mappers/configuration
ResultMapTest
package com.rqs.mybatis.test;import com.rqs.mybatis.mapper.EmpMapper;
import com.rqs.mybatis.pojo.Emp;
import com.rqs.mybatis.utils.SqlSessionUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;import java.util.List;public class ResultMapTest {/*** 解决字段名和属性名不一致的情况* a为字段起别名保持和属性名的一致* b设置全局配置将_自动映射为驼峰* setting namemapUnderscoreToCamelCase valuetrue/* c通过resultMap设置自定义的映射关系* resultMap idempResultMap typeEmp* id propertyeid columneid/id* result propertyempName columnemp_name/result* result propertyage columnage/result* result propertysex columnsex/result* result propertyemail columnemail/result* /resultMap*/Testpublic void testGetAllEmp(){SqlSession sqlSession SqlSessionUtils.getSqlSession();EmpMapper mapper sqlSession.getMapper(EmpMapper.class);ListEmp list mapper.getAllEmp();list.forEach(emp - System.out.println(emp));}}