基于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映射的一点心得(分享)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。