亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MyBatis中的連接池及事物控制配置過(guò)程

 更新時(shí)間:2022年01月23日 10:19:37   作者:程序員小徐同學(xué)  
連接池就是用于存儲(chǔ)數(shù)據(jù)庫(kù)連接的一個(gè)容器,容器其實(shí)就是一個(gè)集合對(duì)象,本文給大家介紹MyBatis中的連接池以及事物控制的相關(guān)知識(shí),感興趣的朋友一起看看吧

1.連接池

在實(shí)際開(kāi)發(fā)中都會(huì)使用連接池
因?yàn)樗梢詼p少我們獲取連接所消耗的時(shí)間

連接池就是用于存儲(chǔ)連接的一個(gè)容器,容器其實(shí)就是一個(gè)集合對(duì)象,該集合必須是線程安全的,不能兩個(gè)線程拿到統(tǒng)一連接,該集合還必須實(shí)現(xiàn)隊(duì)列特性:先進(jìn)先出

Mybatis連接提供了.種方式的怕配置:

  • 配置位置:主配置文件SqlMapConfig.xml中的dataSource標(biāo)簽,type屬性就是標(biāo)識(shí)采用何種連接池方式
  • type屬性的取值:POOLED:采用傳統(tǒng)的javax.sql.DataSource規(guī)范中的連接池,mybatis中有針對(duì)規(guī)范的實(shí)現(xiàn)UNPOOLED:采用傳統(tǒng)的獲取連接的方式,雖然也實(shí)現(xiàn)javax.sql.DataSource接口,但是并沒(méi)有使用池的思想JNDI:采用服務(wù)器提供的JNDI技術(shù),來(lái)獲取DataSource對(duì)象,不同的服務(wù)器所能拿到DataSource是不一樣的
  • 注意:如果不是web或者maven的wai工程是不能使用的,tomcat服務(wù)器,采用連接池就是dbcp連接池

2.mybatis中的事物

1.事物
什么是事物
事物的四大特性ACID
不考慮隔離性會(huì)產(chǎn)生的3個(gè)問(wèn)題
解決辦法:四種隔離級(jí)別
它是通過(guò)sqlsession對(duì)象的commit方法和rollback方法實(shí)現(xiàn)事物的提交和回滾

1.if語(yǔ)句的設(shè)置

在IUserDao.xml設(shè)置
通過(guò)判斷條件進(jìn)行查詢(xún)以及通過(guò)多個(gè)id進(jìn)行查詢(xún)

 <!--根據(jù)條件查詢(xún)-->
    <!--<select id="findUserByCondition"  resultType="com.mybatisD.domain.User">
        select * from user where 1=1
        <if test="username != null">
        and username = #{username}
        </if>
        <if test="sex != null">
            and sex = #{sex}
        </if>
    </select>-->

     <select id="findUserByCondition"  resultType="com.mybatisD.domain.User">
        select * from user
        <where>
        <if test="username != null">
        and username = #{username}
        </if>
        <if test="sex != null">
            and sex = #{sex}
        </if>
        </where>
    </select>
    <!--根據(jù)queryvo中的id集合實(shí)現(xiàn)查詢(xún)用戶列表-->
    <select id="findUserInIds" resultType="com.mybatisD.domain.User" parameterType="com.mybatisD.domain.QueryVo">
        select * from user
        <where>
            <if test="ids != null and ids.size()>0">
                <foreach collection="ids" open="and id in (" close=" )" item="uid" separator=",">
                    #{uid}
                </foreach>
            </if>
        </where>
    </select>

設(shè)置QueryVo實(shí)現(xiàn)類(lèi)

package com.mybatisD.domain;
import java.util.List;
/**
 * @author :程序員徐大大
 * @description:TODO
 * @date :2022-01-21 16:05
 */
public class QueryVo {
    private User user;
    private List<Integer> ids;
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    public List<Integer> getIds() {
        return ids;
    }
    public void setIds(List<Integer> ids) {
        this.ids = ids;
    }
}

設(shè)置IUserDao實(shí)現(xiàn)類(lèi)

