java nullable mybatis,基于Mybaits映射的一点心得(分享)

以前一直使用Hibernate,基本上没用过Mybatis,工作中需要做映射关系,简单的了解下Mybatis的映射。

两者相差不多都支持一对一,一对多,多对多,本章简单介绍一对一的使用以及注意点。

建表语句:

CREATE TABLE `bloc` (

`id` int(11) NOT NULL auto_increment,

`name` varchar(255) collate utf8_bin default NULL,

`company_id` int(11) default NULL,

`intro` varchar(255) collate utf8_bin default NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

INSERT INTO`bloc` (`id`, `name`, `company_id`, `intro`) VALUES ('1', '宏伟集团', '1', '跨国集团');

CREATE TABLE `company` (

`id` int(11) NOT NULL,

`name` varchar(255) collate utf8_bin default NULL,

`intro` varchar(255) collate utf8_bin default NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

INSERT INTO company (`id`, `name`, `intro`) VALUES ('1', '', NULL);

形式一:子查询

JAVA代码:SqlSessionHelper.java

package com.demo.mybatis;

import java.io.IOException;

import java.io.Reader;

import org.apache.ibatis.io.Resources;

import org.apache.ibatis.session.SqlSessionFactory;

import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class SqlSessionHelper {

public static SqlSessionFactory getSessionFactory() throws IOException{

SqlSessionFactory sessionFactory = null;

Reader reader = Resources.getResourceAsReader("configuration.xml");

try{

sessionFactory = new SqlSessionFactoryBuilder().build(reader);;

}catch(Exception ex){

ex.printStackTrace();

}

return sessionFactory;

}

}

Test.java:

package com.demo.mybatis;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import mapper.BlocMapper;

import model.Bloc;

public class Test {

/**

* @param args

*/

public static void main(String[] args) {

try{

SqlSession sqlSession = SqlSessionHelper.getSessionFactory().openSession();

BlocMapper blocMapper = sqlSession.getMapper(BlocMapper.class);

List blocs = blocMapper.getBlocList("1");

for (Bloc bloc : blocs) {

System.out.println("companyName = "bloc.getCompany().getName());

}

}catch(Exception ex){

System.out.println(ex.getMessage());

}

}

}

mapper:

package mapper;

import java.util.List;

import model.Bloc;

public interface BlocMapper {

public List getBlocList(String name);

}

package mapper;

public interface CompanyMapper {

}

model:

package model;

public class Bloc {

private Integer id;

private String name;

private String intro;

private Company company;

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getIntro() {

return intro;

}

public void setIntro(String intro) {

this.intro = intro;

}

public Company getCompany() {

return company;

}

public void setCompany(Company company) {

this.company = company;

}

}

package model;

public class Company {

private Integer id;

private String name;

private Integer intro;

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Integer getIntro() {

return intro;

}

public void setIntro(Integer intro) {

this.intro = intro;

}

}

映射配置如下:(如果是一堆多的话“brandObject”改成实体List属性association 改成collection )

/p>

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

select * from company where id = #{id}

select * from bloc where name = #{name}

column:表中的字段 property:实体当中的字段名 select:引入的另一个xxxMapper.xml的getCompanyInfo方法

这样当查询用的映射时检测到有select就会执行你引入的另一个Mapper的查询方法,查询条件是company_id= 查询方法的参数

运行结果

companyName =

形式二:关联查询

映射配置实体测试类一样:

/p>

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

select * from bloc b left join company c on b.company_id = c.id where b.name = #{name}

column:表中的字段 property:实体当中的字段名 resultMap :引入另一个Mapper的映射

值得注意的是:因为是嵌套映射,所以形式二在两个实体字段名一样的情况下会引发字段赋值的紊乱,例如两个实体都有name 当第一个实体name有值,第二个实体name没有值的时候,查询出来的结果是两个实体name都有值,且都是一样的为第一个实体的name值

运行结果为

companyName = 宏伟集团

显然运行结果不是我们想要的结果

以上简单的Demo希望能帮助初学Mybatis童鞋!!

这篇基于Mybaits映射的一点心得(分享)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,为了正确映射PostgreSQL数据库中的jsonb字段,Java实体类应该按照以下方式进行定义: ```java @Data @NoArgsConstructor @AllArgsConstructor @Entity @Table(name = "customer_profile") @TypeDefs({ @TypeDef(name = "string-array", typeClass = StringArrayType.class), @TypeDef(name = "int-array", typeClass = IntArrayType.class), @TypeDef(name = "json", typeClass = JsonStringType.class), @TypeDef(name = "jsonb", typeClass = JsonBinaryType.class) }) public class CustomerProfile implements Serializable { @Id @GeneratedValue(strategy = SEQUENCE) private Integer id; @Column(length = 32, nullable = false) private String name; @Type(type = "jsonb") @Column(columnDefinition = "jsonb") private CustomerThemeSetting settings; @Type(type = "string-array") @Column(columnDefinition = "text\[\]") private String\[\] phones; } class CustomerThemeSetting { // ... some instance field. } ``` 在实体类中,使用`@Type`注解来指定字段的类型,例如`@Type(type = "jsonb")`表示该字段是jsonb类型。同时,使用`@Column(columnDefinition = "jsonb")`来指定数据库中的列定义。另外,还需要在实体类上使用`@TypeDefs`注解来定义自定义类型的映射关系。 此外,为了正确使用Hibernate与PostgreSQL的jsonb数据类型,需要在项目的Maven依赖中添加`hibernate-types-52`的依赖项。具体的依赖配置可以参考引用\[2\]中提供的代码段。 希望这个回答能够解决你的问题。 #### 引用[.reference_title] - *1* *2* *3* [Hibernate jsonb Java Object Type Java实体类中的字段怎么写才能正确映射?](https://blog.csdn.net/wuyujin1997/article/details/120981261)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值