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);
}
}