package com.mybatisD.dao;
import com.mybatisD.domain.QueryVo;
import com.mybatisD.domain.User;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/*
* 用戶持久層接口
* */
public interface IUserDao {
   // 查詢(xún)所有操作
   // @Select("select * from user") 這是用注解方法
    List<User> findAll();
    // 保存方法
    void saveUser(User user);
    //更新用戶
    void updateUser(User user);
    //根據(jù)ID刪除用戶
    void deleteUser(Integer userId);
    //根據(jù)查詢(xún)一個(gè)用戶
    User findById(Integer userId);
    //根據(jù)名稱(chēng)模糊查詢(xún)用戶
    List<User> findByName(String username);
    //查詢(xún)用戶總數(shù)
    int findTotal();
    //根據(jù)queryVo中的條件查詢(xún)用戶
    List<User> findUserByVo(QueryVo vo);
    //根據(jù)條件查詢(xún)
   //查詢(xún)的條件,有可能有用戶名,有可能有性別 有可能有地址,也有可能都沒(méi)有
    List<User> findUserByCondition(User u);
    /*
    * 根據(jù)queryvo中提供的id集合查詢(xún)用戶信息
    * */
    List<User> findUserInIds(QueryVo vo);
}

測(cè)試方法

@Test
    public void testFindByCondition(){
        User u = new User();
        u.setUsername("王五");
        u.setSex("女");
        //執(zhí)行查詢(xún)條件
        List<User> users = userDao.findUserByCondition(u);
        for (User user: users) {
            System.out.println(user);
        }
    }
    //測(cè)試使用Query作為查詢(xún)條件
    @Test
    public void testFindInIds(){
        QueryVo vo = new QueryVo();
        List<Integer> list = new ArrayList<Integer>();
        list.add(2);
        list.add(5);
        list.add(10);
        vo.setIds(list);
        List<User> users = userDao.findUserInIds(vo);
        for (User u: users) {
            System.out.println(u);
        }
    }

全部代碼在文章最后展出

2.mybatis中的多表查詢(xún)

表之間的關(guān)系:

  • 一對(duì)多
  • 多對(duì)一
  • 一對(duì)一
  • 多對(duì)多

示例:用戶和賬戶

  • 一個(gè)用戶可以有多個(gè)賬戶
  • 一個(gè)賬戶只能屬于一個(gè)用戶(多個(gè)賬戶也可以屬于同一個(gè)用戶)

步驟:

  • 先建立兩張表、用戶表,賬戶表,讓用戶表和賬戶表之間具備一對(duì)多的關(guān)系,需要使用外鍵在賬戶中添加
  • 建立兩個(gè)實(shí)體類(lèi):用戶和賬戶實(shí)體類(lèi)、讓用戶和賬戶實(shí)體類(lèi)能體現(xiàn)出來(lái)一對(duì)多的關(guān)系
  • 建立兩個(gè)配置文件:用戶配置文件。賬戶的配置文件
  • 當(dāng)我們查詢(xún)用戶時(shí),可以同時(shí)得到用戶下所包含的賬戶信息
  • 當(dāng)我們查詢(xún)賬戶時(shí),可以同時(shí)得到賬戶的所屬信息

1.簡(jiǎn)單實(shí)現(xiàn)

表數(shù)據(jù)

在這里插入圖片描述

在這里插入圖片描述

創(chuàng)建Account實(shí)現(xiàn)類(lèi)

package com.mybatisD.domain;
import java.io.Serializable;
/**
 * @author :程序員徐大大
 * @description:TODO
 * @date :2022-01-22 16:02
 */
public class Account  implements Serializable {
    private  Integer id;
    private Integer uid;
    private double money;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public Integer getUid() {
        return uid;
    }
    public void setUid(Integer 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 +
                '}';
    }
}

再創(chuàng)建與user進(jìn)行連接的AccountUser實(shí)現(xiàn)類(lèi)、其中toString去調(diào)用父類(lèi)的toString

package com.mybatisD.domain;
/**
 * @author :程序員徐大大
 * @description:TODO
 * @date :2022-01-22 16:25
 */
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 + '\'' +
                '}';
    }
}

設(shè)置IAccountDao

package com.mybatisD.dao;
import com.mybatisD.domain.Account;
import com.mybatisD.domain.AccountUser;
import java.util.List;
public interface IAccountDao {
    //查詢(xún)所有賬戶
    List<Account> findAll();
    //查詢(xún)賬戶,并且?guī)в杏脩裘Q(chēng)和地址信息
    List<AccountUser> findAllAccount();
}

