文章目錄
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中事務的控制
- 什麼是事務
- 事務的四大特性
- 不考慮隔離性會產生的四個問題
- 解決的方法:四種隔離級別
mybatis自動提交的設置
- 在sqlsessionFactory的opensession方法中有多個重載的方法
- 在進行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>