上期一对一
一对多:作者有一本或多本书
书必然有一个作者,可能多本书共同拥有一个作者
package com.hc.model;
import java.util.List;
public class Author {
private int autId;
private String autName;
private List<Book> books;
public Author() {
}
public Author(String autName) {
this.autName = autName;
}
public List<Book> getBooks() {
return books;
}
public void setBooks(List<Book> books) {
this.books = books;
}
public int getAutId() {
return autId;
}
public void setAutId(int autId) {
this.autId = autId;
}
public String getAutName() {
return autName;
}
public void setAutName(String autName) {
this.autName = autName;
}
}
author中有一个书的list
package com.hc.model;
public class Book {
private int bookId;
private String bookName;
private Author author;
public Book() {
}
public Book(String bookName) {
this.bookName = bookName;
}
public int getBookId() {
return bookId;
}
public void setBookId(int bookId) {
this.bookId = bookId;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public Author getAuthor() {
return author;
}
public void setAuthor(Author author) {
this.author = author;
}
}
book有一个作者属性
package com.hc.mapper;
import com.hc.model.Author;
import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface AuthorMapper {
@Select("select * from Author")
@Results({
@Result(id=true,property = "autId",column = "autId"),//id=true
@Result(property = "books",column = "autId",many = @Many(select = "com.hc.mapper.BookMapper.selectBookByAutId"))
})
public List<Author> allAuthor();
@Select("select * from Author where autId=#{autId}")
public Author selectAuthorByAutId(int autId);
}
作者的Mapper
通过autid拿book,单独拿author的autid
否则,最终显示为0
Many:因为需要查出来的可能是多个,调用相应的对象Mapper中的方法
package com.hc.mapper;
import com.hc.model.Book;
import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface BookMapper {
@Select("select * from Book where autId=#{autId}")
public Book selectBookByAutId(int autId);
@Select("select * from Book")
@Results({
// @Result(id = true,property = "bookId",column = "bookId"),不需
@Result(property = "author",column = "autId",many=@Many(select = "com.hc.mapper.AuthorMapper.selectAuthorByAutId"))
})
public List<Book> allBook();
}
book的Mapper
book中有一列autid,通过这个autid去作者表匹配到相应的作者对象
package com.hc.test;
import com.hc.mapper.AuthorMapper;
import com.hc.mapper.BookMapper;
import com.hc.model.Author;
import com.hc.model.Book;
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;
public class AuthorTest {
private SqlSession session;
@Before
public void before() {
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(getClass().getClassLoader().getResourceAsStream("myBatis-config.xml"));
session = factory.openSession();
}
@Test
public void testBook() {
BookMapper bookMapper=session.getMapper(BookMapper.class);
for (Book book : bookMapper.allBook()) {
System.out.println(book.getBookId() + "\t" + book.getBookName());
Author author=book.getAuthor();
System.out.println(author.getAutId() + "\t" + author.getAutName());
System.out.println();
}
}
@Test
public void testAuthor() {
AuthorMapper authorMapper=session.getMapper(AuthorMapper.class);
for (Author author : authorMapper.allAuthor()) {
System.out.println(author.getAutId() + "\t" + author.getAutName());
for (Book book : author.getBooks()) {
System.out.println(book.getBookId() + "\t" + book.getBookName());
}
System.out.println();
}
}
@After
public void after() {
session.commit();
session.close();
}
}
一对多与上次的一对一类似,对比起来,mybatis注解式的关系比hibernate的真的是简单的很多。