配置IAccountDao.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.mybatisD.dao.IAccountDao">
    <select id="findAll" resultType="com.mybatisD.domain.Account" >
        select * from account
    </select>
    <!--查詢(xún)所有同時(shí)包含用戶信息-->
    <select id="findAllAccount" resultType="com.mybatisD.domain.AccountUser">
         SELECT a.*,u.username,u.address FROM account a,USER u WHERE u.id = a.uid
    </select>
</mapper>

配置數(shù)據(jù)庫(kù)連接SqlMaoConfig.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>
    <!--配置properties文件 可以在標(biāo)簽內(nèi)部配置數(shù)據(jù)庫(kù)的信息,也可以通過(guò)屬性引用外部配置信息
    resource屬性:用于指定配置文件的位置,是按照類(lèi)路徑的寫(xiě)法來(lái)寫(xiě)平且必須存在與類(lèi)路徑下
    -->
    <properties resource="jdbcConfig.properties">
        <!--<property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/newsql?characterEncoding=utf-8"/>
        <property name="username" value="root"/>
        <property name="password" value=""/>-->
    </properties>
    <!--配置環(huán)境-->
    <environments default="mysql">
        <!--配置mysql環(huán)境-->
        <environment id="mysql">
            <!--配置事物類(lèi)型-->
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <!--配置連接數(shù)據(jù)庫(kù)的4個(gè)信息-->
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--指定映射配置文件的位置,映射配置文件指的是每個(gè)到獨(dú)立的配置文件-->
    <mappers>
        <mapper resource="com/mybatisD/dao/IUserDao.xml"/>
        <mapper resource="com/mybatisD/dao/IAccountDao.xml"/>
    </mappers>
    <!--如果要是用注解來(lái)配置的話,此處應(yīng)該使用class屬性指定被注解的dao全限定類(lèi)名-->
    <!--<mappers>
        <mapper class="com.mybatisD.dao.IUserDao"/>
    </mappers>-->
    <!--<mappers>
        &lt;!&ndash;package標(biāo)簽用于指定doa接口所在的包,當(dāng)指定了之后就不需要在寫(xiě)mapper以及resource或者class了&ndash;&gt;
        <package name="com.mybatisD.domain"/>
    </mappers>-->
</configuration>

配置jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/newsql?characterEncoding=utf-8
jdbc.username=root
jdbc.password=

配置日志文件

log4j.rootCategory=debug,CONSOLE, LOGFILE
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x -%m\n
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x -%m\n

測(cè)試類(lèi)

package com.mybatisJ.test;
import com.mybatisD.dao.IAccountDao;
import com.mybatisD.dao.IUserDao;
import com.mybatisD.domain.Account;
import com.mybatisD.domain.AccountUser;
import com.mybatisD.domain.QueryVo;
import com.mybatisD.domain.User;
import org.apache.ibatis.io.Resources;
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;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
 * @author :程序員徐大大
 * @description:TODO
 * @date :2022-01-22 16:07
 */
public class AccountTest {
    private InputStream in;
    private SqlSession sqlSession;
    private IAccountDao  accountDao;
    @Before//用于在測(cè)試方法執(zhí)行之前執(zhí)行
    public void init()throws  Exception{
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        sqlSession = factory.openSession();
        //4.使用SqlSession創(chuàng)建Dao接口的代理對(duì)象
        accountDao = sqlSession.getMapper(IAccountDao.class);
    }
    @After//用于在測(cè)試方法之后執(zhí)行
    public void destory() throws Exception{
        //添加提交事物,不添加無(wú)法提交
        sqlSession.commit();
        sqlSession.close();
        in.close();
    }
    @Test
    public  void testFindAll() throws  Exception{
        List<Account> accounts = accountDao.findAll();
        for (Account account: accounts) {
            System.out.println(account);
        }
    }
    @Test
    public void findAllAccount(){
        List<AccountUser> accountUsers = accountDao.findAllAccount();
        for (AccountUser au: accountUsers) {
            System.out.println(au);
        }
    }
}

在這里插入圖片描述

