任务描述
通过前面几关的学习,我们已经已经了解了MyBatis
中最常用的部分。可是基本的增删改查操作虽然已经满足了我们大部分要求,但是我们在实际应用中还会遇到关联查询的问题。接下来将带领大家学习这一内容。
本关任务:根据人的id
查询出查询这个公民的身份号码及其所有信息。
相关知识
为了完成本关任务,你需要掌握:
- 高级结果映射;
- 用注解的方式一对一查询。
mm/src/main/resources/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>
<!--********** Begin **********-->
<!--给pojo包起别名-->
<typeAliases>
<package name="com.test.pojo"/>
</typeAliases>
<!--配置数据库连接环境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="123123"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件(mapper接口文件) -->
<mappers>
<mapper class="com.test.mapper.PersonMapper"/>
<mapper class="com.test.mapper.CardMapper"/>
</mappers>
<!--********** End **********-->
</configuration>
mm/src/main/java/com/test/mapper/CardMapper.java
package com.test.mapper;
import com.test.pojo.Card;
import org.apache.ibatis.annotations.Select;
public interface CardMapper {
/*********** Begin **********/
//查询
@Select("select * from card where pid = #{pid} ")
public Card getCard(int pid);
/*********** End **********/
}
mm/src/main/java/com/test/mapper/PersonMapper.java
package com.test.mapper;
import com.test.pojo.Person;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.mapping.FetchType;
public interface PersonMapper {
/*********** Begin **********/
//关联查询
@Select("select * from person where pid = #{pid}")
@Results({
@Result(id=true,column="pid",property="pid"),
@Result(column="pName",property="pName"),
@Result(column="age",property="age"),
@Result(column="pid",property="card",one=@One(select="com.test.mapper.CardMapper.getCard",fetchType= FetchType.EAGER))
})
public Person getPerson(int pid);
/*********** End **********/
}
mm/src/main/java/com/test/test/PersonTest.java
package com.test.test;
import com.test.mapper.PersonMapper;
import com.test.pojo.Person;
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.Reader;
import java.util.List;
public class PersonTest {
/*********** Begin **********/
private static SqlSessionFactory sqlSessionFactory;
//初始化
public static void init() {
try {
//通过Resources工具类将mybatis_config.xml配置文件读入Reader.
Reader reader = Resources.getResourceAsReader("mybatis_config.xml");
//通过SqlSessionFactoryBuilder建造类使用Reader创建SqlSessionFactory工厂对象。在创建SqlSessionFactory对象的过程中,首先解析mybatis_config.xml
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
/*********** End **********/
//查询数据
public static Person selectCard(int pid) {
/*********** Begin **********/
SqlSession sqlSession = null;
Person person = null;
init();
try {
//通过SqlSessionFactory工厂对象获取sqlSession。
sqlSession = sqlSessionFactory.openSession();
//通过mapper接口类的方法查找到mapper.xml中id="addUser"的方法执行SQL。
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
person = mapper.getPerson(pid);
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (sqlSession != null) {
//最后一定不要忘记关闭sqlSession。
sqlSession.close();
}
}
return person;
/*********** End **********/
}
}