JavaEE學習日誌持續更新----> 必看!JavaEE學習路線(文章總彙)
MyBatis
一對一映射(1)
新建賬戶表和用戶表組成一對一關係
方式一:組成一個新的pojo,是account和user的結合,繼承其中一個pojo
注意:此種方法最好不用,如果有相同的屬性名會相當麻煩
<select id="findAllAccountUser" resultType="accountUser">
SELECT * FROM account a,user u where a.u_id = u.id
</select>
package com.itheima.domain;
/*
繼承了Account
*/
public class AccountUser extends Account {
private Integer id;
private String username;
private String password;
private String sex;
private String address;
private String birthday;
@Override
public String toString() {
return "AccountUser{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
", birthday='" + birthday + '\'' +
"} " + super.toString();
}
public Integer getId() {
return id;
}
public void setId(Integer 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;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
}
測試類
@Test
public void test2(){
//獲取sqlsession對象
SqlSession sqlSession = new SqlSessionFactoryBuilder().build(this.getClass().getClassLoader().getResourceAsStream("mybatis-config.xml")).openSession();
AccountDao accountDao = sqlSession.getMapper(AccountDao.class);
List<AccountUser> accountUserList = accountDao.findAllAccountUser();
for (AccountUser accountUser : accountUserList) {
System.out.println(accountUser);
}
//關閉資源
sqlSession.close();
}
一對一映射(2)
方法二:Account的pojo中加上一個user屬性,一個賬戶對應一個用戶
package com.itheima.domain;
public class Account {
private Integer id;
private String name;
private Float money;
private Integer u_id;
//一個賬戶對應一個用戶
private User user;
@Override
public String toString() {
return "Account{" +
"id=" + id +
", name='" + name + '\'' +
", money=" + money +
", u_id=" + u_id +
", user=" + user +
'}';
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
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 Float getMoney() {
return money;
}
public void setMoney(Float money) {
this.money = money;
}
public Integer getU_id() {
return u_id;
}
public void setU_id(Integer u_id) {
this.u_id = u_id;
}
}
需要添加映射關係:列名和屬性名相同可以省略
<resultMap id="accounts" type="Account">
<!--<id column="id" property="id"></id>
<result column="name" property="name"></result>
<result column="money" property="money"></result>
<result column="u_id" property="u_id"></result>-->
<!--映射user中的屬性-->
<result column="id" property="user.id"></result>
<result column="username" property="user.username"></result>
<result column="address" property="user.address"></result>
<result column="birthday" property="user.birthday"></result>
<result column="sex" property="user.sex"></result>
<result column="password" property="user.password"></result>
</resultMap>
<select id="findAllAccount" resultMap="accounts">
SELECT * FROM account a,user u where a.u_id = u.id
</select>
測試類
@Test
public void test3(){
//獲取sqlsession對象
SqlSession sqlSession = new SqlSessionFactoryBuilder().build(this.getClass().getClassLoader().getResourceAsStream("mybatis-config.xml")).openSession();
AccountDao accountDao = sqlSession.getMapper(AccountDao.class);
List<Account> accountList = accountDao.findAllAccount();
for (Account account : accountList) {
System.out.println(account);
}
//關閉資源
sqlSession.close();
}
一對一映射(3)
方式三:pojo同第二種,映射方式改變
注意:此種映射,列名和屬性名相同時,也無法省略
標籤<association>
映射單個對象
- property:屬性名
- javaType:屬性類型
<resultMap id="accounts" type="Account">
<id column="id" property="id"></id>
<result column="name" property="name"></result>
<result column="money" property="money"></result>
<result column="u_id" property="u_id"></result>
<!--映射user中的屬性-->
<!--映射單個對象-->
<association property="user" javaType="user">
<id column="id" property="id"></id>
<result column="username" property="username"></result>
<result column="address" property="address"></result>
<result column="sex" property="sex"></result>
<result column="password" property="password"></result>
<result column="birthday" property="birthday"></result>
</association>
</resultMap>
<select id="findAllAccount" resultMap="accounts">
SELECT * FROM account a,user u where a.u_id = u.id
</select>
@Test
public void test3(){
//獲取sqlsession對象
SqlSession sqlSession = new SqlSessionFactoryBuilder().build(this.getClass().getClassLoader().getResourceAsStream("mybatis-config.xml")).openSession();
AccountDao accountDao = sqlSession.getMapper(AccountDao.class);
List<Account> accountList = accountDao.findAllAccount();
for (Account account : accountList) {
System.out.println(account);
}
//關閉資源
sqlSession.close();
}
一對多映射
一對多關係:一個用戶有多個賬戶表
在User的pojo裏添加List集合
private List<Account> accountList;
得到一個新的User的pojo
package com.itheima.domain;
import java.util.List;
/*
包裝類型:初始值爲null
基本數據類型:本身的值就是一個狀態
*/
public class User {
private Integer id;
private String username;
private String password;
private String sex;
private String address;
private String birthday;
/*一個用戶對應多個賬戶*/
private List<Account> accountList;
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
", birthday='" + birthday + '\'' +
", accountList=" + accountList +
'}';
}
public List<Account> getAccountList() {
return accountList;
}
public void setAccountList(List<Account> accountList) {
this.accountList = accountList;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public Integer getId() {
return id;
}
public void setId(Integer 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;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
添加映射,標籤<collection>
- property:屬性名
- ofType:集合的屬性類型
<resultMap id="users" type="user">
<id column="id" property="id"></id>
<result column="username" property="username"></result>
<result column="address" property="address"></result>
<result column="password" property="password"></result>
<result column="birthday" property="birthday"></result>
<result column="sex" property="sex"></result>
<!--collection映射accountList屬性
property:屬性名
ofType:集合的屬性類型
-->
<collection property="accountList" ofType="account">
<id column="id" property="id"></id>
<result column="name" property="name"></result>
<result column="money" property="money"></result>
<result column="u_id" property="u_id"></result>
</collection>
</resultMap>
<select id="findAll" resultMap="users">
select * from user u left join account a on u.id = a.u_id
</select>
測試類
@Test
public void test() {
SqlSession sqlSession = new SqlSessionFactoryBuilder().build(this.getClass().getClassLoader().getResourceAsStream("mybatis-config.xml")).openSession();
//獲取動態代理對象
UserDao userDao = sqlSession.getMapper(UserDao.class);
//執行方法
List<User> userList = userDao.findAll();
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
多對多映射
多對多映射:其實就是兩個一對多映射
一、查看所有user對象,其中包含role信息
注意(非常重要)
:多表查詢後,如果字段名重複,必須使用字段別名
來防止字段名重複,否則查詢的結果會出現錯亂。
pojo中添加role集合
//一個角色對應多個用戶
private List<User> userList;
<resultMap id="users" type="user">
<id column="id" property="id"></id>
<result column="username" property="username"></result>
<result column="address" property="address"></result>
<result column="sex" property="sex"></result>
<result column="birthday" property="birthday"></result>
<result column="password" property="password"></result>
<!--一個用戶對應多個角色-->
<collection property="roleList" ofType="role">
<id column="rid" property="id"></id>
<result column="roleName" property="roleName"></result>
<result column="roleDesc" property="roleDesc"></result>
</collection>
</resultMap>
<select id="findAll" resultMap="users">
select r.id rid,r.roleName,r.roleDesc,u.* from user u left JOIN user_role ur on u.id = ur.uid left join role r on r.id = ur.rid
</select>
@Test
public void test() {
SqlSession sqlSession = new SqlSessionFactoryBuilder().build(this.getClass().getClassLoader().getResourceAsStream("mybatis-config.xml")).openSession();
//獲取動態代理對象
UserDao userDao = sqlSession.getMapper(UserDao.class);
List<User> userList = userDao.findAll();
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
二、查看所有role對象,其中包含user信息
pojo中添加user集合
//一個角色對應多個用戶
private List<User> userList;
<resultMap id="roles" type="role">
<id column="rid" property="id"></id>
<result column="roleName" property="roleName"></result>
<result column="roleDesc" property="roleDesc"></result>
<collection property="userList" ofType="user">
<id column="id" property="id"></id>
<result column="username" property="username"></result>
<result column="address" property="address"></result>
<result column="sex" property="sex"></result>
<result column="birthday" property="birthday"></result>
<result column="password" property="password"></result>
</collection>
</resultMap>
<select id="findAll" resultMap="roles">
select r.id rid,r.roleName,r.roleDesc,u.* from role r left join user_role ur on r.id = ur.rid left join user u on u.id = ur.uid
</select>
@Test
public void test2() {
SqlSession sqlSession = new SqlSessionFactoryBuilder().build(this.getClass().getClassLoader().getResourceAsStream("mybatis-config.xml")).openSession();
//獲取動態代理對象
RoleDao roleDao = sqlSession.getMapper(RoleDao.class);
List<Role> roleList = roleDao.findAll();
for (Role role : roleList) {
System.out.println(role);
}
sqlSession.close();
}