2.以上是沒(méi)有進(jìn)行封裝,下面就是封裝一對(duì)一關(guān)系的映射

配置封裝IAcountDao.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.mybatisD.dao.IAccountDao">
    <!--定義封裝account的resultMap-->
    <resultMap id="accountUserMap" type="com.mybatisD.domain.Account">
        <id property="id" column="aid"></id>
        <result property="uid" column="uid"></result>
        <result property="money" column="money"></result>
        <!--一對(duì)一的關(guān)系映射,配置封裝user內(nèi)容-->
        <association property="user"   column="uid" javaType="com.mybatisD.domain.User">
            <id property="id" column="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>
        </association>
    </resultMap>
    <select id="findAll" resultMap="accountUserMap" >
        select u.*,a.id as aid,a.uid,a.money from account a,user u where u.id = a.uid
    </select>
    <!--查詢(xún)所有同時(shí)包含用戶信息-->
    <select id="findAllAccount" resultType="com.mybatisD.domain.AccountUser">
         SELECT a.*,u.username,u.address FROM account a,USER u WHERE u.id = a.uid
    </select>
</mapper>

在Account實(shí)現(xiàn)類(lèi)加入U(xiǎn)ser方法

package com.mybatisD.domain;
import java.io.Serializable;
/**
 * @author :程序員徐大大
 * @description:TODO
 * @date :2022-01-22 16:02
 */
public class Account  implements Serializable {
    private  Integer id;
    private Integer uid;
    private double money;
    private 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 Integer getUid() {
        return uid;
    }
    public void setUid(Integer 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 +
                '}';
    }
}

實(shí)現(xiàn)IAccountDao的接口

package com.mybatisD.dao;
import com.mybatisD.domain.Account;
import com.mybatisD.domain.AccountUser;
import java.util.List;
public interface IAccountDao {
    //查詢(xún)所有賬戶
    List<Account> findAll();
    //查詢(xún)賬戶,并且?guī)в杏脩裘Q(chēng)和地址信息
    List<AccountUser> findAllAccount();
}

測(cè)試實(shí)現(xiàn)

package com.mybatisJ.test;

import com.mybatisD.dao.IAccountDao;
import com.mybatisD.dao.IUserDao;
import com.mybatisD.domain.Account;
import com.mybatisD.domain.AccountUser;
import com.mybatisD.domain.QueryVo;
import com.mybatisD.domain.User;
import org.apache.ibatis.io.Resources;
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;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author :程序員徐大大
 * @description:TODO
 * @date :2022-01-22 16:07
 */
public class AccountTest {
    private InputStream in;
    private SqlSession sqlSession;
    private IAccountDao  accountDao;

    @Before//用于在測(cè)試方法執(zhí)行之前執(zhí)行
    public void init()throws  Exception{
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        sqlSession = factory.openSession();
        //4.使用SqlSession創(chuàng)建Dao接口的代理對(duì)象
        accountDao = sqlSession.getMapper(IAccountDao.class);
    }
    @After//用于在測(cè)試方法之后執(zhí)行
    public void destory() throws Exception{
        //添加提交事物,不添加無(wú)法提交
        sqlSession.commit();
        sqlSession.close();
        in.close();
    }
    //查詢(xún)連接方法其中包括用戶的一些信息
    @Test
    public  void testFindAll() throws  Exception{

        List<Account> accounts = accountDao.findAll();
        for (Account account: accounts) {
            System.out.println("-----------------------");
            System.out.println(account);
           System.out.println(account.getUser());
        }
    }
    //查詢(xún)account的信息
    @Test
    public void findAllAccount(){
        List<AccountUser> accountUsers = accountDao.findAllAccount();
        for (AccountUser au: accountUsers) {
            System.out.println(au);
        }
    }
}

在這里插入圖片描述

3.一對(duì)多關(guān)系映射,主表實(shí)體應(yīng)該包含從表實(shí)體的集合引用

但是在User與Account的數(shù)據(jù)庫(kù)表中可以發(fā)現(xiàn)有的User數(shù)據(jù)中是沒(méi)有Account的數(shù)據(jù),在下面就是一對(duì)多的關(guān)系映射
在user實(shí)現(xiàn)類(lèi)進(jìn)行增加Account類(lèi)

