基于Mybaits映射的一点心得(分享)
以前一直使用Hibernate,基本上没用过Mybatis,工作中需要做映射关系,简单的了解下Mybatis的映射。
两者相差不多都支持一对一,一对多,多对多,本章简单介绍一对一的使用以及注意点。
建表语句:
CREATETABLE`bloc`( `id`int(11)NOTNULLauto_increment, `name`varchar(255)collateutf8_bindefaultNULL, `company_id`int(11)defaultNULL, `intro`varchar(255)collateutf8_bindefaultNULL, PRIMARYKEY(`id`) )ENGINE=InnoDBAUTO_INCREMENT=2DEFAULTCHARSET=utf8COLLATE=utf8_bin; INSERTINTO`bloc`(`id`,`name`,`company_id`,`intro`)VALUES('1','宏伟集团','1','跨国集团');
CREATETABLE`company`( `id`int(11)NOTNULL, `name`varchar(255)collateutf8_bindefaultNULL, `intro`varchar(255)collateutf8_bindefaultNULL, PRIMARYKEY(`id`) )ENGINE=InnoDBDEFAULTCHARSET=utf8COLLATE=utf8_bin; INSERTINTOcompany(`id`,`name`,`intro`)VALUES('1','',NULL);
形式一:子查询
JAVA代码:SqlSessionHelper.java
packagecom.demo.mybatis; importjava.io.IOException; importjava.io.Reader; importorg.apache.ibatis.io.Resources; importorg.apache.ibatis.session.SqlSessionFactory; importorg.apache.ibatis.session.SqlSessionFactoryBuilder; publicclassSqlSessionHelper{ publicstaticSqlSessionFactorygetSessionFactory()throwsIOException{ SqlSessionFactorysessionFactory=null; Readerreader=Resources.getResourceAsReader("configuration.xml"); try{ sessionFactory=newSqlSessionFactoryBuilder().build(reader);; }catch(Exceptionex){ ex.printStackTrace(); } returnsessionFactory; } }
Test.java:
packagecom.demo.mybatis; importjava.util.List; importorg.apache.ibatis.session.SqlSession; importmapper.BlocMapper; importmodel.Bloc; publicclassTest{ /** *@paramargs */ publicstaticvoidmain(String[]args){ try{ SqlSessionsqlSession=SqlSessionHelper.getSessionFactory().openSession(); BlocMapperblocMapper=sqlSession.getMapper(BlocMapper.class); Listblocs=blocMapper.getBlocList("1"); for(Blocbloc:blocs){ System.out.println("companyName="bloc.getCompany().getName()); } }catch(Exceptionex){ System.out.println(ex.getMessage()); } } }
mapper:
packagemapper; importjava.util.List; importmodel.Bloc; publicinterfaceBlocMapper{ publicListgetBlocList(Stringname); }
packagemapper; publicinterfaceCompanyMapper{ }
model:
packagemodel; publicclassBloc{ privateIntegerid; privateStringname; privateStringintro; privateCompanycompany; publicIntegergetId(){ returnid; } publicvoidsetId(Integerid){ this.id=id; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } publicStringgetIntro(){ returnintro; } publicvoidsetIntro(Stringintro){ this.intro=intro; } publicCompanygetCompany(){ returncompany; } publicvoidsetCompany(Companycompany){ this.company=company; } }
packagemodel; publicclassCompany{ privateIntegerid; privateStringname; privateIntegerintro; publicIntegergetId(){ returnid; } publicvoidsetId(Integerid){ this.id=id; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } publicIntegergetIntro(){ returnintro; } publicvoidsetIntro(Integerintro){ this.intro=intro; } }
映射配置如下:(如果是一堆多的话“brandObject”改成实体List属性association改成collection)
select*fromcompanywhereid=#{id}
select*fromblocwherename=#{name}
column:表中的字段property:实体当中的字段名select:引入的另一个xxxMapper.xml的getCompanyInfo方法
这样当查询用的映射时检测到有select就会执行你引入的另一个Mapper的查询方法,查询条件是company_id=查询方法的参数
运行结果
companyName=
形式二:关联查询
映射配置实体测试类一样:
select*fromblocbleftjoincompanyconb.company_id=c.idwhereb.name=#{name}
column:表中的字段property:实体当中的字段名resultMap:引入另一个Mapper的映射
值得注意的是:因为是嵌套映射,所以形式二在两个实体字段名一样的情况下会引发字段赋值的紊乱,例如两个实体都有name当第一个实体name有值,第二个实体name没有值的时候,查询出来的结果是两个实体name都有值,且都是一样的为第一个实体的name值
运行结果为
companyName=宏伟集团
显然运行结果不是我们想要的结果
以上简单的Demo希望能帮助初学Mybatis童鞋!!
这篇基于Mybaits映射的一点心得(分享)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。