基于注解(一对一/多对一)

1.建立User类:
如果这里的属性名与数据库中的属性名不匹配,由于MyBatis的高效基于OBM,所以基于注解的解决办法:@Results

package domain;

import java.io.Serializable;

public class User implements Serializable {

    private String USERname;
    private String useraddress;
    private String usersex;
    private String birthday;
    private Integer userid;

    public String getUSERname() {
        return USERname;
    }

    public void setUSERname(String USERname) {
        this.USERname = USERname;
    }

    public String getUseraddress() {
        return useraddress;
    }

    public void setUseraddress(String useraddress) {
        this.useraddress = useraddress;
    }

    public String getUsersex() {
        return usersex;
    }

    public void setUsersex(String usersex) {
        this.usersex = usersex;
    }

    public String getBirthday() {
        return birthday;
    }

    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }

    public Integer getUserid() {
        return userid;
    }

    public void setUserid(Integer userid) {
        this.userid = userid;
    }

    @Override
    public String toString() {
        return "User{" +
                "USERname='" + USERname + '\'' +
                ", useraddress='" + useraddress + '\'' +
                ", usersex='" + usersex + '\'' +
                ", birthday='" + birthday + '\'' +
                ", userid=" + userid +
                '}';
    }
}

package dao;

import domain.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

public interface IUserDao {

    //查询所有
    @Select("select* from user")
    @Results(id="userMap",value = {
            @Result(id=true, column="id", property="userid"),
            @Result(column = "username" ,property="USERname"),
            @Result(column = "sex" ,property="usersex"),
            @Result(column = "address", property="useraddress"),

    })
    List<User> findAll();


    @Select("select* from user where id=#{id}")
    @ResultMap("userMap")
    User findById(Integer id);
    @ResultMap("userMap")
    @Select("select* from user where username like #{username}")
    List<User> findByName(String name);





}

2.建立Account表
引入User对象,但此时user的返回值为null,因为在使用xml时,可以很清楚的看到,它此时的resultType,即定义的返回包装类型是Account,自然不能获取到User对象

package domain;

import java.io.Serializable;

public class Account implements Serializable {
    private Integer id;
    private Integer uid;
    private Double money;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    private User user;


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getUid() {
        return uid;
    }

    public void setUid(Integer uid) {
        this.uid = uid;
    }

    public Double getMoney() {
        return money;
    }

    public void setMoney(Double money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", uid=" + uid +
                ", money=" + money +
                ", user=" + user +
                '}';
    }
}

3.写一个IAccountDao接口:
此时要使account表和user表对应起来,即account.uid=user.id
One下的fetchType为延迟加载配置(Ctrl+Alt+B查看源码),延迟加载即需要使用时才加载,此处设置为EAGER,一般多对一,都是即时加载

package dao;

import domain.Account;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.mapping.FetchType;

import java.util.List;

public interface IAccountDao {

    @Select("select* from account")
    @Results(id="accountMap", value={
            @Result(id=true,column = "id", property="id"),
            @Result(column = "uid", property="uid"),
            @Result(column="money",property="money"),
            @Result(property = "user",column = "uid" ,one=@One(select = "dao.IUserDao.findById",
            fetchType= FetchType.EAGER))
    })
    List<Account> findAll();
}

4.使用测试类测试:

import dao.IAccountDao;
import dao.IUserDao;
import domain.Account;
import domain.User;
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.After;
import org.junit.Before;
import org.junit.Test;
import org.omg.PortableInterceptor.USER_EXCEPTION;

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

public class IUserTest {


    private InputStream in;
    private SqlSessionFactory factory;
    private SqlSession sqlSession;
    private IAccountDao accountDao;

    @Before
    public void init() throws Exception {
        //1.读取文件
        in= Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.建立工厂
        factory = new SqlSessionFactoryBuilder().build(in);
        //3.创建SqlSession接口
        sqlSession = factory.openSession(true);//自动提交
     //4.创建代理
   accountDao = sqlSession.getMapper(IAccountDao.class);


    }

    @After
    public void destory() throws IOException {
        sqlSession.close();
        in.close();

    
@Test
    public void test()
{
    List<Account> all = accountDao.findAll();
    for(Account acc:all)
        System.out.println(acc);
}



}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值