package com.mybatisD.domain;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
public class User implements Serializable {
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
    private List<Account> account;
//一對(duì)多關(guān)系映射,主表實(shí)體應(yīng)該包含從表實(shí)體的集合引用
    public List<Account> getAccount() {
        return account;
    }
    public void setAccount(List<Account> account) {
        this.account = account;
    }
    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 + '\'' +
                '}';
    }
}

在配置IUserDao.xml加入一對(duì)多的關(guān)系

<?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.mybatisD.dao.IUserDao">
    <!--定義user的resultMap-->
    <resultMap id="userAccountMap" type="com.mybatisD.domain.User">
        <id property="id" column="id"></id>
        <id property="username" column="username"></id>
        <id property="sex" column="sex"></id>
        <id property="birthday" column="birthday"></id>
        <!--配置user對(duì)象中account集合的映射-->
        <collection property="account" ofType="com.mybatisD.domain.Account">
            <id column="aid" property="id"></id>
            <id column="uid" property="uid"></id>
            <id column="money" property="money"></id>
        </collection>
    </resultMap>
    <!--配置查詢(xún)所有-->
    <select id="findAll" resultMap="userAccountMap">
        select * from user u left outer join account a on u.id = a.uid
    </select>
</mapper>

測(cè)試類(lèi)

package com.mybatisJ.test;
import com.mybatisD.dao.IAccountDao;
import com.mybatisD.dao.IUserDao;
import com.mybatisD.domain.Account;
import com.mybatisD.domain.AccountUser;
import com.mybatisD.domain.User;
import org.apache.ibatis.io.Resources;
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;
import java.io.InputStream;
import java.util.List;
/**
 * @author :程序員徐大大
 * @description:TODO
 * @date :2022-01-22 16:07
 */
public class userTest {
    private InputStream in;
    private SqlSession sqlSession;
    private IUserDao userDao;
    @Before//用于在測(cè)試方法執(zhí)行之前執(zhí)行
    public void init()throws  Exception{
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        sqlSession = factory.openSession();
        //4.使用SqlSession創(chuàng)建Dao接口的代理對(duì)象
        userDao = sqlSession.getMapper(IUserDao.class);
    }
    @After//用于在測(cè)試方法之后執(zhí)行
    public void destory() throws Exception{
        //添加提交事物,不添加無(wú)法提交
        sqlSession.commit();
        sqlSession.close();
        in.close();
    }
    //查詢(xún)連接方法其中包括用戶的一些信息
    @Test
    public  void testFindAll() throws  Exception{
        List<User> users = userDao.findAll();
        for (User user: users) {
            System.out.println(user);
            System.out.println(user.getAccount());
        }
        }
}

結(jié)果

在這里插入圖片描述

4.多對(duì)多

示例:用戶和角色

  • 一個(gè)用戶可以有多個(gè)角色
  • 一個(gè)角色可以賦予多個(gè)用戶

步驟:

  • 先建立兩張表、用戶表,角色表,讓用戶表和角色表具備多對(duì)多的關(guān)系,需要使用中間表,中間表包含各自主鍵在中間表中是外鍵
  • 建立兩個(gè)實(shí)體類(lèi):用戶和角色實(shí)體類(lèi)、讓用戶和角色實(shí)體類(lèi)能體現(xiàn)出來(lái)多對(duì)多的關(guān)系、各自包含對(duì)方一個(gè)集合引用
  • 建立兩個(gè)配置文件:用戶配置文件。角色的配置文件
  • 當(dāng)我們查詢(xún)用戶時(shí),可以同時(shí)得到用戶下所包含的角色信息
  • 當(dāng)我們查詢(xún)角色時(shí),可以同時(shí)得到角色的賦予的用戶信息

role表

在這里插入圖片描述

多對(duì)多關(guān)系表user_role

在這里插入圖片描述

創(chuàng)建Role實(shí)體類(lèi)
其中主要的是多對(duì)多的關(guān)系映射User

package com.mybatisD.domain;
import java.io.Serializable;
import java.util.List;
/**
 * @author :程序員徐大大
 * @description:TODO
 * @date :2022-01-22 20:07
 */
