MyBatis的一对一查询实现方式
2016-08-17 15:18
537 查看
Mybatis对查询结果的映射有两种, 一种是resultMap, 还有一种是resultType.
reusltType模式实现的映射需要保证数据表中的列名和映射对象的属性名要一致.
resultMap则可以由自己灵活配置.
要实现一对一的查询,先建立两个表, 一个stu表, 和一个card表, 为了简单就少列出几个字段.
然后, 引入mybatis需要的jar包, 编写主配置文件mappingConfig.xml:
这里并未使用spring,所以事务交给他本身管理.
接下来,编写对应的StuMapper.xml文件:
接下来,编写Mapper代理接口:
由于还没有使用spring,所以在测试的时候为了方便, 编写一个工具类用来获取sqlSession:
最后,可以来测试一下resultType的方法:
运行测试单元:
结果正确.
然后修改一下Stu.java类,添加一个card属性进去.
mapper代理类中添加响应的接口,然后进行测试:
这样就Ok了.
reusltType模式实现的映射需要保证数据表中的列名和映射对象的属性名要一致.
resultMap则可以由自己灵活配置.
要实现一对一的查询,先建立两个表, 一个stu表, 和一个card表, 为了简单就少列出几个字段.
-- stu表 CREATE TABLE `f_stu` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', `name` varchar(10) NOT NULL COMMENT '姓名', `study_num` varchar(20) NOT NULL COMMENT '学号', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 -- card表 CREATE TABLE `f_idcards` ( `id` int(11) NOT NULL AUTO_INCREMENT, `card_num` varchar(18) DEFAULT NULL COMMENT '卡号', `u_id` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `u_id` (`u_id`), CONSTRAINT `f_idcards_ibfk_1` FOREIGN KEY (`u_id`) REFERENCES `f_stu` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
然后, 引入mybatis需要的jar包, 编写主配置文件mappingConfig.xml:
这里并未使用spring,所以事务交给他本身管理.
<!-- mappingConfig.xml --> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD SQL Map Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties resource="jdbc.properties"></properties> <typeAliases> <package name="com.mybatis.po"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments> <!-- 加载配置文件 --> <mappers> <mapper resource="mapper/StuMapper.xml"/> </mappers> </configuration>
接下来,编写对应的StuMapper.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.mybatis.dao.StuMapper"> <!-- 查询学生信息和卡号 --> <select id="findStuAndCard" resultType="stuCardResult"> SELECT A.*, B.card_num FROM f_IDcards B, f_stu A WHERE A.id = B.u_id </select> </mapper>
resultType的结果是自定义的pojo:
将查询出来没有的列名映射过去;public class StuCardResult extends Stu{ private String card_num; public String getCard_num() { return card_num; } public void setCard_num(String card_num) { this.card_num = card_num; } }
接下来,编写Mapper代理接口:
public interface StuMapper { public List<StuCardResult> findStuAndCard() throws Exception; }
由于还没有使用spring,所以在测试的时候为了方便, 编写一个工具类用来获取sqlSession:
public class GetSqlSessionUtil { private static SqlSessionFactory sqlSessionFactory; public static SqlSession getSqlSession() throws Exception { if(sqlSessionFactory == null) { String resource = "mappingConfig.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } return sqlSessionFactory.openSession(); } }
最后,可以来测试一下resultType的方法:
public class StuTest { @Test public void test() throws Exception { SqlSession sqlSession = GetSqlSessionUtil.getSqlSession(); StuMapper stuMapper = sqlSession.getMapper(StuMapper.class); List<StuCardResult> list = stuMapper.findStuAndCard(); if(list != null) { for(StuCardResult result : list) { System.out.println(result.getCard_num()); } } } }
运行测试单元:
结果正确.
再使用resultMap来进行查询结果映射:
修改配置文件:<!-- StuMapper.xml --> <!-- 定义resultMap --> <resultMap type="stu" id="stuAndCardResultMap"> <id column="id" property="id"/> <result column="name" property="name"/> <result column="study_num" property="studyNum"/> <association property="card" column="u_id" javaType="Card"> <result column="card_num" property="cardNum"/> </association> </resultMap> <select id="findStuAndCardResultMap" resultMap="stuAndCardResultMap"> SELECT A.*, B.card_num FROM f_IDcards B, f_stu A WHERE A.id = B.u_id </select>
然后修改一下Stu.java类,添加一个card属性进去.
private String studyNum; //与property映射过来的属性名称一致 private Card card;
mapper代理类中添加响应的接口,然后进行测试:
这样就Ok了.
相关文章推荐
- mybatis 实现一对一,一对多,多对多关联查询 小结
- mybatis查询主要有三种方式实现
- MyBatis实现模糊查询的几种方式
- MyBatis注解方式与映射文件方式配合实现一对一,一对多,多对多(二)
- mybatis一对一的三种实现方式 数据准备: 使用mysql数据库作为测试。建表语句及测试数据: CREATE TABLE `classes` ( `class_id` int(11) NOT
- mybatis0202 一对一查询 resultType实现
- mybatis学习四 列表查询不同方式实现
- Mybatis模糊查询的两种实现方式
- Mybatis通过接口实现一对一及一对多的查询
- MyBatis注解方式与映射文件方式配合实现一对一,一对多,多对多(一)
- Mybatis实现关联表查询(一对一关联)
- mybatis一对一的三种实现方式
- MyBatis Review——使用resultType和resultMap实现一对一查询
- MyBatis之自查询使用递归实现 N级联动效果(两种实现方式)
- 【Mybatis】多参数查询与列表查询不同方式实现
- MyBatis配置一对一关联查询的两种方式及其双向获取时注意问题
- SSM搭建-Mybatis多参数查询与列表查询不同方式实现(18)
- 21、SSM框架-Mybatis多参数查询与列表查询不同方式实现(3)
- mybatis之resultMap实现一对一查询
- MyBatis实现关联表查询(一对一,一对多,联合查询,嵌套查询)