使用Mybatis框架,在业务需要对数据库进行关联查询的时候需使用关联映射
而关联映射分为关联单个对象与关联多个对象,即一对一、一对多的情况,且每种关联方式都可以有两种处理情况,即使用1条sql进行处理与使用2条sql进行处理,接下来开始分析
已有表关系如下(表的字段名与实体类中的属性名一致):
cn_user表:主键为cn_user_Id
cn_book表:主键为cn_book_id
已有java类信息如下:
1、entity.User.java
package entity;
import java.util.List;
public class User {
private String cn_user_id;//用户id,主键
private String cn_user_name;//用户姓名
private String cn_user_password;//用户密码
private List<Book> books;//用户拥有的书籍信息,用户与书籍是一对多的关系
public List<Book> getBooks() {
return books;
}
public void setBooks(List<Book> books) {
this.books = books;
}
public String getCn_user_id() {
return cn_user_id;
}
public void setCn_user_id(String cn_user_id) {
this.cn_user_id = cn_user_id;
}
public String getCn_user_name() {
return cn_user_name;
}
public void setCn_user_name(String cn_user_name) {
this.cn_user_name = cn_user_name;
}
public String getCn_user_password() {
return cn_user_password;
}
public void setCn_user_password(String cn_user_password) {
this.cn_user_password = cn_user_password;
}
@Override
public String toString() {
return "User [cn_user_id=" + cn_user_id + ", cn_user_name=" + cn_user_name + ", cn_user_password="
+ cn_user_password + ", books=" + books + "]";
}
}
2、entity.Book.java
package entity;
public class Book {
private String cn_book_id;//书籍id,主键
private String cn_user_id;//所属用户id,外键参照于用户表的主键
private String cn_book_name;//书籍名称
private User user;//书籍所属用户关系,书籍与用户为一对一
public String getCn_book_id() {
return cn_book_id;
}
public void setCn_book_id(String cn_book_id) {
this.cn_book_id = cn_book_id;
}
public String getCn_user_id() {
return cn_user_id;
}
public void setCn_user_id(String cn_user_id) {
this.cn_user_id = cn_user_id;
}
public String getCn_book_name() {
return cn_book_name;
}
public void setCn_book_name(String cn_book_name) {
this.cn_book_name = cn_book_name;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String toString() {
return "Book [cn_book_id=" + cn_book_id + ", cn_user_id=" + cn_user_id + ", cn_book_name=" + cn_book_name
+ ", user=" + user + "]";
}
}
3、dao.BookAndUserDao(Mapper映射器)
package dao;
import java.util.List;
import entity.Book;
public interface BookAndUserDao {
//关联单个对象
public List<Book> findBookAndUser1();//两条语句执行sql
public List<Book> findBookAndUser2();//一条语句执行sql
}
4、Spring-Mybatis(spring与mybatis的配置文件)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:jms="http://www.springframework.org/schema/jms"
xmlns:lang="http://www.springframework.org/schema/lang"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
http://www.springframework.org/schema/jms http://www.springframework.org/schema/tx/spring-jms-3.2.xsd
http://www.springframework.org/schema/lang http://www.springframework.org/schema/tx/spring-lang-3.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd">
<!-- 配置数据库连接及连接池 (Mysql) -->
<bean id="bds" class="org.apache.commons.dbcp.BasicDataSource">
<property name="username" value="root"></property>
<property name="password" value="root"></property>
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/cloud_note"></property>
</bean>
<!-- 配置SqlSessionFactoryBean -->
<bean id="ssfb" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="bds"></property>
<property name="mapperLocations" value="classpath:mapper/*.xml"></property>
</bean>
<!-- 配置Mapper扫描 (MapperScannerConfigurer) -->
<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="dao"></property>
</bean>
</beans>
5、BookAndUserMapper.xml(关键点,进行sql语句的配置)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<!-- namespace为命名空间,需与映射器全名一致 -->
<mapper namespace="dao.BookAndUserDao">
<!--使用一条sql语句来加载Book和关联的User(使用内连接)-->
<select id="findBookAndUser1" resultMap="bookMap_1" >
SELECT * FROM cn_book JOIN cn_user ON book.cn_user_id = user.cn_user_id
</select>
<!--书籍关联查询结果映射-->
<resultMap id="bookMap_1" type="entity.Book">
<!-- id指定主键,其余字段用result指定 -->
<id property="cn_book_id" column="cn_book_id"></id>
<result property="cn_user_id" column="cn_user_id"></result>
<result property="cn_book_name" column="cn_book_name"></result>
<!--映射关系,指定属性与属性的类型-->
<association property="user" javaType="entity.User">
<id property="cn_user_id" column="cn_user_id"></id>
<result property="cn_user_name" column="cn_user_name"></result>
<result property="cn_user_password" column="cn_user_password"></result>
</association>
</resultMap>
<!-- 使用两条sql语句来加载Book和关联的User(关联单个对象) -->
<select id="findBookAndUser2" resultMap="bookMap2">
select *from cn_book
</select>
<resultMap id="bookMap2" type="entity.Book">
<association property="user" javaType="entity.User" select="findUser"
column="cn_user_id"></association>
</resultMap>
<!-- 此处id必须与上面一致 -->
<select id="findUser" parameterType="String" resultType="entity.User">
select *from cn_user where cn_user_id=#{id}
</select>
</mapper>
以上便是一对一的关联查询的两种方式,如果还有不懂的可以评论或者私聊
重点:一对一是使用<association >标签