public class Role implements Serializable {
    private Integer roleId;
    private String roleName;
    private String roleDesc;
    //多對(duì)多的關(guān)系映射,一個(gè)角色可以賦予多個(gè)用戶
    private List<User> users;
    public List<User> getUsers() {
        return users;
    }
    public void setUsers(List<User> users) {
        this.users = users;
    }
    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;
    }
    @Override
    public String toString() {
        return "Role{" +
                "roleId=" + roleId +
                ", roleName='" + roleName + '\'' +
                ", roleDesc='" + roleDesc + '\'' +
                '}';
    }
}

User實(shí)體類(lèi)的關(guān)系映射Role

package com.mybatisD.domain;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
public class User implements Serializable {
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
    //多對(duì)多的關(guān)系映射,一個(gè)用戶可以具備多個(gè)角色
    private List<Role> roles;
    public List<Role> getRoles() {
        return roles;
    }
    public void setRoles(List<Role> roles) {
        this.roles = roles;
    }
    private List<Account> account;
//一對(duì)多關(guān)系映射,主表實(shí)體應(yīng)該包含從表實(shí)體的集合引用
    public List<Account> getAccount() {
        return account;
    }
    public void setAccount(List<Account> account) {
        this.account = account;
    }
    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 + '\'' +
                '}';
    }
}

IROleDao的接口

package com.mybatisD.dao;

import com.mybatisD.domain.Role;

import java.util.List;

public interface IRoleDao {
    //查詢(xún)所有角色
    List<Role> findAll();
}

IUserDao的接口

package com.mybatisD.dao;
import com.mybatisD.domain.QueryVo;
import com.mybatisD.domain.User;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/*
* 用戶持久層接口
* */
public interface IUserDao {
   // 查詢(xún)所有操作
   // @Select("select * from user") 這是用注解方法
    List<User> findAll();
}

配置IRoleDao.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.mybatisD.dao.IRoleDao">
    <!--定義role表的ResultMap-->
    <resultMap id="roleMap" type="com.mybatisD.domain.Role">
        <id property="roleId" column="id"></id>
        <result property="roleName" column="role_name"></result>
        <result property="roleDesc" column="role_desc"></result>
        <collection property="users" ofType="com.mybatisD.domain.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>
        </collection>
    </resultMap>
    <select id="findAll" resultMap="roleMap">
       select u.*,r.id as 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 u.id = ur.uid;
    </select>
</mapper>

配置IUserDao.xml中的多對(duì)多Role

<?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.mybatisD.dao.IUserDao">
    <!--定義user的resultMap-->
    <resultMap id="userMap" type="com.mybatisD.domain.User">
            <id property="id" column="id"></id>
            <result property="username" column="username"></result>
            <result property="address" column="address"></result>
            <result property="sex" column="sex"></result>
            <result property="birthday" column="birthday"></result>
        <collection property="roles" ofType="com.mybatisD.domain.Role">
        <id property="roleId" column="rid"></id>
        <result property="roleName" column="role_name"></result>
        <result property="roleDesc" column="role_desc"></result>
        </collection>
    </resultMap>
    <!--配置查詢(xún)所有-->
    <select id="findAll" resultMap="userMap">
       select u.*,r.id as rid,r.role_name,r.role_desc from user u
       left outer join user_role ur on u.id = ur.rid
       left outer join role r on r.id = ur.uid;
    </select>
</mapper>

配置SqlMapConfig.xml文件
其中下面的配置包路徑名

<mappers >
        <!--package標(biāo)簽用于指定doa接口所在的包,當(dāng)指定了之后就不需要在寫(xiě)mapper以及resource或者class了-->
        <package name="com.mybatisD.dao"/>
    </mappers>
