MyBatis中的連接池及事物控制配置過(guò)程
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> <!–package標(biāo)簽用于指定doa接口所在的包,當(dāng)指定了之后就不需要在寫(xiě)mapper以及resource或者class了–> <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中MySQL的加解密函數(shù)實(shí)現(xiàn)敏感字段存儲(chǔ),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-03-03Mybatis詳解在注解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-03Java/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-10Spring Boot 與 Kotlin 上傳文件的示例代碼
這篇文章主要介紹了Spring Boot 與 Kotlin 上傳文件的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01jcl與jul?log4j1?log4j2?logback日志系統(tǒng)機(jī)制及集成原理
這篇文章主要介紹了jcl與jul?log4j1?log4j2?logback的集成原理,Apache?Commons-logging?通用日志框架與日志系統(tǒng)的機(jī)制,有需要的朋友可以借鑒參考下2022-03-03SpringBoot依賴(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-10java設(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