MyBatis注解方式与映射文件方式配合实现一对多##
注解的方式实现一对多如下(一个人有多本书):
在实体类中设置相应的属性(一定要有setter 和 getter方法):
User3.java
package com.mybatisdemo1.bean;
import java.util.List;
/**
* 用户实体类
* @author LIU
* @version 1.0 2017-11-6
*/
public class User3 {
private int id;
private String userName;
private String password;
private List<Book> book;
public List<Book> getBook() {
return book;
}
public void setBook(List<Book> book) {
this.book = book;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
Book.java
package com.mybatisdemo1.bean;
public class Book {
private int bid;
private String bookName;
public int getBid() {
return bid;
}
public void setBid(int bid) {
this.bid = bid;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
}
数据访问接口的代码:
User3Dao.java
package com.mybatisdemo1.dao;
import java.util.List;
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 com.mybatisdemo1.bean.Book;
import com.mybatisdemo1.bean.User3;
/**
* 实现一对多
* @author LIU
* @version 1.0 2017-11-6
*/
public interface User3Dao {
/**
* 查询一对多的情况,从没有外键的开始,以主键作为连接
* 如:@Result(column="id",property="book",many=@Many(select="getBook"))
*TODO
*LIU
* @param id
* @return
*下午5:17:12
*/
@Select("select * from user where id = #{id}")
@Results(
{
@Result(column="id",property="id",id=true),
@Result(column="userName",property="userName"),
@Result(column="password",property="password"),
@Result(column="id",property="book",many=@Many(select="getBook"))
}
)
public User3 getUser3(int id);
@Select("select * from book where uid = #{uid}")
@Results(
{
@Result(column="bid",property="bid",id=true),
@Result(column="bookName",property="bookName"),
}
)
public List<Book> getBook();
}
xml文件方式实现一对多,可以使用vo类,直接设置了对应结果的所有列名,不需要配置结果集,这是最简单的,这里将结果集写出。
如果不适用vo避免配置结果集,xml文件方式实现一对多的实体类依旧如同注解方式一样设计。
User3Mapper.xml如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dao.GroupDao">
<resultMap type="User3" id="User3">
<id column="id" property="id"/>
<result column="userName" property="userName"/>
<result column="password" property="password"/>
<collection property="book" ofType="com.mybatisdemo1.bean.Book">
<id property="bid" column="bid"/>
<result property="bookName" column="bookName"/>
<result property="uid" column="uid"/>
</collection>
</resultMap>
<select id="getUser3" parameterType="int" resultMap="User3">
select u.id as id,u.`password` as password,u.userName as userName,b.bid as bid,b.bookName as bookName,b.uid as uid
from user u,book b
where u.id=b.uid and u.id=#{id}
</select>
</mapper>
web.xml如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<!-- 给类取一个别名 别名没有要求(建议和类名一致) -->
<typeAlias type="com.mybatisdemo1.bean.User" alias="User"/>
<typeAlias type="com.mybatisdemo1.bean.User3" alias="User3"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper class="com.mybatisdemo1.dao.UserDao" />
<mapper class="com.mybatisdemo1.dao.User2Dao" />
<mapper class="com/mybatisdemo1/dao/User3Mapper.xml" />
</mappers>
</configuration>
测试项目目录结构:
感谢您的阅读,欢迎参观我的个人网站:知行乐集【www.zhixinglj.cn】