<?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>

    <!--配置properties文件 可以在標(biāo)簽內(nèi)部配置數(shù)據(jù)庫(kù)的信息,也可以通過(guò)屬性引用外部配置信息
    resource屬性:用于指定配置文件的位置,是按照類(lèi)路徑的寫(xiě)法來(lái)寫(xiě)平且必須存在與類(lèi)路徑下
    -->
    <properties resource="jdbcConfig.properties">

        <!--<property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/newsql?characterEncoding=utf-8"/>
        <property name="username" value="root"/>
        <property name="password" value=""/>-->

    </properties>
    <!--配置環(huán)境-->
    <environments default="mysql">
        <!--配置mysql環(huán)境-->
        <environment id="mysql">
            <!--配置事物類(lèi)型-->
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <!--配置連接數(shù)據(jù)庫(kù)的4個(gè)信息-->
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--指定映射配置文件的位置,映射配置文件指的是每個(gè)到獨(dú)立的配置文件-->
    <!--<mappers>
        <mapper resource="com/mybatisD/dao/IUserDao.xml"/>
     <mapper resource="com/mybatisD/dao/IAccountDao.xml"/>
    </mappers>-->
    <!--如果要是用注解來(lái)配置的話,此處應(yīng)該使用class屬性指定被注解的dao全限定類(lèi)名-->
    <!--<mappers>
        <mapper class="com.mybatisD.dao.IUserDao"/>
    </mappers>-->
    <mappers >
        <!--package標(biāo)簽用于指定doa接口所在的包,當(dāng)指定了之后就不需要在寫(xiě)mapper以及resource或者class了-->
        <package name="com.mybatisD.dao"/>
    </mappers>
</configuration>

測(cè)試role多對(duì)多User

package com.mybatisJ.test;
import com.mybatisD.dao.IRoleDao;
import com.mybatisD.dao.IUserDao;
import com.mybatisD.domain.Role;
import com.mybatisD.domain.User;
import org.apache.ibatis.io.Resources;
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;
import java.io.InputStream;
import java.util.List;
/**
 * @author :程序員徐大大
 * @description:TODO
 * @date :2022-01-22 16:07
 */
public class roleTest {
    private InputStream in;
    private SqlSession sqlSession;
    private IRoleDao roleDao;
    @Before//用于在測(cè)試方法執(zhí)行之前執(zhí)行
    public void init()throws  Exception{
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        sqlSession = factory.openSession();
        //4.使用SqlSession創(chuàng)建Dao接口的代理對(duì)象
        roleDao = sqlSession.getMapper(IRoleDao.class);
    }
    @After//用于在測(cè)試方法之后執(zhí)行
    public void destory() throws Exception{
        //添加提交事物,不添加無(wú)法提交
        sqlSession.commit();
        sqlSession.close();
        in.close();
    }
    //查詢(xún)角色的一些信息
    @Test
    public  void testFindAll() throws  Exception {
    List<Role> roles = roleDao.findAll();
        for (Role role: roles) {
            System.out.println(role);
            System.out.println(role.getUsers());
        }
    }
}

在這里插入圖片描述

測(cè)試User多對(duì)多Role

package com.mybatisJ.test;
import com.mybatisD.dao.IAccountDao;
import com.mybatisD.dao.IUserDao;
import com.mybatisD.domain.Account;
import com.mybatisD.domain.AccountUser;
import com.mybatisD.domain.User;
import org.apache.ibatis.io.Resources;
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;
import java.io.InputStream;
import java.util.List;
/**
 * @author :程序員徐大大
 * @description:TODO
 * @date :2022-01-22 16:07
 */
public class userTest {
    private InputStream in;
    private SqlSession sqlSession;
    private IUserDao userDao;
    @Before//用于在測(cè)試方法執(zhí)行之前執(zhí)行
    public void init()throws  Exception{
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        sqlSession = factory.openSession();
        //4.使用SqlSession創(chuàng)建Dao接口的代理對(duì)象
        userDao = sqlSession.getMapper(IUserDao.class);
    }
    @After//用于在測(cè)試方法之后執(zhí)行
    public void destory() throws Exception{
        //添加提交事物,不添加無(wú)法提交
        sqlSession.commit();
        sqlSession.close();
        in.close();
    }
    //查詢(xún)連接方法其中包括用戶的一些信息
    @Test
    public  void testFindAll() throws  Exception{
        List<User> users = userDao.findAll();
        for (User user: users) {
            System.out.println(user);
            System.out.println(user.getRoles());
        }
        }
}

在這里插入圖片描述

