前言:
如今同学们对“hibernatemysql映射”可能比较关心,咱们都想要剖析一些“hibernatemysql映射”的相关资讯。那么小编同时在网摘上收集了一些关于“hibernatemysql映射””的相关文章,希望兄弟们能喜欢,姐妹们一起来了解一下吧!作为一名Java资深程序猿,最多的感受可能就是我们接触了很多的业务,很多的技术,但是最终玩的还是数据。那么对于操作数据库中的数据,Java语言也陆续衍生出来许多框架,比如Jdbc、Hibernate、Mybatis、Mybatis-plus、springdatajpa等等。这些框架都对操作数据库数据提供了很友好的支持。那么,本篇内容主要来介绍下Mybatis框架是如何处理返回结果集的。
一、环境准备
1. 引入依赖
在pom.xml中引入Mybatis相关jar依赖
<!--MyBatis框架-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!-- -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2. 引入日志文件
log4j日志级别如下:
A:off 最高等级,用于关闭所有日志记录。
B:fatal 指出每个严重的错误事件将会导致应用程序的退出。
C:error 指出虽然发生错误事件,但仍然不影响系统的继续运行。
D:warn 表明会出现潜在的错误情形。
E:info 一般和在粗粒度级别上,强调应用程序的运行全程。
F:debug 一般用于细粒度级别上,对调试应用程序非常有帮助。
G:all 最低等级,用于打开所有日志记录。
但log4j只建议使用4个级别,优先级从高到低分别是:error>warn>info>debug
log4j.rootLogger =debug,systemOut,logFile
#输出到控制台
log4j.appender.systemOut = org.apache.log4j.ConsoleAppender
log4j.appender.systemOut.layout = org.apache.log4j.PatternLayout
log4j.appender.systemOut.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n
log4j.appender.systemOut.Target = System.out
#输出到文件
log4j.appender.logFile = org.apache.log4j.FileAppender
log4j.appender.logFile.layout = org.apache.log4j.PatternLayout
log4j.appender.logFile.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n
log4j.appender.logFile.File = E:/log/log4j.log
log4j.appender.logFile.Encoding = UTF-8
#将日志输记录到MySQL数据库
#log4j.appender.logDB = org.apache.log4j.jdbc.JDBCAppender
#log4j.appender.logDB.layout = org.apache.log4j.PatternLayout
#log4j.appender.logDB.Driver = com.mysql.jdbc.Driver
#log4j.appender.logDB.URL = jdbc:mysql://localhost:3306/log4j?characterEncoding=utf-8
#log4j.appender.logDB.User = root
#log4j.appender.logDB.Password = root
#log4j.appender.logDB.Sql = INSERT INTO t_log4j(project_name,create_date,level,category,file_name,thread_name,line,all_category,message)values('mybatis','%d{yyyy-MM-ddHH:mm:ss}','%p','%c','%F','%t','%L','%l','%m')
3. 引入mybatis核心配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
";>
<configuration>
<!--1、加载外部配置文件-->
<properties resource="jdbc.properties"></properties>
<!--5、开启驼峰命名-->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!--4、配置别名-->
<typeAliases>
<package name="com.swk.jdbcTemplate.entity"/>
</typeAliases>
<!--2、配置数据源-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="url" value="${jdbc.url}"/>
</dataSource>
</environment>
</environments>
<!--3、配置映射-->
<mappers>
<!--<mapper resource="mapper/EmpMapper.xml"/>-->
<package name="com.swk.mapper"/>
</mappers>
</configuration>
4. 编写jdbc.properties文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.username=root
jdbc.password=123456
jdbc.url=jdbc:mysql://192.168.10.129:3306/mybatis-demo?characterEncoding=utf-8
二、代码实现
1.编写mapper接口
public interface StuMapper {
//1、返回单个简单类型数据
int getStuCount();
//2、返回实体类对象
Stu getStuById(int stuId);
//3、返回map类型
Map<String,Object> returnMap();
//4、返回list类型
List<Stu> returnList();
//5、resultMap手动映射
Stu selectStuByRM(int id);
}
2.编写mapper.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
";>
<mapper namespace="com.swk.mapper.StuMapper">
<!--1 返回单个简单类型数据-->
<select id="getStuCount" resultType="int">
select count(0) from t_stu
</select>
<!--2 返回实体类对象-->
<!-- 给每一个字段设置一个别名,让别名和Java实体类中属性名一致 -->
<select id="getStuById" resultType="stu">
select id stuId,stu_name stuName,stu_sex stuSex,stu_age stuAge from t_stu where id = #{stuId}
</select>
<!--3 返回map类型-->
<!--查询年龄最大的学员的姓名、年龄、性别-->
<select id="returnMap" resultType="map">
select stu_name stuName,stu_sex stuSex,stu_age stuAge from t_stu where stu_age = (SELECT max(stu_age) from t_stu);
</select>
<!--4 返回list类型-->
<select id="returnList" resultType="stu">
select id stuId,stu_name stuName,stu_sex stuSex,stu_age stuAge from t_stu
</select>
<!--5 返回值使用resultMap-手动映射-->
<select id="selectStuByRM" resultMap="selectStuMap">
select * from t_stu where id = #{stuId}
</select>
<resultMap id="selectStuMap" type="com.swk.jdbcTemplate.entity.Stu">
<id column="id" property="stuId"/>
<result column="stu_name" property="stuName"/>
<result column="stu_sex" property="stuSex"/>
<result column="stu_age" property="stuAge"/>
</resultMap>
</mapper>
三、单元测试
1. 代码准备:
@Before
public void init(){
// 加载核心配置文件
String path = "mybatis-config.xml";
InputStream inputStream = Mybatis03ResultTest.class.getClassLoader().getResourceAsStream(path);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
sqlSession = sqlSessionFactory.openSession();
stuMapper = sqlSession.getMapper(StuMapper.class);
}
@After
public void destory(){
sqlSession.commit();;
sqlSession.close();
}
2. 测试-返回单个简单类型数据
/**
* 1、返回单个简单类型数据
*/
@Test
public void getStuCount(){
System.out.println(stuMapper.getStuCount());
}
3. 测试-返回实体类对象
/**
* 2、返回实体类对象
*/
@Test
public void getStu(){
System.out.println(stuMapper.getStuById(1));
}
4. 测试-返回map类型数据
/**
* 3、返回map类型
* 适用于SQL查询返回的各个字段综合起来并不和任何一个现有的实体类对应,没法封装到实体类对象中。
* 能够封装成实体类类型的,可以不使用Map类型
*/
@Test
public void returnMap(){
Map<String, Object> map = stuMapper.returnMap();
Set<Map.Entry<String, Object>> entries = map.entrySet();
for (Map.Entry<String, Object> entry : entries) {
String key = entry.getKey();
Object value = entry.getValue();
System.out.println(key + "," + value);
}
}
5. 测试-返回list类型数据
/**
* 4、返回list类型
* 查询结果返回多个实体类对象,希望把多个实体类对象放在List集合中返回。
* 此时不需要任何特殊处理,在resultType属性中还是设置实体类类型即可
*/
@Test
public void returnList()
List<Stu> stus = stuMapper.returnList();
for (Stu stu : stus) {
System.out.println(stu);
}
}
6. 测试-返回resultMap结果集处理
/**
* 5、数据库表字段和实体类属性对应关系
* ① 全局配置自动识别驼峰式命名规则
* ② 别名,将字段的别名设置成和实体类属性一致
* ③ 使用resultMap
*/
@Test
public void selectStuByRM ()
Stu stu = stuMapper.selectStuByRM(1);
System.out.println(stu);
}
返回值处理-总结
MyBatis中返回值类型分两种 1.1 返回一般数据类型:resultType。1.2 返回复杂数据类型:resultMap。
两种类型使用分析 2.1 resultType主要用于接收处理返回值类型为一般数据类型的数据,比如基本数据类型,自定义类类型,List或者Map集合类型等。2.2 resultMap主要用于接收处理实体对象之间存在关联关系的数据。比如员工和部门,员工隶属于某个部门,那么在实体类属性声明中,我们需要将关联关系定义出来。这时,如果我们想要同时获取员工信息和所属部门信息,那么使用resultType这种返回值类型去接收结果集已经不能满足实际业务了,那么我们就需要借助resultMap来处理。
标签: #hibernatemysql映射