时间:2021-05-20
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
一对一映射
在生活中,一对一的例子还是有的,比如啦,学生和身份证哦,或者在我国,实行的是一夫一妻制度哦。那么我们以学生和身份证每个学生只有一张身份证,而每张身份证的主人当然只有一个啦。
数据库脚本:
-- 删除数据库drop database if exists mybaits;-- 创建数据库create database if not exists mybatis default character set utf8;-- 选择数据库use mybatis;-- 删除数据表drop table if exists student ;drop table if exists card;-- 创建数据表create table card(cid int(255),num varchar(18),constraint pk_cid primary key (cid));create table student(sid int(255),sname varchar(32),scid int(255),constraint pk_sid primary key (sid),constraint fk_scid foreign key (scid) references card(cid));-- 增加测试数据insert into card (cid,num) values(1,'123456789012345678');insert into student (sid,sname,scid) values(1,'哈哈',1);新建一个one2one.Card.java类
package one2one;import java.io.Serializable;/*** 身份证* @author Administrator**/@SuppressWarnings("serial")public class Card implements Serializable{private Integer cid;private String num;public Integer getCid() {return cid;}public void setCid(Integer cid) {this.cid = cid;}public String getNum() {return num;}public void setNum(String num) {this.num = num;}}新建one2one.Student.java类
package one2one;import java.io.Serializable;/*** 学生* @author Administrator**/@SuppressWarnings("serial")public class Student implements Serializable{private Integer sid;private String sname;private Card card;public Integer getSid() {return sid;}public void setSid(Integer sid) {this.sid = sid;}public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}public Card getCard() {return card;}public void setCard(Card card) {this.card = card;}}在one2one包下新建CardMapper.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="cardNameSpace"><resultMap type="one2one.Card" id="cardMap"><id column="cid" property="cid"/><result column="num" property="num"/></resultMap></mapper>同理,在one2one包下新建StudentMapper.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="studentNameSpace"><resultMap type="one2one.Student" id="studentMap"><id column="sid" property="sid"/><result column="sname" property="sname"/><!-- 关联字段不要写 --></resultMap><select id="findById" parameterType="integer" resultMap="studentMap">select s.sid,s.sname,c.cid,c.num from student s,card cwhere s.scid = c.cid and s.sid = #{sid}</select></mapper>在src下新建一个mybatis.cfg.xml文件,并包含StudentMapper.xml和CardMapper.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><!-- 设置一个默认的环境信息 --><environments default="mysql_developer"><!-- 连接MySQL环境信息 --><environment id="mysql_developer"><!-- MyBatis使用jdbc事务管理器 --><transactionManager type="jdbc"/><!-- MyBatis使用连接池方式来获取连接对象 --><dataSource type="pooled"><!-- 配置与数据库交互的4个必要属性 --><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis"/><property name="username" value="root"/><property name="password" value="mysqladmin"/></dataSource></environment><!-- 连接Oracle环境信息 --><environment id="oracle_developer"><!-- MyBatis使用jdbc事务管理器 --><transactionManager type="jdbc"/><!-- MyBatis使用连接池方式来获取连接对象 --><dataSource type="pooled"><!-- 配置与数据库交互的4个必要属性 --><property name="driver" value="oracle.jdbc.driver.OracleDriver"/><property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/><property name="username" value="scott"/><property name="password" value="tiger"/></dataSource></environment></environments><!-- 加载映射文件 --><mappers><mapper resource="one2one/CardMapper.xml"/><mapper resource="one2one/StudentMapper.xml"/></mappers></configuration>在util包下新建一个工具类MyBatisUtil.java类
package util;import java.io.IOException;import java.io.Reader;import java.sql.Connection;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;public class MyBatisUtil {private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();public static SqlSessionFactory sqlSessionFactory ;//私有化构造方法private MyBatisUtil(){}//加载位于src/Mybatis.cfg.xmlstatic{try {Reader reader = Resources.getResourceAsReader("mybatis.cfg.xml");sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);} catch (IOException e) {e.printStackTrace();}} /*** 获取SQLSession* @return*/public static SqlSession getSqlSession(){//从当前线程中获取SqlSession对象SqlSession sqlSession = threadLocal.get();if(sqlSession == null){if(sqlSessionFactory != null){sqlSession = sqlSessionFactory.openSession();//讲sqlSession与当前线程绑定在一起threadLocal.set(sqlSession);}}return sqlSession;}/*** 关闭SqlSession 并与当前线程分开*/public static void closeSqlSession(){//从当前线程中获取SqlSession对象SqlSession sqlSession = threadLocal.get();//如果SqlSession对象非空if(sqlSession != null){//关闭SqlSession对象sqlSession.close();//分离当前线程与SqlSession的关系threadLocal.remove();}}//测试public static void main(String[] args) {SqlSession sqlSession = MyBatisUtil.getSqlSession();Connection conn= sqlSession.getConnection();System.out.println(conn != null ?"连接成功":"连接失败");} }新建持久层类StuentCardDAO.java类
package one2one;import org.apache.ibatis.session.SqlSession;import org.junit.Test;import util.MyBatisUtil;/*** 持久层* @author Administrator**/public class StudentCardDAO {/*** 查询1号学生的信息与身份证信息* @param id* @return* @throws Exception*/public Student findById(Integer id) throws Exception{SqlSession sqlSession = null;try {sqlSession = MyBatisUtil.getSqlSession();return sqlSession.selectOne("studentNameSpace.findById", id);} catch (Exception e) {e.printStackTrace();throw e;}finally{MyBatisUtil.closeSqlSession();}}//测试 查询1号学生的信息与身份证信息@Testpublic void testFindById() throws Exception{StudentCardDAO dao = new StudentCardDAO();Student student = dao.findById(1);System.out.println(student.getSid()+":"+student.getSname() } }这时我们只能查询1号学生的姓名,但是我们不能去查询它的身份号号,因为此时的card属性的值为null,从StudentMapper.xml中可以看出
<select id="findById" parameterType="integer" resultMap="studentMap">MyBatis在解析这一句的时候只能将查询的数据封装到sid,sname中,所以怎么办?
在StudentMapper.xml中的
<resultMap type="one2one.Card" id="cardMap"><id column="cid" property="cid"/><result column="num" property="num"/></resultMap>增加
<!-- 引入CardMapper.xml文件中的映射信息property表示Student的关联属性--><association property="card" resultMap="cardNameSpace.cardMap"/>那么此时的StudentMapper.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="studentNameSpace"><resultMap type="one2one.Student" id="studentMap"><id column="sid" property="sid"/><result column="sname" property="sname"/><!-- 引入CardMapper.xml文件中的映射信息property表示Student的关联属性--><association property="card" resultMap="cardNameSpace.cardMap"/></resultMap><select id="findById" parameterType="integer" resultMap="studentMap">select s.sid,s.sname,c.cid,c.num from student s,card cwhere s.scid = c.cid and s.sid = #{sid}</select></mapper>现在可以测试学生的身份证号码了
将持久层类StuentCardDAO.java类的测试方法改为
//测试 查询1号学生的信息与身份证信息@Testpublic void testFindById() throws Exception{StudentCardDAO dao = new StudentCardDAO();Student student = dao.findById(1);System.out.println(student.getSid()+":"+student.getSname()+":"+student.getCard().getNum());}同理
在StudentDAO.java类中增加 查询“哈哈”学生的信息与身份证信息的方法
/*** 查询“哈哈”学生的信息与身份证信息* @param name* @return* @throws Exception*/public Student findByName(String name) throws Exception{SqlSession sqlSession = null;try {sqlSession = MyBatisUtil.getSqlSession();return sqlSession.selectOne("studentNameSpace.findByName", name);} catch (Exception e) {e.printStackTrace();throw e;}finally{MyBatisUtil.closeSqlSession();}}并增加测试方法哦
//测试 查询“哈哈”学生的信息与身份证信息@Testpublic void testFindByName() throws Exception{StudentCardDAO dao = new StudentCardDAO();Student student = dao.findByName("哈哈");System.out.println(student.getSid()+":"+student.getSname()+":"+student.getCard().getNum());}当然如果你现在就测试,你会死的很惨,因为你没有在StudentMapper.xml文件中配置<select>哦,所以在StudentMapper.xml文件中增加<select>配置信息
<select id="findByName" parameterType="string" resultMap="studentMap">select s.sid,s.sname,c.cid,c.num from student s,card cwhere s.scid = c.cid and s.sname = #{sname}</select>这样就可以测试成功了。大功告成。
完整代码如下:
MySQL数据库脚本
-- 删除数据库drop database if exists mybaits;-- 创建数据库create database if not exists mybatis default character set utf8;-- 选择数据库use mybatis;-- 删除数据表drop table if exists student ;drop table if exists card;-- 创建数据表create table card(cid int(255),num varchar(18),constraint pk_cid primary key (cid));create table student(sid int(255),sname varchar(32),scid int(255),constraint pk_sid primary key (sid),constraint fk_scid foreign key (scid) references card(cid));-- 增加测试数据insert into card (cid,num) values(1,'123456789012345678');insert into student (sid,sname,scid) values(1,'哈哈',1);工具类MyBatis.java类
package util;import java.io.IOException;import java.io.Reader;import java.sql.Connection;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;public class MyBatisUtil {private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();public static SqlSessionFactory sqlSessionFactory ;//私有化构造方法private MyBatisUtil(){}//加载位于src/Mybatis.cfg.xmlstatic{try {Reader reader = Resources.getResourceAsReader("mybatis.cfg.xml");sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);} catch (IOException e) {e.printStackTrace();}} /*** 获取SQLSession* @return*/public static SqlSession getSqlSession(){//从当前线程中获取SqlSession对象SqlSession sqlSession = threadLocal.get();if(sqlSession == null){if(sqlSessionFactory != null){sqlSession = sqlSessionFactory.openSession();//讲sqlSession与当前线程绑定在一起threadLocal.set(sqlSession);}}return sqlSession;}/*** 关闭SqlSession 并与当前线程分开*/public static void closeSqlSession(){//从当前线程中获取SqlSession对象SqlSession sqlSession = threadLocal.get();//如果SqlSession对象非空if(sqlSession != null){//关闭SqlSession对象sqlSession.close();//分离当前线程与SqlSession的关系threadLocal.remove();}}//测试public static void main(String[] args) {SqlSession sqlSession = MyBatisUtil.getSqlSession();Connection conn= sqlSession.getConnection();System.out.println(conn != null ?"连接成功":"连接失败");} }mybatis.cfg.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><!-- 设置一个默认的环境信息 --><environments default="mysql_developer"><!-- 连接MySQL环境信息 --><environment id="mysql_developer"><!-- MyBatis使用jdbc事务管理器 --><transactionManager type="jdbc"/><!-- MyBatis使用连接池方式来获取连接对象 --><dataSource type="pooled"><!-- 配置与数据库交互的4个必要属性 --><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis"/><property name="username" value="root"/><property name="password" value="mysqladmin"/></dataSource></environment><!-- 连接Oracle环境信息 --><environment id="oracle_developer"><!-- MyBatis使用jdbc事务管理器 --><transactionManager type="jdbc"/><!-- MyBatis使用连接池方式来获取连接对象 --><dataSource type="pooled"><!-- 配置与数据库交互的4个必要属性 --><property name="driver" value="oracle.jdbc.driver.OracleDriver"/><property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/><property name="username" value="scott"/><property name="password" value="tiger"/></dataSource></environment></environments><!-- 加载映射文件 --><mappers><mapper resource="one2one/CardMapper.xml"/><mapper resource="one2one/StudentMapper.xml"/></mappers></configuration>Card.java和Student.java
package one2one;import java.io.Serializable;/*** 身份证* @author Administrator**/@SuppressWarnings("serial")public class Card implements Serializable{private Integer cid;private String num;public Integer getCid() {return cid;}public void setCid(Integer cid) {this.cid = cid;}public String getNum() {return num;}public void setNum(String num) {this.num = num;}}package one2one;import java.io.Serializable;/*** 学生* @author Administrator**/@SuppressWarnings("serial")public class Student implements Serializable{private Integer sid;private String sname;private Card card;public Integer getSid() {return sid;}public void setSid(Integer sid) {this.sid = sid;}public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}public Card getCard() {return card;}public void setCard(Card card) {this.card = card;}}Card.java的映射文件CardMapper.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="cardNameSpace"><resultMap type="one2one.Card" id="cardMap"><id column="cid" property="cid"/><result column="num" property="num"/></resultMap></mapper>Student.java类对应的映射文件StudentMapper.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="studentNameSpace"><resultMap type="one2one.Student" id="studentMap"><id column="sid" property="sid"/><result column="sname" property="sname"/><!-- 引入CardMapper.xml文件中的映射信息property表示Student的关联属性--><association property="card" resultMap="cardNameSpace.cardMap"/></resultMap><select id="findById" parameterType="integer" resultMap="studentMap">select s.sid,s.sname,c.cid,c.num from student s,card cwhere s.scid = c.cid and s.sid = #{sid}</select><select id="findByName" parameterType="string" resultMap="studentMap">select s.sid,s.sname,c.cid,c.num from student s,card cwhere s.scid = c.cid and s.sname = #{sname}</select></mapper>持久层类StudentCardDAO.java类
package one2one;import org.apache.ibatis.session.SqlSession;import org.junit.Test;import util.MyBatisUtil;/*** 持久层* @author Administrator**/public class StudentCardDAO {/*** 查询1号学生的信息与身份证信息* @param id* @return* @throws Exception*/public Student findById(Integer id) throws Exception{SqlSession sqlSession = null;try {sqlSession = MyBatisUtil.getSqlSession();return sqlSession.selectOne("studentNameSpace.findById", id);} catch (Exception e) {e.printStackTrace();throw e;}finally{MyBatisUtil.closeSqlSession();}}/*** 查询“哈哈”学生的信息与身份证信息* @param name* @return* @throws Exception*/public Student findByName(String name) throws Exception{SqlSession sqlSession = null;try {sqlSession = MyBatisUtil.getSqlSession();return sqlSession.selectOne("studentNameSpace.findByName", name);} catch (Exception e) {e.printStackTrace();throw e;}finally{MyBatisUtil.closeSqlSession();}}//测试 查询1号学生的信息与身份证信息@Testpublic void testFindById() throws Exception{StudentCardDAO dao = new StudentCardDAO();Student student = dao.findById(1);System.out.println(student.getSid()+":"+student.getSname()+":"+student.getCard().getNum());}//测试 查询“哈哈”学生的信息与身份证信息@Testpublic void testFindByName() throws Exception{StudentCardDAO dao = new StudentCardDAO();Student student = dao.findByName("哈哈");System.out.println(student.getSid()+":"+student.getSname()+":"+student.getCard().getNum());}}以上所述是小编给大家介绍的MyBatis一对一映射初识教程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
一、延迟加载 resultMap可以实现高级映射(使用association、collection实现一对一及一对多映射),association、colle
目的:记录数据库表与实体对象之间不同的映射关系如何用mybatis的自定义sql和结果返回集处理。1、三种对象映射关系1.1一对一一个人对应一个身份证,一位同学
有时候我们在查询数据库时,需要以查询结果为查询条件进行关联查询。在mybatis中通过association标签(一对一查询,collection一对多查询)实
关键字:association一对一映射(一个班级只有一个班主任)select*fromclassc,teachertwherec.teacher_id=t.t
一对一查询在实际开发中,经常会遇到一对一查询,一对多查询等。这里我们先来看一对一查询。例如:每本书都有一个作者,作者都有自己的属性,根据这个,我来定义两个实体类