到此這篇關(guān)于MyBatis中的連接池以及事物控制的文章就介紹到這了,更多相關(guān)MyBatis連接池事物控制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java通過(guò)MySQL的加解密函數(shù)實(shí)現(xiàn)敏感字段存儲(chǔ)

    Java通過(guò)MySQL的加解密函數(shù)實(shí)現(xiàn)敏感字段存儲(chǔ)

    這篇文章主要介紹了如何在Java中MySQL的加解密函數(shù)實(shí)現(xiàn)敏感字段存儲(chǔ),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-03-03
  • Mybatis詳解在注解sql時(shí)報(bào)錯(cuò)的解決方法

    Mybatis詳解在注解sql時(shí)報(bào)錯(cuò)的解決方法

    MyBatis-Plus 是一個(gè) Mybatis 增強(qiáng)版工具,在 MyBatis 上擴(kuò)充了其他功能沒(méi)有改變其基本功能,為了簡(jiǎn)化開(kāi)發(fā)提交效率而存在,本篇文章帶你看看在注解sql時(shí)所報(bào)出的錯(cuò)誤解決
    2022-03-03
  • Java/Spring項(xiàng)目的包開(kāi)頭為什么是com詳解

    Java/Spring項(xiàng)目的包開(kāi)頭為什么是com詳解

    這篇文章主要介紹了Java/Spring項(xiàng)目的包開(kāi)頭為什么是com的相關(guān)資料,在Java中包命名遵循域名反轉(zhuǎn)規(guī)則,即使用公司的域名反轉(zhuǎn)作為包的前綴,以確保其全球唯一性和避免命名沖突,這種規(guī)則有助于邏輯分層、代碼可讀性提升和標(biāo)識(shí)代碼來(lái)源,需要的朋友可以參考下
    2024-10-10
  • Spring Boot 與 Kotlin 上傳文件的示例代碼

    Spring Boot 與 Kotlin 上傳文件的示例代碼

    這篇文章主要介紹了Spring Boot 與 Kotlin 上傳文件的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • Java?NIO中四大核心組件的使用詳解

    Java?NIO中四大核心組件的使用詳解

    Java?NIO(New?IO)是Java?1.4版本中引入的一套全新的IO處理機(jī)制,而NIO提供了四個(gè)核心組件:Channel、Buffer、Selector和SelectionKey,本文就來(lái)簡(jiǎn)單講講這四大組件的使用吧
    2023-05-05
  • jcl與jul?log4j1?log4j2?logback日志系統(tǒng)機(jī)制及集成原理

    jcl與jul?log4j1?log4j2?logback日志系統(tǒng)機(jī)制及集成原理

    這篇文章主要介紹了jcl與jul?log4j1?log4j2?logback的集成原理,Apache?Commons-logging?通用日志框架與日志系統(tǒng)的機(jī)制,有需要的朋友可以借鑒參考下
    2022-03-03
  • Java線程池由淺入深掌握到精通

    Java線程池由淺入深掌握到精通

    什么是線程池?很簡(jiǎn)單,簡(jiǎn)單看名字就知道是裝有線程的池子,我們可以把要執(zhí)行的多線程交給線程池來(lái)處理,和連接池的概念一樣,通過(guò)維護(hù)一定數(shù)量的線程池來(lái)達(dá)到多個(gè)線程的復(fù)用
    2021-09-09
  • SpringMVC實(shí)現(xiàn)上傳下載文件

    SpringMVC實(shí)現(xiàn)上傳下載文件

    這篇文章主要為大家詳細(xì)介紹了SpringMVC實(shí)現(xiàn)上傳下載文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • SpringBoot依賴(lài)和代碼分開(kāi)打包的實(shí)現(xiàn)步驟

    SpringBoot依賴(lài)和代碼分開(kāi)打包的實(shí)現(xiàn)步驟

    本文主要介紹了SpringBoot依賴(lài)和代碼分開(kāi)打包的實(shí)現(xiàn)步驟,,這種方法將依賴(lài)和代碼分開(kāi)打包,一般更新只有代碼修改,Pom文件是不會(huì)經(jīng)常改動(dòng)的,感興趣的可以了解一下
    2023-10-10
  • java設(shè)計(jì)模式—靜態(tài)代理模式(聚合與繼承方式對(duì)比)

    java設(shè)計(jì)模式—靜態(tài)代理模式(聚合與繼承方式對(duì)比)

    下面小編就為大家?guī)?lái)一篇java設(shè)計(jì)模式—靜態(tài)代理模式(聚合與繼承方式對(duì)比)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05

最新評(píng)論