Mybatis的一对一查询(xml文件方式的实现)


一、Mapper 接口开发需要遵循以下规范:(图中是接口和xml文件的详细映射关系)

1) Mapper.xml文件中的namespace与mapper接口的全限定名相同

2) Mapper接口方法名和Mapper.xml中定义的每个statement的id相同

3) Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同

4) Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

二、Mybatis的具体使用(数据层mybatis单独使用)

1.Mybatis的配置文件MyBatisConfig.xml(此处的jdbc.properties文件省略\日志文件省略)

<?xml version="1.0" encoding="UTF-8" ?>
<!--MyBatis的DTD约束-->
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">

<!--configuration 核心根标签-->
<configuration>

<!--引入数据库连接的配置文件-->
<properties resource="jdbc.properties"/>

<!--配置LOG4J-->
<settings>
<setting name="logImpl" value="log4j"/>
</settings>

<!--起别名、bean下的是具体的实体类,这里起别名是为了在映射配置文件的时候,resultType可以直接写类的名字(第一个字母小写)不用写全类名-->
<typeAliases>
<package name="com.ithmy.bean"/>
</typeAliases>

<!--environments配置数据库环境,环境可以有多个。default属性指定使用的是哪个-->
<environments default="mysql">
<!--environment配置数据库环境 id属性唯一标识-->
<environment id="mysql">
<!-- transactionManager事务管理。 type属性,采用JDBC默认的事务-->
<transactionManager type="JDBC"></transactionManager>
<!-- dataSource数据源信息 type属性 连接池-->
<dataSource type="POOLED">
<!-- property获取数据库连接的配置信息 -->
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>

<!-- mappers引入映射配置文件 -->

<mappers>
<mapper resource="com/itheima/one_to_one/OneToOneMapper.xml"/>
</mappers>

</configuration>

2.一对一的实现:(card 中包含了person实体类)

实体类:card

package com.ithmy.bean;

public class Card {
private Integer id; //主键id
private String number; //身份证号

private Person p; //所属人的对象 *** 在表中是外键pid:人id,但是在javabean中一般都是外键对应的实体类javabean

//省略构造和set\get

}

实体类:person

package com.ithmy.bean;

public class Person {
private Integer id; //主键id
private String name; //人的姓名
private Integer age; //人的年龄

//省略构造和set\get

}

3.数据库配置文件:jdbc.properties(此配置必写)

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://192.168.59.143:3306/db2
username=root
password=itheima

4.日志文件:log4j.properties(此配置可有可无,如果无,要把上面的mybatis配置文件中的日志配置项删除,不然会报错)

# Global logging configuration
# ERROR WARN INFO DEBUG 
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

5.映射配置文件:新建com.ithmy.one_to_one.OneToOneMapper.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.ithmy.table01.OneToOneMapper">
<!--配置字段和实体对象属性的映射关系
type指定要配置的实体对象是哪个:card
-->
<resultMap id="oneToOne" type="card">
<!--id配置主键列:将sql中查询的cid列与card实体类中的id进行关联 -->
<id column="cid" property="id" />
<!--result配置非主键列-->
<result column="number" property="number" />
<!--
association:配置被包含对象的映射关系
property:被包含对象的变量名(属性名,在Card实体类中有一个p属性)
javaType:被包含对象的数据类型(直接给person别名,因为我们通过typeAliases统一设置了bean包下所有实体类的别名了)
-->
<association property="p" javaType="person">
<id column="pid" property="id" />
<result column="name" property="name" />
<result column="age" property="age" />
</association>
</resultMap>
<!--resultMap属性指定的是resultMap标签的id
查询出来的结果涉及到两张表,所以不能使用resultType了,数据库中不区分大小写,如果有字段写成了大写或者小写与数据库中的列不一致是不会出错的
-->
<select id="selectAll" resultMap="oneToOne">
SELECT c.id cid,number,pid,name,age FROM card c,person p WHERE c.pid=p.id
</select>
</mapper>

6.编写实现接口:com.ithmy.table01.OneToOneMapper

package com.ithmy.table01;

import com.ithmy.bean.Card;

import java.util.List;

public interface OneToOneMapper {
//查询全部
public abstract List<Card> selectAll();
}

7.测试:Test

package com.ithmy.table01;

import com.ithmy.bean.Card;
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 org.junit.Test;

import java.io.InputStream;
import java.util.List;

public class Test01 {
@Test
public void selectAll() throws Exception{
//1.加载核心配置文件
InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");

//2.获取SqlSession工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

//3.通过工厂对象获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession(true);

//4.获取OneToOneMapper接口的实现类对象,mybatis的配置文件里引入了映射信息
OneToOneMapper mapper = sqlSession.getMapper(OneToOneMapper.class);

//5.调用实现类的方法,接收结果
List<Card> list = mapper.selectAll();

//6.处理结果
for (Card c : list) {
System.out.println(c);
}

//7.释放资源
sqlSession.close();
is.close();
}
}

8.一对一操作总结:

<resultMap>:配置字段和对象属性的映射关系标签。
id 属性:唯一标识
type 属性:实体对象类型
<id>:配置主键映射关系标签。
<result>:配置非主键映射关系标签。
column 属性:表中字段名称
property 属性: 实体对象变量名称
<association>:配置被包含对象的映射关系标签。
property 属性:被包含对象的变量名
javaType 属性:被包含对象的数据类型

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM