MyBatatis_Day03

MyBatatis_Day03

1. mybatis中連接池及事務控制

mybatis中連接池使用及分析

1. POOLED連接池:採用傳統的javax.sql.DataSource規範中的連接池,mybatis中有針對規範的實現
2. UNPOOLED連接:採用傳統的獲取連接的方式,雖然也實現Javax.sql.DataSource接口,但是並沒有使用池的思想。
3. JNDI: 採用服務器提供的JNDI技術實現,來獲取DataSource對象,不同的服務器所能拿到DataSource是不一樣。
4. 注意:如果不是web或者maven的war工程,是不能使用的。 我們課程中使用的是tomcat服務器,採用連接池就是dbcp連接池。
  • mybatis數據庫連接池(POOLED)原理分析

數據庫連接池的本質是一個ArrayList集合
在這裏插入圖片描述

mybatis中事務的控制

  1. 什麼是事務
  2. 事務的四大特性
  3. 不考慮隔離性會產生的四個問題
  4. 解決的方法:四種隔離級別
mybatis自動提交的設置
  1. 在sqlsessionFactory的opensession方法中有多個重載的方法
    在這裏插入圖片描述
  2. 在進行opensession操作時傳進去一個true就會開啓事務的自動提交操作

2. mybatis中基於xml配置的動態SQL使用

if
where
foreach
 <!--根據多個條件進行查詢-->
    <select id="findByUser" resultType="user" parameterType="user">
        select  * from user
        <where>
            <if test="username != null">
                and username like '%${username}%'
            </if>
            <if test="sex != null">
                and sex = #{sex};
            </if>
            <if test="address != null">
                and address = #{address}
            </if>
            <if test="birthday != null">
                and birthday = #{birthday}
            </if>
        </where>
    </select>

    <!--查詢id在某個區間內的-->
    <select id="findByInList" parameterType="queryvo" resultType="user">
        select * from user
        <where>
            <if test="list != null and list.size() > 0">
                <foreach collection="list" open="id in (" close=")" item="id" separator=",">
                    #{id}
                </foreach>
            </if>
        </where>
    </select>
    /**
     * 多個條件查詢
     */
    List<User> findByUser(User user);

    /**
     * 查詢id在某個區間的
     */
    List<User> findByInList(QueryVo vo);
 /**
     * 多個條件查詢
     */
    @Test
    public void  test8(){
        User user = new User();
        user.setUsername("曲");
        user.setSex("女");
        List<User> byUser = userDao.findByUser(user);
        for (User user1 : byUser) {
            System.out.println(user1);
        }
    }

    /**
     * 查詢id在某個區間內
     */
    @Test
    public void test9(){

        QueryVo queryVo = new QueryVo();
        List<Integer> list = new ArrayList<Integer>();
        list.add(49);
        list.add(50);
        list.add(51);
        queryVo.setList(list);

        List<User> byInList = userDao.findByInList(queryVo);
        for (User user : byInList) {
            System.out.println(user);
        }
    }

3. mybatis中的多表操作

  • user.java
package com.lld.domain;

import java.util.Date;

public class User {

    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

    public User() {
    }

    public User(String username, Date birthday, String sex, String address) {
        this.username = username;
        this.birthday = birthday;
        this.sex = sex;
        this.address = address;
    }

    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 Date getBirthday() {
        return birthday;
    }

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

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

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

  • account.java
package com.lld.domain;

/**
 * @ClassName Account
 * @Description TODO
 * @Author LLD
 * @Date 2020/2/5 19:28
 * @Version 1.0
 */
public class Account {

    private int id;
    private int uid;
    private double money;

    public int getId() {
        return id;
    }

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

    public int getUid() {
        return uid;
    }

    public void setUid(int 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表結構+account表結構
    在這裏插入圖片描述

一對一

  • MyBatis中將多對一定義爲一對一(因爲多方的一條屬性只對應一方的一條屬性)
實現方法一(定義domain)
  • 創建一個class(AccountAndUser),定義account的字段,繼承user類
package com.lld.domain;

/**
 * @ClassName accountuser
 * @Description TODO
 * @Author LLD
 * @Date 2020/2/5 20:35
 * @Version 1.0
 */
public class accountuser extends Account{

    private String username;
    private String address;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return super.toString()+"accountuser{" +
                "username='" + username + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

  • accountDao.java定義查詢方法,返回值類型爲AccountAndUser的list集合
List<accountuser> findAccountUser();
  • accountDao.xml定義select語句,返回值類型爲AccountAndUser,保持查詢出來的字段名與類中的屬性名一致
	<select id="findAccountUser" resultType="accountuser">
        SELECT a.*,u.username,u.address FROM user u,account a WHERE u.id = a.uid;
    </select>
實現方法二:在多方(Account)添加一方(User)的對象
  • Account.java(添加User屬性)
package com.lld.domain;

/**
 * @ClassName Account
 * @Description TODO
 * @Author LLD
 * @Date 2020/2/5 19:28
 * @Version 1.0
 */
public class Account {

    private int id;
    private int uid;
    private double money;

    private User user;

    public User getUser() {
        return user;
    }

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

    public int getId() {
        return id;
    }

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

    public int getUid() {
        return uid;
    }

    public void setUid(int 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 +
                '}';
    }
}

  • AccountDao.java
List<Account> findAccountAndUser();
  • AccountDao.xml
<!--定義封裝account和user的resultMap-->
    <resultMap id="AccountAndUser" type="account">
        <!--account主鍵對應-->
        <id column="id" property="id"/>
        <!--account字段對應屬性-->
        <result column="uid" property="uid"/>
        <result column="money" property="money"/>
        <!--
            一對一關係映射:封裝User
                property:account表中的user屬性
                column:account表的外鍵uid字段
                JavaType:account表中對應外鍵的屬性類型
        -->
        <association property="user" column="uid" javaType="user">
            <!--主鍵對應-->
            <id column="id" property="id"/>
            <!--普通字段對應-->
            <result property="username" column="username"/>
            <result property="address" column="address"/>
            <result property="sex" column="sex"/>
            <result property="birthday" column="birthday"/>
        </association>
    </resultMap>

    <!--查詢user和account-->
    <select id="findAccountAndUser" resultMap="AccountAndUser">
        SELECT a.*,u.* FROM user u,account a WHERE u.id = a.uid;
    </select>

一對多

  • User.java:在一方(User.java)加入多方(Account.java)的集合
package com.lld.domain;

import java.util.Date;
import java.util.List;

public class User {

    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
    private List<Account> accounts;

    public List<Account> getAccounts() {
        return accounts;
    }

    public void setAccounts(List<Account> accounts) {
        this.accounts = accounts;
    }

    public User() {
    }

    public User(String username, Date birthday, String sex, String address) {
        this.username = username;
        this.birthday = birthday;
        this.sex = sex;
        this.address = address;
    }

    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 Date getBirthday() {
        return birthday;
    }

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

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

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

  • UserDao.java
    /**
     * 查詢User和Account的所有信息
     */
    List<User> findUserAndAccount();
}
  • UserDao.xml
<!--定義User的resultMap-->
    <resultMap id="UserAccountMap" type="user">
        <!--User表主鍵對應-->
        <id column="id" property="id"/>
        <result property="username" column="username"/>
        <result property="sex" column="sex"/>
        <result property="address" column="address"/>
        <result property="birthday" column="birthday"/>
        <!--
             配置一對多連接
                property:一方的存放多方對象集合名稱
                oftype:一方集合存放的類型
         -->
        <collection property="accounts" ofType="account">
            <id column="aid" property="id"/>
            <result column="uid" property="uid"/>
            <result column="money" property="money"/>
        </collection>
    </resultMap>

    <!--查詢User和及User對應的Account-->
    <select id="findUserAndAccount" resultMap="UserAccountMap">
          SELECT a.id aid,a.uid,a.money,u.* FROM user u LEFT OUTER JOIN account a ON a.uid = u.id
    </select>

多對多

  • User表和Role表對應

一個用戶可以有多個角色
一個角色可以屬於多個用戶
在這裏插入圖片描述

User對Role多對多建立
  • user表中添加一個list集合存儲role
package com.lld.domain;

import java.util.Date;
import java.util.List;

public class User {

    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
    private List<Role> roles;

    public List<Role> getRoles() {
        return roles;
    }

    public void setRoles(List<Role> roles) {
        this.roles = roles;
    }

    public User() {
    }

    public User(String username, Date birthday, String sex, String address) {
        this.username = username;
        this.birthday = birthday;
        this.sex = sex;
        this.address = address;
    }

    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 Date getBirthday() {
        return birthday;
    }

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

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

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

  • 編寫userDao.xml
    <!--返回數據的封裝-->
    <resultMap id="userAndroleMap" type="user">
        <id property="id" column="id"/>
        <result property="username" column="username"/>
        <result property="sex" column="sex"/>
        <result property="address" column="address"/>
        <result property="birthday" column="birthday"/>
        <collection property="roles" ofType="role" >
            <id column="rid" property="roleid"/>
            <result column="ROLE_NAME" property="rolename"/>
            <result column="ROLE_DESC" property="roledesc"/>
        </collection>
    </resultMap>


    <!--查詢user和role-->
    <select id="findUSerAndRole" resultMap="userAndroleMap">
    SELECT u.*,r.ID rid ,r.ROLE_NAME ,r.ROLE_DESC FROM user u
        LEFT OUTER JOIN user_role ur ON u.`ID` = ur.`UID`
        LEFT OUTER JOIN role r ON ur.`RID` = r.`id`;
    </select>
Role對User多對多建立
  • role表中添加一個list集合存儲user
package com.lld.domain;

import java.util.List;

/**
 * @ClassName Role
 * @Description TODO
 * @Author LLD
 * @Date 2020/2/6 8:55
 * @Version 1.0
 */
public class Role {
    private Integer roleid;
    private String rolename;
    private String roledesc;
    private List<User> users;

    public List<User> getUsers() {
        return users;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }

    @Override
    public String toString() {
        return "Role{" +
                "roleid=" + roleid +
                ", rolename='" + rolename + '\'' +
                ", roledesc='" + roledesc + '\'' +
                '}';
    }

    public Integer getRoleid() {
        return roleid;
    }

    public void setRoleid(Integer roleid) {
        this.roleid = roleid;
    }

    public String getRolename() {
        return rolename;
    }

    public void setRolename(String rolename) {
        this.rolename = rolename;
    }

    public String getRoledesc() {
        return roledesc;
    }

    public void setRoledesc(String roledesc) {
        this.roledesc = roledesc;
    }
}

  • 編寫roleDao.xml
<!--配置role表中字段與實體類屬性的映射-->
    <resultMap id="roleMap" type="role">
        <id property="roleid" column="rid"/>
        <result property="rolename" column="ROLE_NAME"/>
        <result property="roledesc" column="ROLE_DESC"/>
        <collection property="users" ofType="user">
            <id column="id" property="id"/>
            <result column="username" property="username"/>
            <result column="address" property="address"/>
            <result column="sex" property="sex"/>
            <result column="birthday" property="birthday"/>
        </collection>
    </resultMap>


    <!--配置role的查詢所有-->
    <select id="findAll" resultMap="roleMap">
        SELECT u.*,r.ID rid ,r.ROLE_NAME ,r.ROLE_DESC FROM role r
        LEFT OUTER JOIN user_role ur ON r.`ID` = ur.`RID`
        LEFT OUTER JOIN user u ON ur.`UID` = u.`id`;
    </select>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章