日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[转载] mybatis

發(fā)布時(shí)間:2025/3/11 编程问答 11 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转载] mybatis 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

參考鏈接: 在Java中使用_(下劃線)作為變量名

mybatis第一天??

1.mybatis概述和環(huán)境搭建??

mybatis概述??

mybatis環(huán)境搭建??

1. 創(chuàng)建maven工程、添加開發(fā)依賴、創(chuàng)建數(shù)據(jù)庫和表;??

2. 創(chuàng)建domain實(shí)體類和dao??

mybatis是一門java語言編寫持久層框架,大大簡化了jdbc操作,省去了我們注冊驅(qū)動,獲取連接等細(xì)節(jié)操作。??

??

org.mybatis?

mybatis?

3.4.5?

??

mysql?

mysql-connector-java?

8.0.11?

??

junit?

junit?

4.11?

test?

??

log4j?

log4j?

1.2.12?

3. 在resource中編寫mybatis主配置文件??

4. 編寫每個(gè)dao接口的映射配置文件??

/**??

* 用戶的持久層接口??

*/??

public interface IUserDao {??

/**??

* 查詢所有操作??

* @return??

*/??

List<User> findAll();??

}??

PUBLIC "-//mybatis.org//DTD Config 3.0//EN"??

"http://mybatis.org/dtd/mybatis-3-config.dtd">??

??

default="mysql">??

id="mysql">??

type="jdbc">??

type="pooled">??

name="driver" value="com.mysql.jdbc.Driver"/>??

name="url" value="jdbc:mysql://localhost:3306/mybatis"/>??

name="username" value="root"/>??

name="password" value="78910J"/>??

??

resource="com/itheima/dao/IUserDao.xml">??

5.注意事項(xiàng)??

6.測試類中測試方法編寫??

PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"??

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">??

namespace="com.itheima.dao.IUserDao">//namespace:接口的路徑 定位類中方法的具體位置??

id="findAll" resultType="com.itheima.domain.User"> SELECT * FROM USER??

1.在resource中創(chuàng)建IUserDao.xml時(shí),文件的位置必須和IUserDao包結(jié)構(gòu)相同,創(chuàng)建IUserDao.xml所在目錄結(jié)??

構(gòu)時(shí)要一級一級創(chuàng)建。??

2.映射配置文件中的mapper的namespace屬性值必須是IUserDao的全類名??

3.執(zhí)行sql操作的配置id屬性必須是執(zhí)行方法的名詞,例如 <select id="findAll"??

@Test??

public void testFindAll() throws IOException {??

//1.讀取SqlMapConfig.xml配置文件??

InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");??

//2.創(chuàng)建SqlSessionFactory工廠類??

SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();??

SqlSessionFactory factory = builder.build(is);??

//3.使用SqlSessionFactory工廠創(chuàng)建SqlSession核心對象??

/*SqlSessionFactory是MyBatis的關(guān)鍵對象,它是個(gè)單個(gè)數(shù)據(jù)庫映射??

關(guān)系經(jīng)過編譯后的內(nèi)存鏡像.SqlSessionFactory對象的實(shí)例可以通??

過SqlSessionFactoryBuilder對象類獲得,而SqlSessionFactoryBuilder??

則可以從XML配置文件或一個(gè)預(yù)先定制的Configuration的實(shí)例構(gòu)建出SqlSessionFactory??

的實(shí)例.每一個(gè)MyBatis的應(yīng)用程序都以一個(gè)SqlSessionFactory對象的實(shí)例為核心.??

同時(shí)SqlSessionFactory也是線程安全的,SqlSessionFactory一旦被創(chuàng)建,應(yīng)該在??

應(yīng)用執(zhí)行期間都存在.在應(yīng)用運(yùn)行期間不要重復(fù)創(chuàng)建多次,建議使用單例模式.SqlSessionFactory??

是創(chuàng)建SqlSession的工廠.*/??

SqlSession session = factory.openSession();//openSession方法默認(rèn)手動提交 填寫false就是自動??

提交 當(dāng)對表數(shù)據(jù)crud就需要提交事務(wù)??

//4.使用SqlSession創(chuàng)建接口的代理對象??

IUserDao userDao = session.getMapper(IUserDao.class);??

//5.執(zhí)行查詢方法??

List<User> users = userDao.findAll();??

for (User user : users) {??

System.out.println(user);??

}??

//6.釋放資源??

is.close();??

session.close();??

}2.mybatis注解開發(fā)和編寫dao實(shí)體類方式??

mybatis注解開發(fā)??

編寫dao實(shí)現(xiàn)類開發(fā)??

1.在核心配置文件SqlMapConfig.xml的<mappers>中添加注解映射方式:??

<mappers>??

<mapper class="com.itheima.dao.IUserMapper"/>??

mappers>??

2.定義接口和抽象方法,在抽象方法上添加對應(yīng)的注解:??

public interface IUserMapper {??

/**??

* 查詢所有用戶信息??

*/??

@Select("select * from user")??

public List<User> findList();??

}??

3.進(jìn)行測試:??

@Test??

public void testFindList() throws IOException {??

//1.讀取核心配置文件??

InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");??

//2.創(chuàng)建SqlSessionFactory工廠類??

SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();??

SqlSessionFactory factory = builder.build(is);??

//3.創(chuàng)建SqlSession核心對象??

SqlSession session = factory.openSession();??

//4.獲取dao代理對象??

IUserMapper mapper = session.getMapper(IUserMapper.class);??

//5.執(zhí)行查詢操作??

List<User> users = mapper.findList();??

for (User user : users) {??

System.out.println(user);??

}??

//6.釋放資源??

is.close();??

session.close();??

}??

1.編寫實(shí)現(xiàn)類:??

public class UserDaoImpl implements IUserDao{??

//1.聲明SqlSessionFactory工廠類??

private SqlSessionFactory factory;??

//2.構(gòu)造賦值??

public UserDaoImpl(SqlSessionFactory factory) {??

this.factory = factory;??

}??

@Override??

public List<User> findAll() {注意:同一個(gè)dao接口不允許配置兩種映射方式,例如:下列寫法是錯(cuò)誤的??

3.自定義mybatis框架??

流程分析??

自定義mybatis流程分析.png??

alt text??

Alt text??

alt text??

新建module,根據(jù)入門案例測試方法創(chuàng)建缺少的接口和類??

導(dǎo)入資料中utils目錄中的XMLConfifigBuilder.java文件,并修改錯(cuò)誤??

//1.創(chuàng)建核心的SqlSession對象??

SqlSession session = factory.openSession();??

//2.調(diào)用查詢的相關(guān)方法,哪個(gè)namespace中的哪個(gè)id方法對應(yīng)的sql??

List<User> users = session.selectList("com.itheima.dao.IUserDao.findAll");??

//3.釋放資源??

session.close();??

return users;??

}??

}??

2.進(jìn)行測試??

@Test??

public void testFindAllImpl() throws IOException {??

//1.讀取核心配置文件??

InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");??

//2.創(chuàng)建SqlSessionFactory工廠類??

SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();??

SqlSessionFactory factory = builder.build(is);??

//3.創(chuàng)建實(shí)現(xiàn)類對象并調(diào)用實(shí)現(xiàn)類方法查詢所有用戶信息??

UserDaoImpl dao=new UserDaoImpl(factory);??

List<User> users = dao.findAll();??

//4.遍歷輸出??

for (User user : users) {??

System.out.println(user);??

}??

//4.釋放資源??

is.close();??

}??

??

resource="com/itheima/dao/IUserDao.xml"/>??

class="com.itheima.dao.IUserDao"/>??

完成SqlSessionFactoryBuilder、SqlSessionFactory接口實(shí)現(xiàn)類、SqlSession接口實(shí)現(xiàn)類功能(實(shí)現(xiàn)類要自??

己創(chuàng)建)??

SqlSessionFactoryBuilder代碼實(shí)現(xiàn)??

1.添加依賴:??

<dependency>??

<groupId>dom4jgroupId>??

<artifactId>dom4jartifactId>??

<version>1.6.1version>??

dependency>??

<dependency>??

<groupId>jaxengroupId>??

<artifactId>jaxenartifactId>??

<version>1.1.6version>??

dependency>??

2.創(chuàng)建Configuration和Mapper兩個(gè)javabean對象??

public class Configuration {??

private String driver;??

private String url;??

private String username;??

private String password;??

private Map<String,Mapper> mappers=new HashMap<String, Mapper>();//保存多組映射信息的map集??

合??

// getter/setter方法省略??

public void setMappers(Map<String, Mapper> mappers) {??

this.mappers.putAll(mappers);??

}??

}??

public class Mapper {??

private String queryString;??

private String resultType;??

// getter/setter方法省略??

}??

/**??

* 構(gòu)建者對象??

*/??

public class SqlSessionFactoryBuilder {??

/**??

* 根據(jù)配置文件輸入流對象創(chuàng)建工廠對象??

* @param configStream 配置文件輸入流??

* @return??

*/??

public SqlSessionFactory build(InputStream configStream) {??

//1.使用XMLConfigBuilder解析配置文件??

Configuration configuration = XMLConfigBuilder.loadConfiguration(configStream);??

System.out.println("configuration = " + configuration);??

//2.創(chuàng)建工廠實(shí)現(xiàn)類對象并返回??

return new DefaultSqlSessionFactory(configuration);DefaultSqlSessionFactory代碼實(shí)現(xiàn)??

DefaultSqlSession代碼實(shí)現(xiàn)??

}??

}??

/**??

* SqlSessionFactory接口的實(shí)現(xiàn)類??

*/??

public class DefaultSqlSessionFactory implements SqlSessionFactory {??

//聲明封裝主配置文件對象??

private Configuration configuration;??

public DefaultSqlSessionFactory(Configuration configuration) {??

this.configuration=configuration;??

}??

/**??

* 生產(chǎn)操作數(shù)據(jù)庫的核心SqlSession對象??

* @return??

*/??

public SqlSession openSession() {??

//創(chuàng)建SqlSession實(shí)現(xiàn)類對象并返回??

return new DefaultSqlSession(configuration);??

}??

}??

/**??

* 操作數(shù)據(jù)庫核心SqlSession接口的實(shí)現(xiàn)類??

*/??

public class DefaultSqlSession implements SqlSession {??

//聲明封裝主配置文件對象,因?yàn)間etMapper需要連接和映射信息,所以需要這個(gè)配置對象??

private Configuration configuration;??

private Connection conn;??

public DefaultSqlSession(Configuration configuration) {??

this.configuration=configuration;??

//從連接池工具類中獲取連接對象??

conn= DataSourceUtils.getConnection(configuration);??

}??

/**??

* 通過動態(tài)代理的方式創(chuàng)建接口的實(shí)現(xiàn)類對象??

* @param daoClass 接口的Class對象??

* @param 返回接口實(shí)現(xiàn)類對象??

* @return??

*/??

public <T> T getMapper(Class<T> daoClass) {??

//創(chuàng)建dao代理對象并返回??

T t = (T) Proxy.newProxyInstance(daoClass.getClassLoader(),??

new Class[]{daoClass},??

new MapperProxy(configuration.getMappers(),conn));??

return t;DataSourceUtils工具類獲取連接??

InvocationHandler實(shí)現(xiàn)類MapperProxy的代碼實(shí)現(xiàn)??

}??

/**??

* 釋放資源??

*/??

public void close() {??

try {??

if (conn!=null) {??

conn.close();??

}??

} catch (SQLException e) {??

e.printStackTrace();??

}??

}??

}??

/**??

* 將來封裝連接池的工具類,目前不使用連接池??

*/??

public class DataSourceUtils {??

public static Connection getConnection(Configuration cfg) {??

//1.注冊驅(qū)動??

try {??

Class.forName(cfg.getDriver());??

//2.獲取連接??

return??

DriverManager.getConnection(cfg.getUrl(),cfg.getUsername(),cfg.getPassword());??

} catch (Exception e) {??

throw new RuntimeException(e);??

}??

}??

}??

/**??

* 當(dāng)dao代理對象的方法被調(diào)用時(shí),該監(jiān)聽類的invoke方法就會執(zhí)行??

*/??

public class MapperProxy implements InvocationHandler {??

//map集合的key=全類名+方法名??

private Map<String, Mapper> mappers;//封裝了sql語句和結(jié)果類型??

private Connection conn;//連接對象??

public MapperProxy(Map<String, Mapper> mappers,Connection conn) {??

this.mappers=mappers;??

this.conn=conn;??

}??

//當(dāng)dao代理對象的方法被調(diào)用時(shí),invoke方法就會執(zhí)行,參數(shù)method表示代理對象調(diào)用的方法??

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {??

//1.根據(jù)執(zhí)行的method方法從mappers集合中找到對應(yīng)的mapper對象??

//1.1.獲取方法名將MapperProxy中需要的Executor類從資料中復(fù)制到項(xiàng)目的utils包下,該Executor類的selectList方法幫??

我們查詢所有信息并封裝到List中??

注意:在沒網(wǎng)的情況下,需要刪除SqlMapConfifig和映射文件的約束信息;??

mybatis第二天??

1.mybatis的CRUD操作??

1.1.映射配置文件IUserDao.xml信息??

String methodName = method.getName();??

//1.2.獲取全類名??

String className = method.getDeclaringClass().getName();??

//1.3.拼接map集合的key,找到對應(yīng)的mapper對象??

String key=className+"."+methodName;??

System.out.println("key = " + key);??

//1.4.找到要的Mapper對象??

Mapper mapper = mappers.get(key);??

if (mapper==null) {??

//沒找到,配置的全類名有誤或者方法有誤??

throw new IllegalStateException("在"+className+"類中沒有"+methodName+"方法");??

}??

//2.調(diào)用Executor工具類的selectList方法執(zhí)行查詢操作??

return new Executor().selectList(mapper,conn);??

}??

}??

PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"??

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">??

namespace="com.itheima.dao.IUserDao">??

id="findAll" resultType="com.itheima.domain.User"> SELECT * from user??

id="saveUser" parameterType="com.itheima.domain.User">??

/*添加用戶信息之后查詢新用戶的id keyProperty對應(yīng)的是user的id屬性*/??

keyColumn="id" keyProperty="id" resultType="int" order="AFTER">??

select last_insert_id();??

/*selectKey是后來加的,在添加用戶信息時(shí)可以先忽略*/??

insert into user values (null,#{username},#{birthday},#{sex},#{address})??

id="updateUser" parameterType="com.itheima.domain.User">1.2.封裝數(shù)據(jù)的User類省略??

1.3.測試類代碼??

update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}??

where id=#{id}??

id="deleteUser" parameterType="Integer">??

delete from user where id=#{id}??

id="findById" resultType="com.itheima.domain.User" parameterType="int"> select * FROM user where id=#{id}??

id="findByName" parameterType="String" resultType="com.itheima.domain.User"> select * from user where username like #{username}??

id="findTotal" resultType="int"> select count(*) from user??

public class MybatisTest {??

private InputStream is;??

private SqlSession session;??

private IUserDao userDao;??

/**??

* 初始化mybatis??

*/??

@Before??

public void init() throws IOException {??

//1.加載核心配置文件SqlMapConfig.xml??

is = Resources.getResourceAsStream("SqlMapConfig.xml");??

//2.創(chuàng)建SqlSessionFactory工廠對象??

SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();??

SqlSessionFactory factory = builder.build(is);??

//3.創(chuàng)建核心SqlSession對象??

session = factory.openSession();??

//4.創(chuàng)建IUserDao對象??

userDao = session.getMapper(IUserDao.class);??

}??

/**??

* 測試查詢所有用戶信息的findAll()方法??

*/??

@Test??

public void testFindAll(){??

List<User> users = userDao.findAll();??

//遍歷打印??

for (User user : users) {System.out.println(user);??

}??

}??

/**??

* 測試保存用戶信息的saveUser()方法??

*/??

@Test??

public void testSaveUser(){??

//創(chuàng)建用戶信息??

User user=new User();??

user.setUsername("老周");??

user.setBirthday(new Date());??

user.setAddress("武漢");??

user.setSex("男");??

System.out.println("添加前user = " + user);??

//添加到數(shù)據(jù)??

int row = userDao.saveUser(user);??

System.out.println("影響的行數(shù)row = " + row);??

//在IUserDao.xml配置了selectKey后,添加完user就會查詢到新用戶的id并封裝到user的id屬性上。??

System.out.println("添加后user = " + user);??

}??

/**??

* 測試更新用戶信息的updateUser()方法??

*/??

@Test??

public void testUpdateUser(){??

//準(zhǔn)備要修改用戶的信息信息??

User user=new User();??

user.setId(52);??

user.setUsername("老李");??

user.setBirthday(new Date());??

user.setAddress("孝感");??

user.setSex("女");??

//修改用戶??

int row = userDao.updateUser(user);??

System.out.println("row = " + row);??

}??

/**??

* 測試更加用戶id刪除用戶信息的deleteUser()方法??

*/??

@Test??

public void testDeleteUser(){??

//根據(jù)id刪除用戶信息??

int row = userDao.deleteUser(52);??

System.out.println("row = " + row);??

}??

/**??

* 測試根據(jù)id查詢用戶信息的findById()方法??

*/??

@Test??

public void testFindById(){??

User user = userDao.findById(50);??

System.out.println(user);2.mybatis映射配置參數(shù)和返回值類型深入學(xué)習(xí)??

2.1.parameterType傳遞pojo包裝對象??

QueryVo實(shí)體類??

映射文件配置??

}??

/**??

* 測試根據(jù)用戶名稱模糊查詢的findByName()方法??

*/??

@Test??

public void testFindByName(){??

List<User> users = userDao.findByName("%王%");??

for (User user : users) {??

System.out.println(user);??

}??

}??

/**??

* 測試查詢總記錄條數(shù)的findTotal()方法??

*/??

@Test??

public void testFindTotal(){??

int total = userDao.findTotal();??

System.out.println("total = " + total);??

}??

/**??

* 釋放資源??

*/??

@After??

public void destory() throws IOException {??

//提交事務(wù)??

session.commit();??

//6.釋放資源??

session.close();??

is.close();??

}??

}??

public class QueryVo {??

private User user;??

public User getUser() {??

return user;??

}??

public void setUser(User user) {??

this.user = user;??

}??

}測試類測試方法編寫??

mybatis的dao層開發(fā)模式??

返回值類型-javabean的屬性和表字段名一致情況(了解)??

javabean實(shí)體類??

id="findByVo" parameterType="com.itheima.domain.QueryVo" resultType="com.itheima.domain.User"> /*username是user的屬性,user是QueryVo的屬性*/ select * from user where username like #{user.username}??

/**??

* 測試根據(jù) QueryVo 中的條件查詢用戶的findByVo()方法??

*/??

@Test??

public void testFindByVo(){??

//創(chuàng)建QueryVo對象??

QueryVo queryVo=new QueryVo();??

//創(chuàng)建模糊查詢條件封裝到user對象中??

User user=new User();??

user.setUsername("%王%");??

queryVo.setUser(user);??

//執(zhí)行查詢??

List<User> users = userDao.findByVo(queryVo);??

//遍歷打印??

for (User u : users) {??

System.out.println(u);??

}??

}??

* 基于DAO代理方式(推薦使用)??

* CRUD操作(保存操作|修改操作|刪除操作|查詢一個(gè)|模糊查詢|單值查詢|獲取保存對象的id)??

* 模糊查詢需要注意??

* 獲取保存對象的id??

* 輸入?yún)?shù) parameterType屬性??

* 輸入?yún)?shù)的類型:int、string、User、plain old java object、包裝類型ValueObject??

* 輸出參數(shù) resultType屬性、??

* 輸入?yún)?shù)的類型:User、int、string??

* 解決實(shí)體類屬性和數(shù)據(jù)庫列名不對應(yīng)??

* 在sql語句上取別名, 對應(yīng), 簡單??

* 通過resultMap屬性來映射java對象和數(shù)據(jù)庫列名之間的關(guān)系??

* <result property="userName" column="username">result>??

property 遵循的是駝峰規(guī)則; column 單詞下劃線隔開解決辦法1:sql的結(jié)果集使用別名,別名和javabean的屬性一致??

好處:查詢效率高;弊端:書寫麻煩,開發(fā)效率低。??

解決辦法2:使用mybatis給我們提供的配置結(jié)果集映射??

好處:id="UMap"的可以重復(fù)使用,開發(fā)效率高;弊端:查詢效率略低。??

編寫測試類測試方法??

public class U {??

private Integer userId;??

private String userName;??

private Date userBirthday;??

private String userSex;??

private String userAddress;??

//自動生成setter、getter、toString省略,此時(shí)屬性和表的字段名不一致??

}??

id="findAllU" resultType="com.itheima.domain.U"> select id userId,username userName,birthday userBirthday,sex userSex,address userAddress from user;??

id="UMap" type="com.itheima.domain.U">??

column="id" property="userId"/>??

column="username" property="userName"/>??

column="birthday" property="userBirthday"/>??

column="sex" property="userSex"/>??

column="address" property="userAddress"/>??

id="findAllU" resultMap="UMap"> select * from user; 3.mybatis中編寫dao實(shí)現(xiàn)類的使用(了解)??

UserDaoImpl實(shí)現(xiàn)類代碼??

/**??

* 測試使用別名,查詢所有用戶信息的findAllU()方法??

*/??

@Test??

public void testFindAllU(){??

List<U> us = userDao.findAllU();??

//遍歷打印??

for (U u : us) {??

System.out.println(u);??

}??

}??

public class UserDaoImpl implements IUserDao {??

private SqlSessionFactory factory;??

//接收工廠對象,用于創(chuàng)建SqlSession對象??

public UserDaoImpl(SqlSessionFactory factory) {??

this.factory = factory;??

}??

@Override??

public List<User> findAll() {??

//1.創(chuàng)建核心的SqlSession對象??

SqlSession session = factory.openSession();??

//2.調(diào)用selectList方法查詢所有用戶信息??

List<User> users = session.selectList("com.itheima.dao.IUserDao.findAll");??

//3.釋放資源??

session.close();??

return users;??

}??

@Override??

public int saveUser(User user) {??

//1.創(chuàng)建核心的SqlSession對象??

SqlSession session = factory.openSession();??

//2.調(diào)用insert方法添加一條用戶信息??

int row = session.insert("com.itheima.dao.IUserDao.saveUser", user);??

//3.提交并釋放資源??

session.commit();??

session.close();??

//返回影響的函數(shù)??

return row;??

}??

@Override??

public int updateUser(User user) {??

//1.創(chuàng)建核心的SqlSession對象??

SqlSession session = factory.openSession();??

//2.調(diào)用update方法修改一條用戶信息??

int row = session.update("com.itheima.dao.IUserDao.updateUser", user);??

//3.提交并釋放資源session.commit();??

session.close();??

//返回影響的函數(shù)??

return row;??

}??

@Override??

public int deleteUser(int id) {??

//1.創(chuàng)建核心的SqlSession對象??

SqlSession session = factory.openSession();??

//2.調(diào)用delete方法刪除一條用戶信息??

int row = session.delete("com.itheima.dao.IUserDao.deleteUser", id);??

//3.提交并釋放資源??

session.commit();??

session.close();??

//返回影響的函數(shù)??

return row;??

}??

@Override??

public User findById(Integer id) {??

//1.創(chuàng)建核心的SqlSession對象??

SqlSession session = factory.openSession();??

//2.調(diào)用selectList方法查詢所有用戶信息??

User user = session.selectOne("com.itheima.dao.IUserDao.findById",id);??

//3.釋放資源??

session.close();??

return user;??

}??

@Override??

public List<User> findByName(String username) {??

//1.創(chuàng)建核心的SqlSession對象??

SqlSession session = factory.openSession();??

//2.調(diào)用selectList方法根據(jù)username模糊查詢所有用戶信息??

List<User> users = session.selectList("com.itheima.dao.IUserDao.findByName",username);??

//3.釋放資源??

session.close();??

return users;??

}??

@Override??

public int findTotal() {??

//1.創(chuàng)建核心的SqlSession對象??

SqlSession session = factory.openSession();??

//2.調(diào)用delete方法刪除一條用戶信息??

int total = session.selectOne("com.itheima.dao.IUserDao.findTotal");??

//3.釋放資源??

session.close();??

//返回總記錄數(shù)??

return total;??

}??

@Override??

public List<User> findByVo(QueryVo vo) {??

//1.創(chuàng)建核心的SqlSession對象??

SqlSession session = factory.openSession();??

//2.調(diào)用selectList方法根據(jù)vo.user.username模糊查詢所有用戶信息修改測試類init方法和destory方法即可,其他測試方法都不需要改??

4.mybatis中編寫dao實(shí)現(xiàn)類的使用過程分析??

5.properties標(biāo)簽、typeAliases標(biāo)簽、package標(biāo)簽使用??

5.1.properties標(biāo)簽的作用??

List<User> users =??

session.selectList("com.itheima.dao.IUserDao.findByName",vo.getUser().getUsername());??

//3.釋放資源??

session.close();??

return users;??

}??

@Override??

public List<U> findAllU() {??

//1.創(chuàng)建核心的SqlSession對象??

SqlSession session = factory.openSession();??

//2.調(diào)用selectList方法查詢所有用戶信息??

List<U> us = session.selectList("com.itheima.dao.IUserDao.findAllU");??

//3.釋放資源??

session.close();??

return us;??

}??

}??

@Before??

public void init() throws IOException {??

//1.加載核心配置文件SqlMapConfig.xml??

is = Resources.getResourceAsStream("SqlMapConfig.xml");??

//2.創(chuàng)建SqlSessionFactory工廠對象??

SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();??

SqlSessionFactory factory = builder.build(is);??

/*如果是使用dao代理方式,則需要創(chuàng)建SqlSession對象,并獲取dao的代理對象*/??

/*//3.創(chuàng)建核心SqlSession對象??

session = factory.openSession();??

//4.創(chuàng)建IUserDao對象??

userDao = session.getMapper(IUserDao.class);*/??

/*如果使用的是自定義dao實(shí)現(xiàn)類方法,則需要創(chuàng)建dao實(shí)現(xiàn)類對象,并傳遞factory工廠對象*/??

userDao=new UserDaoImpl(factory);??

}??

@After??

public void destory() throws IOException {??

//提交事務(wù),如果是自定義dao實(shí)現(xiàn)類就不需要,在實(shí)現(xiàn)類內(nèi)部提交??

//session.commit();??

//6.釋放資源,如果是自定義dao實(shí)現(xiàn)類就不需要,在實(shí)現(xiàn)類內(nèi)部關(guān)閉??

//session.close();??

is.close();??

}作用:將連接數(shù)據(jù)庫的信息單獨(dú)配置到一個(gè)properties屬性文件中,配置方式如下??

外部jdbcConfifig.properties配置文件??

在SqlMapConfifig.xml跟標(biāo)簽下使用properties標(biāo)簽引入jdbcConfifig.properties??

在dataSource中引入外部properties的各個(gè)屬性??

5.2.typeAliases標(biāo)簽、package標(biāo)簽使用作用??

SqlMapConfifig.xml跟標(biāo)簽下使用typeAliases標(biāo)簽作用 :javabean取別名(了解)??

jdbc.driver=com.mysql.jdbc.Driver??

jdbc.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=Asia/Shanghai??

jdbc.username=root??

jdbc.password=78910J??

??

name="driver" value="com.mysql.jdbc.Driver"/>??

name="url" value="jdbc:mysql://localhost:3306/mybatis???

serverTimezone=Asia/Shanghai"/>??

name="username" value="root"/>??

name="password" value="78910J"/>??

或者??

resource="jdbcConfig.properties">??

或者??

url="??

file:///D:/IdeaProjects/day02_eesy_01mybatisCRUD/src/main/resources/jdbcConfig.prop??

erties">??

type="pooled">??

name="driver" value="${jdbc.driver}"/>??

name="url" value="${jdbc.url}"/>??

name="username" value="${jdbc.username}"/>??

name="password" value="${jdbc.password}"/>??

typeAliases標(biāo)簽下使用package標(biāo)簽作用 :指定包下的所有javabean的類名就是其別名,不區(qū)分大小寫??

(實(shí)用)??

Mappers標(biāo)簽下使用package標(biāo)簽作用 :不用寫mapper標(biāo)簽,resources或class指定包下所有dao對應(yīng)的??

映射文件都不用引入了,并且可以找到dao的接口或者dao接口對應(yīng)的配置。(實(shí)用)??

mybatis第三天??

1.mybatis中連接池以及事務(wù)管理??

1.1 mybatis連接池??

mybatis中三種數(shù)據(jù)源介紹??

在sqlMapConfifig.xml中配置??

??

type="com.itheima.domain.User" alias="user"/>??

??

??

name="com.itheima.dao"/>??

UNPOOLED 不使用連接池的數(shù)據(jù)源,需要連接對象就使用DriverManager創(chuàng)建獲取一個(gè),使用完成就直接銷毀??

POOLED 使用連接池的數(shù)據(jù)源 (很常用)??

JNDI 使用 JNDI 實(shí)現(xiàn)的數(shù)據(jù)源(最后講解,了解)1.2 mybatis事務(wù)管理??

mybatis中默認(rèn)是開啟也是,也就是增刪改之后需要手動session.commit()方法手動提交事務(wù);但是我們也可以設(shè)??

置自動提交,在增刪改完成之后不需要手動調(diào)用session.commit()提交事務(wù)。只需要在session =??

factory.openSession(true);參數(shù)true表示自動提交。??

2.mybatis中動態(tài)SQL??

使用場景:如果條件存在就帶條件查詢,如果條件不存在就不帶條件查詢,適用于搜索等場景。??

2.1 if標(biāo)簽 - 動態(tài)添加條件??

在IUserDao.xml中配置查詢語句??

2.2 where 標(biāo)簽 - 代替where 1=1??

在IUserDao.xml中修改之前配置的查詢語句??

在sqlMapConfig.xml中配置如下??

type="pooled">??

name="driver" value="${jdbc.driver}"/>??

name="url" value="${jdbc.url}"/>??

name="username" value="${jdbc.username}"/>??

name="password" value="${jdbc.password}"/>??

MyBatis 在初始化時(shí),根據(jù)的 type 屬性來創(chuàng)建相應(yīng)類型的的數(shù)據(jù)源 DataSource,即:??

type="POOLED": MyBatis 會創(chuàng)建 PooledDataSource 實(shí)例??

type="UNPOOLED": MyBatis 會創(chuàng)建 UnpooledDataSource 實(shí)例??

type="JNDI": MyBatis 會從 JNDI 服務(wù)上查找 DataSource 實(shí)例,然后返回使用??

id="findUserByCondition1" parameterType="user" resultType="user"> select * from user where 1=1 test="username!=null and username!=''">//連接判斷條件不能為&&和|| and username = #{username} test="sex!=null"> and sex = #{sex} 2.3 foreach標(biāo)簽 - 遍歷,適用于in的條件??

foreach元素的屬性主要有 item,index,collection,open,separator,close。??

item: 循環(huán)體中的具體對象。支持屬性的點(diǎn)路徑訪問,如 item.age,item.info.details。具體說明:在 list 和數(shù)??

組中是其中的對象,在 map 中是 value,該參數(shù)為必選。(它是每一個(gè)元素進(jìn)行迭代時(shí)的別名)??

index:在 list 和數(shù)組中,index 是元素的序號;在 map 中,index 是元素的 key。??

open :表示該語句以什么開始??

separator :表示在每次進(jìn)行迭代之間以什么符號作為分隔符??

close :表示以什么結(jié)束??

_parameter :不只是方法傳遞過來的參數(shù)可以被用來判斷,取值??

_parameter:代表整個(gè)參數(shù)??

單個(gè)參數(shù):_parameter就是這個(gè)參數(shù)??

多個(gè)參數(shù): 1.參數(shù)會被封裝為一個(gè)map:_parameter就是代表這個(gè)map??

2._parameter 可以get(0)得到第一個(gè)參數(shù)。??

在使用foreach的時(shí)候最關(guān)鍵的也是最容易出錯(cuò)的就是collection屬性,該屬性是必須指定的,但是在不同情況 下,該??

屬性的值是不一樣的,主要有一下3種情況:??

1.如果傳入的是單參數(shù)且參數(shù)類型是一個(gè)List的時(shí)候,collection屬性值為list??

2.如果傳入的是單參數(shù)且參數(shù)類型是一個(gè)array數(shù)組的時(shí)候,collection的屬性值為array??

3.如果傳入的參數(shù)是多個(gè)的時(shí)候,我們就需要把它們封裝成一個(gè)Map了,當(dāng)然單參數(shù)也可以封裝成map??

遍歷map集合??

id="findUserByCondition1" parameterType="user" resultType="user"> select * from user test="username!=null and username!=''"> and username = #{username} test="sex!=null"> and sex = #{sex} 需求:根據(jù)qv中l(wèi)ist集合查詢用戶信息-??

在IUserDao.xml中配置查詢語句??

測試類中測試- QueryVo中添加ids屬性省略了??

id="findByMap" parameterType="map" resultType="cn.itcast.mybatis.pojo.Product"> select * from user collection="_parameter" index="key" item="value" separator="and"> test="value !=null"> ${key} = #{value}??

id="findUserByCondition2" parameterType="QueryVo" resultType="user"> select * from user test="ids!=null and ids.size>0"> id="findUserByCondition2" parameterType="QueryVo" resultType="user">??

select * from user??

??

test="ids!=null and ids.size>0">??

and id in(??

collection="ids" item="uid" separator=",">??

#{uid}??

)??

@Test??

public void testFindUserByCondition2(){??

QueryVo qv=new QueryVo();??

List<Integer> ids=new ArrayList<Integer>();??

ids.add(41);2.4 補(bǔ)充1:抽取公共的sql語句??

在IUserDao.xml中跟標(biāo)簽中使用sql標(biāo)簽定義公共sql語句??

在中使用標(biāo)簽引入公共sql 3.mybatis多表之間關(guān)系 3.1 一對一關(guān)系 需求:一個(gè)賬戶只屬于一個(gè)用戶,查詢賬戶信息的同時(shí)查詢用戶信息 實(shí)現(xiàn)步驟: 一對一映射 代碼示例: 1.創(chuàng)建Account實(shí)體類以及IAccountDao接口 ids.add(45); ids.add(46); ids.add(48); qv.setIds(ids); List<User> list = userDao.findUserByCondition2(qv); //變量展示 for (User u : list) { System.out.println("u = " + u); } } id="selectTemplate"> select * from user id="findAll" resultType="com.itheima.domain.User">??

refid="selectTemplate"/>??

1.創(chuàng)建Account實(shí)體類以及IAccountDao接口??

2.創(chuàng)建IAccountDao.xml映射問題??

3.創(chuàng)建AccountDaoTest測試類進(jìn)行測試??

public class Account implements Serializable {??

private Integer id;??

private Integer uid;??

private Double money;??

//封裝對應(yīng)的user對象2.創(chuàng)建IAccountDao.xml映射文件??

3.創(chuàng)建AccountTest測試類進(jìn)行測試??

private User user;??

//setter、getter、toString方法省略??

}??

public interface IAccountDao {??

/**??

* 查詢所有賬號信息同時(shí)查詢對應(yīng)用戶信息??

* @return??

*/??

List<Account> findAll();??

}??

namespace="com.itheima.dao.IAccountDao">??

id="accountUserMap" type="account">??

column="aid" property="id"/>??

column="uid" property="uid"/>??

column="money" property="money"/>??

property="user" javaType="user" column="uid">??

column="id" property="id"/>??

column="username" property="username"/>??

column="birthday" property="birthday"/>??

column="sex" property="sex"/>??

column="address" property="address"/>??

id="findAll" resultMap="accountUserMap"> /*注意:當(dāng)多表查詢結(jié)果有相同字段名時(shí),我們需要取別名區(qū)分*/ SELECT u.*,a.id aid,a.UID,a.MONEY FROM user u,account a where u.id=a.UID;??

@Test??

public void testFindAll(){??

//1.調(diào)用findAll方法??

List<Account> list = accountDao.findAll();??

//2.遍歷打印結(jié)果??

for (Account account : list) {??

System.out.println(account);??

}??

}注意:當(dāng)多表查詢結(jié)果有相同字段名時(shí),我們需要取別名區(qū)分??

3.2 一對多關(guān)系??

需求:一個(gè)用戶有多個(gè)賬戶,查詢用戶信息的同時(shí)查詢其所有賬戶信息??

實(shí)現(xiàn)步驟??

一對多映射??

代碼示例??

在IUserDao中添加新的查詢方法??

在IUserDao.xml中重新配置查詢語句??

編寫UserTest測試類進(jìn)行測試??

1.在user中添加List<Account> accounts屬性,在IUserDao中添加新的查詢方法??

2.在IUserDao.xml中重新配置查詢語句??

3.在AccountDaoTest測試類進(jìn)行測試??

/**??

* 多表查詢:查詢用戶信息的同時(shí)查詢其所有賬戶信息??

* @return??

*/??

List<User> findAllUserAndAccount();??

id="userAccountMap" type="user">??

column="id" property="id"/>??

column="username" property="username"/>??

column="birthday" property="birthday"/>??

column="sex" property="sex"/>??

column="address" property="address"/>??

property="accounts" javaType="java.util.List" ofType="account">??

column="id" property="id"/>??

column="uid" property="uid"/>??

column="money" property="money"/>??

id="findAllUserAndAccount" resultMap="userAccountMap"> SELECT * FROM user u LEFT OUTER JOIN account a ON u.id = a.UID; 3.3 多對多關(guān)系??

3.3.1 需求1:查詢角色信息以及該角色對應(yīng)的所有用戶信息??

實(shí)現(xiàn)步驟??

代碼示例??

1.創(chuàng)建實(shí)體類Role以及IRoleDao接口??

/**??

* 多表查詢:查詢用戶信息的同時(shí)查詢其所有賬戶信息??

*/??

@Test??

public void testFindAllUserAndAccount(){??

List<User> users = userDao.findAllUserAndAccount();??

for (User user : users) {??

System.out.println(user);??

}??

}??

1.創(chuàng)建實(shí)體類Role以及IRoleDao接口??

2.創(chuàng)建IRoleDao.xml映射文件,并配置查詢信息??

3.創(chuàng)建RoleDaoTest測試類,并測試查詢方法??

public class Role {??

private Integer id;??

private String roleName;??

private String roleDesc;??

//封裝該角色對應(yīng)的所有用戶信息??

private List<User> users;??

//setter、getter、toString方法省略??

}??

public interface IRoleDao {2.創(chuàng)建IRoleDao.xml映射文件,并配置查詢信息??

3.創(chuàng)建RoleDaoTest測試類,并測試查詢方法??

3.3.2 需求2:查詢用戶信息以及該用戶對應(yīng)的所有角色信息??

實(shí)現(xiàn)步驟??

代碼示例??

/**??

* 需求1:查詢角色信息以及該角色對應(yīng)的所有用戶信息??

*/??

List<Role> findAll();??

}??

namespace="com.itheima.dao.IRoleDao">??

id="roleMap" type="role">??

column="rid" property="id"/>??

column="ROLE_NAME" property="roleName"/>??

column="ROLE_DESC" property="roleDesc"/>??

property="users" javaType="java.util.List" ofType="user">??

column="id" property="id"/>??

column="username" property="username"/>??

column="birthday" property="birthday"/>??

column="sex" property="sex"/>??

column="address" property="address"/>??

id="findAll" resultMap="roleMap"> SELECT r.ID rid,r.ROLE_NAME,r.ROLE_DESC,u.* FROM role r LEFT JOIN user_role ur ON r.ID = ur.RID LEFT JOIN user u ON ur.UID = u.id??

@Test??

public void testFindAll(){??

List<Role> roles = roleDao.findAll();??

for (Role role : roles) {??

System.out.println(role);??

}??

}??

1.在實(shí)體類User中添加List<Role> roles屬性,并在IUserDao中添加新的查詢方法??

2.在IUserDao.xml中重新配置查詢語句??

3.在UserDaoTest測試類進(jìn)行測試1.在IUserDao中添加新的查詢方法??

2.在IUserDao.xml中重新配置查詢語句??

3.在UserDaoTest測試類進(jìn)行測試??

4.補(bǔ)充:JNDI??

mybatis第四天??

1.mybatis延遲加載??

1.1 概念??

/**??

* 需求2:查詢用戶信息以及該用戶對應(yīng)的所有角色信息??

*/??

List<User> findAllUserAndRole();??

id="userRoleMap" type="user">??

column="id" property="id"/>??

column="username" property="username"/>??

column="birthday" property="birthday"/>??

column="sex" property="sex"/>??

column="address" property="address"/>??

property="roles" javaType="java.util.List" ofType="role">??

column="rid" property="id"/>??

column="ROLE_NAME" property="roleName"/>??

column="ROLE_DESC" property="roleDesc"/>??

id="findAllUserAndRole" resultMap="userRoleMap"> SELECT u.*,r.ID rid,r.ROLE_NAME,r.ROLE_DESC FROM user u LEFT JOIN user_role ur ON u.id = ur.UID LEFT JOIN role r ON ur.RID = r.ID;??

@Test??

public void testFindAllUserAndRole(){??

List<User> users = userDao.findAllUserAndRole();??

for (User user : users) {??

System.out.println(user);??

}??

}1.2 一對一實(shí)現(xiàn)延遲加載??

1.2.1 在主配置文件SqlMapConfifig.xml中開啟全局延遲加載??

1.2.2 在映射配置文件IAccountDao.xml中配置延遲加載查詢??

1.2.3 在AccountDaoTest測試類中進(jìn)行測試??

1.3 一對多實(shí)現(xiàn)延遲加載??

1.3.1 在映射配置文件IUserDao.xml中配置延遲加載查詢??

1.立即加載:只要一調(diào)用方法,不管用不用的到數(shù)據(jù)都立馬去關(guān)聯(lián)查詢??

2.延遲加載:只有再用到數(shù)據(jù)時(shí)才去關(guān)聯(lián)查詢,不用就不關(guān)聯(lián)查詢,好處:先從單表查詢,需要時(shí)再從關(guān)聯(lián)表去關(guān)聯(lián)查??

詢,大大提高數(shù)據(jù)庫性能;延遲加載也叫按需加載或懶加載??

??

name="lazyLoadingEnabled" value="true"/>??

name="aggressiveLazyLoading" value="false"/>??

id="accountMap" type="account">??

column="id" property="id"/>??

column="uid" property="uid"/>??

column="money" property="money"/>??

property="user" javaType="user" column="uid"??

select="com.itheima.dao.IUserDao.findById"/>??

id="findAll" resultMap="accountMap"> select * FROM account??

/**??

* 延遲加載:查詢所有賬號信息同時(shí)查詢對應(yīng)用戶信息??

*/??

@Test??

public void testFindAll() {??

List<Account> accounts = accountDao.findAll();??

/*只要不調(diào)用和user相關(guān)的方法,就不會查關(guān)聯(lián)表中的數(shù)據(jù)*/??

for (Account account : accounts) {??

System.out.println(account.getId()+","+account.getUid()+","+account.getMoney());??

}??

}1.3.2 在IAccountDao中添加fifindAccountById方法并在IAccountDao.xml配置??

1.3.3 在UserDaoTest測試類中進(jìn)行測試??

2.mybatis中的一級緩存和二級緩存??

2.1 緩存的概念??

2.2 一級緩存??

概念??

id="userMap" type="user">??

column="id" property="id"/>??

column="username" property="username"/>??

column="birthday" property="birthday"/>??

column="sex" property="sex"/>??

column="address" property="address"/>??

property="accounts" ofType="account"??

select="com.itheima.dao.IAccountDao.findAccountById" column="id"/>??

id="findAll" resultMap="userMap"> SELECT * FROM USER ;??

id="findAccountById" parameterType="int" resultType="account"> SELECT * FROM account where uid=#{uid};??

@Test??

public void testFindAll() {??

List<User> list = userDao.findAll();??

for (User u : list) {??

System.out.println(u.getId()+","+u.getUsername()+","+u.getBirthday()+","+u.getSex()+","+u.getAd??

dress());??

/*只要不調(diào)用和account相關(guān)的方法,就不會查關(guān)聯(lián)表中的數(shù)據(jù)*/??

/*System.out.println(u.getAccounts());*/??

}??

}??

存在內(nèi)存中的臨時(shí)數(shù)據(jù)就是緩存代碼演示??

結(jié)果說明??

2.3 二級緩存??

概念??

代碼演示??

它指的是Mybatis中SqlSession對象的緩存。當(dāng)我們執(zhí)行查詢之后,查詢的結(jié)果會同時(shí)存入到SqlSession為我們??

提供一塊區(qū)域中。該區(qū)域的結(jié)構(gòu)是一個(gè)Map。當(dāng)我們再次查詢同樣的數(shù)據(jù),mybatis會先去sqlsession中查詢是否有,有??

的話直接拿出來用。當(dāng)SqlSession對象消失時(shí)(close方法被調(diào)用),mybatis的一級緩存也就消失了。??

@Test??

public void testFirstLeverCache(){??

User user1 = userDao.findById(43);??

System.out.println("user1 = " + user1);??

//測試一下關(guān)閉session??

/*session.close();??

session=factory.openSession(true);??

userDao=session.getMapper(IUserDao.class);*/??

//也可以清除緩存??

//session.clearCache();??

//再次執(zhí)行相同的查詢??

User user2 = userDao.findById(43);??

System.out.println("user2 = " + user2);??

//判斷user1和user2是不是同一個(gè)對象??

System.out.println("user1==user2 : " + (user1==user2));??

}??

如果是同一個(gè)session對象,那么第二次查詢的user對象和第一次查詢的user對象是同一個(gè)user對象,最后打印的??

結(jié)果是true,通過控制臺日志可以看出只執(zhí)行了一次查詢;當(dāng)中間關(guān)閉了session或者調(diào)用clearCache方法清除緩存之??

后,那兩個(gè)user對象就不是同一個(gè)對象了,控制臺查看日志也會發(fā)現(xiàn)執(zhí)行了兩次查詢。??

它指的是Mybatis中SqlSessionFactory對象的緩存。由同一個(gè)SqlSessionFactory對象創(chuàng)建的SqlSession共享??

其緩存。??

二級緩存的使用步驟:??

第一步:讓Mybatis框架支持二級緩存(在SqlMapConfig.xml中配置)??

第二步:讓當(dāng)前的映射文件支持二級緩存(在IUserDao.xml中配置)??

第三步:讓當(dāng)前的操作支持二級緩存(在select標(biāo)簽中配置)??

@Test??

public void testSecondLeverCache(){??

//1.獲取第一個(gè)sqlSession對象并查詢user??

SqlSession session1 = factory.openSession(true);??

IUserDao userDao1 = session1.getMapper(IUserDao.class);??

User user1 = userDao1.findById(43);結(jié)果說明以及注意事項(xiàng)??

3.mybatis注解開發(fā)??

3.1 mybatis注解開發(fā)CRUD操作??

3.1.1 SqlMapConfifig核心配置文件環(huán)境搭建??

System.out.println("user1 = " + user1);??

//關(guān)閉session1??

session1.close();??

//2.獲取第二個(gè)sqlSession對象并查詢user??

SqlSession session2 = factory.openSession(true);??

IUserDao userDao2 = session2.getMapper(IUserDao.class);??

User user2 = userDao2.findById(43);??

System.out.println("user2 = " + user2);??

session2.close();??

//判斷user1和user2是不是同一個(gè)對象??

System.out.println("user1==user2 : " + (user1==user2));??

}??

兩個(gè)對象雖然不是同一個(gè)對象,但是通過控制臺發(fā)現(xiàn)只執(zhí)行了一次查詢??

注意:一定要關(guān)閉之前的sqlSession對象??

PUBLIC "-//mybatis.org//DTD Config 3.0//EN"??

"http://mybatis.org/dtd/mybatis-3-config.dtd">??

??

resource="jdbcConfig.properties"/>??

??

name="com.itheima.domain"/>??

default="mysql">??

id="mysql">??

type="jdbc">??

type="pooled">??

name="driver" value="${jdbc.driver}"/>??

name="url" value="${jdbc.url}"/>??

name="username" value="${jdbc.username}"/>??

name="password" value="${jdbc.password}"/>??

??

name="com.itheima.dao"/>??

3.1.2 IUserDao中給方法添加注解??

/**??

* 查詢所有操作??

* @return??

*/??

@Select("select * from user")??

List<User> findAll();??

/**??

* 保存用戶??

* @param user??

* @return 影響數(shù)據(jù)庫記錄的行數(shù)??

*/??

@Insert("insert into user values(null,#{username},#{birthday},#{sex},#{address})")??

//配置SelectKey將新添加用戶的id封裝到user中??

@SelectKey(keyColumn = "id",keyProperty = "id",resultType =int.class,before = false, statement =??

"select last_insert_id()")??

int saveUser(User user);??

/**??

* 更新用戶??

* @param user??

* @return 影響數(shù)據(jù)庫記錄的行數(shù)??

*/??

@Update("update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}??

where id=#{id}")??

int updateUser(User user);??

/**??

* 根據(jù) id 刪除用戶??

* @param id??

* @return 影響數(shù)據(jù)庫記錄的行數(shù)??

*/??

@Delete("delete from user where id=#{id}")??

int deleteUser(int id);??

/**??

* 根據(jù) id 查詢??

* @param id??

* @return??

*/??

@Select("select * from user where id=#{id}")??

User findById(Integer id);??

/**??

* 根據(jù)名稱模糊查詢??

* @param username??

* @return??

*/??

@Select("select * from user where username LIKE #{username};")??

List<User> findByName(String username);??

/**3.1.3 在測試類中測試??

* 查詢總記錄條數(shù)??

* @return 總記錄條數(shù)??

*/??

@Select("select count(*) from user;")??

int findTotal();??

/**??

* 根據(jù) QueryVo 中的條件查詢用戶??

* @param vo??

* @return??

*/??

@Select(" select * from user where username like #{user.username}")??

List<User> findByVo(QueryVo vo);??

private InputStream is;??

private SqlSession session;??

private IUserDao userDao;??

private SqlSessionFactory factory;??

@Before??

public void init() throws IOException {??

//1.獲取主配置文件輸入流??

is = Resources.getResourceAsStream("SqlMapConfig.xml");??

//2.創(chuàng)建SqlSessionFactory工廠對象??

factory = new SqlSessionFactoryBuilder().build(is);??

//3.創(chuàng)建核心SqlSession對象??

session = factory.openSession(true);??

//4.獲取IAccountDao代理對象??

userDao = session.getMapper(IUserDao.class);??

}??

//查詢所有操作??

@Test??

public void findAll(){??

List<User> users = userDao.findAll();??

for (User user : users) {??

System.out.println(user);??

}??

}??

//保存用戶??

@Test??

public void saveUser(){??

//創(chuàng)建用戶信息??

User user=new User();??

user.setUsername("老周");??

user.setBirthday(new Date());??

user.setAddress("武漢");??

user.setSex("男");??

System.out.println("添加前user = " + user);??

//添加到數(shù)據(jù)??

int row = userDao.saveUser(user);??

System.out.println("影響的行數(shù)row = " + row);System.out.println("添加后user = " + user);??

}??

//更新用戶??

@Test??

public void updateUser(){??

//準(zhǔn)備要修改用戶的信息信息??

User user=new User();??

user.setId(55);??

user.setUsername("老李");??

user.setBirthday(new Date());??

user.setAddress("孝感");??

user.setSex("女");??

//修改用戶??

int row = userDao.updateUser(user);??

System.out.println("row = " + row);??

}??

//根據(jù) id 刪除用戶??

@Test??

public void deleteUser(){??

//根據(jù)id刪除用戶信息??

int row = userDao.deleteUser(55);??

System.out.println("row = " + row);??

}??

//根據(jù) id 查詢??

@Test??

public void findById(){??

User user = userDao.findById(50);??

System.out.println(user);??

}??

//根據(jù)名稱模糊查詢??

@Test??

public void findByName(){??

List<User> users = userDao.findByName("%王%");??

for (User user : users) {??

System.out.println(user);??

}??

}??

//查詢總記錄條數(shù)??

@Test??

public void findTotal(){??

int total = userDao.findTotal();??

System.out.println("total = " + total);??

}??

//根據(jù) QueryVo 中的條件查詢用戶??

@Test??

public void findByVo(){??

//創(chuàng)建QueryVo對象??

QueryVo queryVo=new QueryVo();??

//創(chuàng)建模糊查詢條件封裝到user對象中??

User user=new User();??

user.setUsername("%王%");??

queryVo.setUser(user);??

//執(zhí)行查詢3.2 mybatis注解開發(fā)實(shí)例類屬性與表列名不一致??

3.2.1 IUserDao中給方法添加注解??

3.2.2 在測試類中測試??

3.3 mybatis注解開發(fā)一對一/多查詢??

3.3.1 IUserDao中給方法添加注解??

List<User> users = userDao.findByVo(queryVo);??

//遍歷打印??

for (User u : users) {??

System.out.println(u);??

}??

}??

@After??

public void destroy() throws IOException {??

session.close();??

is.close();??

}??

/**??

* 使用別名,查詢所有用戶信息;??

* @return 所有用戶信息??

*/??

@Select("select * from user")??

//id="uMap"表示結(jié)果集映射的id,將來可以給其他@ResultMap復(fù)用??

@Results(id="uMap",value = {??

//id=true表示是主鍵,默認(rèn)值是false??

@Result(id=true,column = "id",property = "userId"),??

@Result(id=false,column = "username",property = "userName"),??

@Result(column = "birthday",property = "userBirthday"),??

@Result(column = "sex",property = "userSex"),??

@Result(column = "address",property = "userAddress")??

}??

)??

List<U> findAllU();??

@Test??

public void findAllU(){??

List<U> us = userDao.findAllU();??

//遍歷打印??

for (U u : us) {??

System.out.println(u);??

}??

}??

/**3.3.2 IAccountDao中創(chuàng)建fifindAccountById方法并添加注解??

3.3.3 在測試類中測試??

* 立即查詢:查詢賬戶信息的同時(shí)查詢其用戶信息??

* @return??

*/??

@Select("select * from account")??

@Results(id="accountMap",value ={??

@Result(id = true,column = "id",property = "id"),??

@Result(column = "uid",property = "uid"),??

@Result(column = "money",property = "money"),??

@Result(column = "uid",property = "user",one = @One(??

select="com.itheima.dao.IUserDao.findById",??

fetchType = FetchType.EAGER//立即查詢??

)),??

})??

List<Account> findAllAccountAndUser();??

/**??

* 延時(shí)查詢:查詢用戶信息的同時(shí)查詢其所有賬戶信息??

*/??

@Select("select * from user")??

@Results(id="userMap",value = {??

@Result(id=true,column = "id",property = "id"),??

@Result(column = "username",property = "username"),??

@Result(column = "birthday",property = "birthday"),??

@Result(column = "sex",property = "sex"),??

@Result(column = "address",property = "address"),??

@Result(column = "id",property = "accounts",many = @Many(??

select="com.itheima.dao.IAccountDao.findAccountById",??

fetchType = FetchType.LAZY//延時(shí)查詢??

)),??

})??

List<User> findAllUserAndAccount();??

public interface IAccountDao {??

/**??

* 根據(jù)uid查詢對應(yīng)的所有賬戶信息??

* @param uid??

* @return??

*/??

@Select("select * from account where uid=#{uid}")??

List<Account> findAccountById(int uid);??

}??

//立即查詢:查詢賬戶信息的同時(shí)查詢其用戶信息??

@Test??

public void findAllAccountAndUser(){??

List<Account> accounts = userDao.findAllAccountAndUser();??

//變量打印3.4 mybatis注解開發(fā)使用二級緩存??

3.4.1 在被測試的dao類上添加注解開啟二級緩存即可??

注意:SqlMapConfifig.xml中的中的??

cacheEnabled默認(rèn)值就是true,可以不用配置。??

3.4.2 代碼測試??

mybatis擴(kuò)展內(nèi)容??

for (Account account : accounts) {??

System.out.println(account.getId()+"-"+account.getUid()+"-"+account.getMoney());??

System.out.println(account.getUser());??

}??

}??

//延時(shí)查詢:查詢用戶信息的同時(shí)查詢其所有賬戶信息??

@Test??

public void findAllUserAndAccount(){??

List<User> users = userDao.findAllUserAndAccount();??

for (User u : users) {??

System.out.println(u.getId()+"-"+u.getUsername()+"-"+u.getBirthday()+"-"+u.getSex()+"-??

"+u.getAddress());??

// System.out.println(u.getAccounts());??

}??

}??

//該接口查詢開啟二級緩存??

@CacheNamespace(blocking = true)??

public interface IUserDao {}??

//測試二級緩存??

@Test??

public void testSecondLeverCache(){??

//1.獲取第一個(gè)sqlSession對象并查詢user??

SqlSession session1 = factory.openSession(true);??

IUserDao userDao1 = session1.getMapper(IUserDao.class);??

User user1 = userDao1.findById(43);??

System.out.println("user1 = " + user1);??

//關(guān)閉session1??

session1.close();??

//2.獲取第二個(gè)sqlSession對象并查詢user??

SqlSession session2 = factory.openSession(true);??

IUserDao userDao2 = session2.getMapper(IUserDao.class);??

User user2 = userDao2.findById(43);??

System.out.println("user2 = " + user2);??

session2.close();??

//判斷user1和user2是不是同一個(gè)對象??

System.out.println("user1==user2 : " + (user1==user2));??

}1.mybatis使用第三方連接池??

1.1 mybatis中連接池原理??

1.2 使用第三方連接池步驟??

1.2.1 自定義工廠類實(shí)現(xiàn)mybatis的DataSourceFactory接口??

MyBatis 在初始化時(shí),根據(jù)<dataSource>的 type 屬性來創(chuàng)建相應(yīng)類型的的數(shù)據(jù)源 DataSource,即:??

type="POOLED": MyBatis 會創(chuàng)建 PooledDataSource 實(shí)例??

type="UNPOOLED": MyBatis 會創(chuàng)建 UnpooledDataSource 實(shí)例??

type="JNDI": MyBatis 會從 JNDI 服務(wù)上查找 DataSource 實(shí)例,然后返回使用??

當(dāng)我們在<dataSource type="POOLED">配置POOLED時(shí)mybatis就會為我們創(chuàng)建PooledDataSource對象,這個(gè)對象是??

通過連接池工程創(chuàng)建出來的:??

public class PooledDataSourceFactory extends UnpooledDataSourceFactory {??

public PooledDataSourceFactory() {??

this.dataSource = new PooledDataSource();??

}??

}??

public class UnpooledDataSourceFactory implements DataSourceFactory {??

//代碼省略??

}??

public interface DataSourceFactory {??

void setProperties(Properties props);??

DataSource getDataSource();??

}??

mybatis創(chuàng)建PooledDataSourceFactory工廠對象的同時(shí)會創(chuàng)建一個(gè)PooledDataSource連接池對象,然后調(diào)用工??

廠對象的setProperties(Properties props)方法將SqlMapConfig.xml中的連接池配置信息通過props傳遞進(jìn)來,當(dāng)??

進(jìn)行CRUD操作時(shí)就調(diào)用getDataSource()方法獲取連接池對象。??

也就是說要想讓mybatis使用第三方連接池,我們就得自己定義一個(gè)工廠類,在工廠來中創(chuàng)建第三方連接池對象并??

在setProperties(Properties props)方法中設(shè)置連接參數(shù),在getDataSource()方法中返回連接池對象??

package com.itheima.factory;??

import com.alibaba.druid.pool.DruidDataSource;??

import org.apache.ibatis.datasource.DataSourceFactory;??

import javax.sql.DataSource;??

import java.util.Properties;??

//DruidDataSourceFactory不是alibaba的DruidDataSourceFactory??

public class DruidDataSourceFactory implements DataSourceFactory {??

//聲明連接池對象??

private DruidDataSource dataSource;??

public DruidDataSourceFactory() {??

//創(chuàng)建連接池對象??

this.dataSource = new DruidDataSource();??

}??

@Override??

public void setProperties(Properties props) {??

//將SqlMapConfig.xml中的連接池配置信息設(shè)置給druid連接池對象??

dataSource.setDriverClassName(props.getProperty("driver"));1.2.2 在SqlMapConfifig.xml中使用第三方連接池??

1.2.3 在測試類中進(jìn)行測試??

dataSource.setUrl(props.getProperty("url"));??

dataSource.setUsername(props.getProperty("username"));??

dataSource.setPassword(props.getProperty("password"));??

}??

@Override??

public DataSource getDataSource() {??

return dataSource;??

}??

}??

PUBLIC "-//mybatis.org//DTD Config 3.0//EN"??

"http://mybatis.org/dtd/mybatis-3-config.dtd">??

??

resource="jdbcConfig.properties"/>??

??

name="com.itheima.domain"/>??

default="mysql">??

id="mysql">??

type="jdbc">??

type="com.itheima.factory.DruidDataSourceFactory">??

name="driver" value="${jdbc.driver}"/>??

name="url" value="${jdbc.url}"/>??

name="username" value="${jdbc.username}"/>??

name="password" value="${jdbc.password}"/>??

??

name="com.itheima.dao"/>??

2.mybatis查詢傳遞其他類型參數(shù)??

2.1 參數(shù)是Map集合??

在IUserDao.xml中配置查詢信息??

在測試類中測試??

//查詢所有操作??

@Test??

public void findAll(){??

//獲取連接池對象的名稱??

DataSource dataSource = session.getConfiguration().getEnvironment().getDataSource();??

System.out.println("dataSource = " + dataSource.getClass());//dataSource = class??

com.alibaba.druid.pool.DruidDataSource??

//查詢所有用戶信息??

List<User> users = userDao.findAll();??

for (User user : users) {??

System.out.println(user);??

}??

}??

id="findUserByMap" resultType="user"> select * from USER test="username!=null and username!=''"> and username like #{username} test="sex!=null and username!=''"> and sex = #{sex}??

//動態(tài)sql:根據(jù)map集合中的條件,查詢用戶信息??

@Test??

public void testFindUserByMap(){??

//創(chuàng)建Map集合并封裝查詢參數(shù)??

Map<String,Object> map=new HashMap<String,Object>();??

map.put("username","%王%");??

map.put("sex","女");??

//查詢符合條件的用戶信息??

List<User> users = userDao.findUserByMap(map);??

for (User user : users) {??

System.out.println(user);??

}??

}結(jié)論:使用map集合或者javabean對象作為參數(shù),其實(shí)是一樣的,map集合對應(yīng)的就是javabean的屬性。??

2.2 參數(shù)是List集合??

在IUserDao.xml中配置查詢信息??

在測試類中測試??

結(jié)論:mybatis其實(shí)是將參數(shù)list集合先存到map中,key為list(即map.pust("list",list集合對象)),所以??

collection="list"中的屬性值必須是list,就相當(dāng)于從map中取出list遍歷??

2.3 參數(shù)是數(shù)組- 和參數(shù)是list幾乎一樣??

在IUserDao.xml中配置查詢信息??

id="findUserByList" resultType="user"> SELECT * FROM USER and id in( collection="list" item="id" separator=","> #{id} )??

//動態(tài)sql:查詢list集合中指定id的user信息??

@Test??

public void testFindUserByList(){??

//創(chuàng)建list集合并存儲要查的用戶id??

List<Integer> ids=new ArrayList<Integer>();??

ids.add(41);??

ids.add(43);??

ids.add(48);??

ids.add(50);??

//查詢符合條件的用戶信息??

List<User> users = userDao.findUserByList(ids);??

for (User user : users) {??

System.out.println(user);??

}??

}在測試類中測試??

結(jié)論:查詢參數(shù)是Array與查詢參數(shù)是list集合的原理是一樣的,都是現(xiàn)將對象存到map集合中,只不過參數(shù)??

為Array時(shí),存到map集合中的key叫array,所以collection="array"的值必須是array??

2.4 多個(gè)參數(shù)情況以及@Param注解??

在IUserDao中定義查詢方法??

在IUserDao.xml中配置查詢信息??

id="findUserByArray" resultType="user"> SELECT * FROM USER and id in( collection="array" item="id" separator=","> #{id} )??

//動態(tài)sql:查詢數(shù)組中指定id的user信息??

@Test??

public void testFindUserByArray(){??

//創(chuàng)建list集合并存儲要查的用戶id??

Integer[] ids={41,43,48,50};??

//查詢符合條件的用戶信息??

List<User> users = userDao.findUserByArray(ids);??

for (User user : users) {??

System.out.println(user);??

}??

}??

/**??

* 多個(gè)參數(shù):根據(jù)用戶名和性別查詢用戶信息??

* @Param("username") :定義參數(shù)的別名,將來在映射文件中使用??

*/??

public List<User> findUserByUsernameAndSex(@Param("username") String username,@Param("sex")??

String sex);??

}??

id="findUserByUsernameAndSex" resultType="user"> SELECT * FROM USER where username like #{username} and sex= #{sex} 在測試類中測試??

結(jié)論:最好是結(jié)果@Param注解一起使用,映射文件中#{username}使用的變量名就是 @Param("username")注解的參數(shù)值 3.mybatis注解開發(fā)-動態(tài)sql 3.1 方式1:在select注解中添加script腳本 在在IUserMapper方法上定義注解 測試類測試 /** * 多個(gè)參數(shù):根據(jù)用戶名和性別查詢用戶信息 */ @Test public void testFindUserByUsernameAndSex(){ List<User> users = userDao.findUserByUsernameAndSex("%王%", "女"); for (User user : users) { System.out.println(user); } } /** * 動態(tài)sql:查詢list集合中指定id的user信息 */ @Select({""}) public List<User> findUserByList(List<Integer> ids); //動態(tài)sql:查詢list集合中指定id的user信息 @Test public void testFindUserByList(){ //創(chuàng)建list集合并存儲要查的用戶id List<Integer> ids=new ArrayList<Integer>(); ids.add(41); ids.add(43); ids.add(48); ids.add(50);總結(jié):其實(shí)就是將xml映射文件中的配置拿過來用了,也是支持的。適用于帶in的查詢 3.1 方式2:字符串拼接(了解) 定義sql提供者UserMapperProvider類 在IUserMapper方法上定義注解 測試類測試 //查詢符合條件的用戶信息 List<User> users = userMapper.findUserByList(ids); for (User user : users) { System.out.println(user); } } /** * 為注解開發(fā)動態(tài)sql查詢提供sql */ public class UserMapperProvider { /** * 動態(tài)sql:根據(jù)map集合中的條件,查詢用戶信息 * @param map 查詢條件 * @return 根據(jù)條件返回sql */ public String findUserByMap(Map<String,Object> map){ StringBuilder sb=new StringBuilder("select * from user where 1=1 "); if(map.get("username")!=null){ sb.append(" and username like #{username}"); } if(map.get("sex")!=null){ sb.append(" and sex = #{sex}"); } return sb.toString(); } } public interface IUserMapper { /** * 動態(tài)sql:根據(jù)map集合中的條件,查詢用戶信息 */ @SelectProvider(type=UserMapperProvider.class,method = "findUserByMap") public List<User> findUserByMap(Map<String,Object> map); }3.2 方式3:使用mybatis中提供的SQL對象動態(tài)構(gòu)建sql語句 修改UserMapperProvider提供者中的fifindUserByMap方法 4.mybatis使用Redis做二級緩存 總結(jié) 使用xml配置完成CURD操作 環(huán)境 jar包坐標(biāo) //動態(tài)sql:根據(jù)map集合中的條件,查詢用戶信息 @Test public void testFindUserByMap(){ //創(chuàng)建Map集合并封裝查詢參數(shù) Map<String,Object> map=new HashMap<String,Object>(); map.put("username","%王%"); map.put("sex","女"); //查詢符合條件的用戶信息 List<User> users = userMapper.findUserByMap(map); for (User user : users) { System.out.println(user); } } public String findUserByMap(Map<String,Object> map){ return new SQL(){ //靜態(tài)代碼塊 { SELECT("*"); FROM("user"); if (map.get("username")!=null) { WHERE("username like #{username}"); } if (map.get("sex")!=null) { AND(); WHERE("sex = #{sex}"); } } }.toString(); } 配置文件 單表查詢 org.mybatis mybatis 3.4.5 mysql mysql-connector-java 5.1.38 junit junit 4.10 log4j log4j 1.2.12 測試多表查詢 一對多 多表查詢 多對多 使用annotation完成CURD操作 環(huán)境 與xml相同 單表查詢多表查詢 一對多

總結(jié)

以上是生活随笔為你收集整理的[转载] mybatis的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本男女啪啪 | 午夜精品久久久久久久久久久久 | 少妇毛片 | 天天躁夜夜躁狠狠躁 | 精品不卡一区二区三区 | 91直接进入 | 亚洲综合另类小说 | 亚洲一区二区高清 | 欧美爽爽爽 | 啪啪中文字幕 | 久久一区二区三区精品 | 欧美丝袜视频 | 日韩久久一区二区 | 亚洲经典一区二区 | 无码日韩精品视频 | 欧美a v在线播放 | 欧美日本综合 | 成人免费在线网站 | 蜜桃av中文字幕 | 日日夜夜天天 | 免费激情视频网站 | 小柔的淫辱日记(1~7) | 亚洲日本一区二区 | 深夜影院深a | www欧美| 国产精品白嫩极品美女 | 亚洲加勒比在线 | 久久久久久久久久久久久久久久久 | 粉嫩aⅴ一区二区三区四区五区 | 亚洲一区二区影视 | 中文字幕一区二区三三 | 麻豆精品在线播放 | 亚洲国产成人一区二区精品区 | 日本成片网 | 日本一区二区三区成人 | 欧洲熟妇精品视频 | 一级全黄色片 | 美女露出让男生揉的视频 | 午夜视频福利在线 | 黄色大片a级 | 91夫妻论坛| 欧美亚洲国产成人 | 日韩一区电影 | 欧美bbbbb性bbbbb视频 | 日韩欧美一区视频 | 五月婷影院 | 国产精品每日更新 | 91在线免费观看网站 | 精久久久久久久 | 国产女人18毛片水18精品 | 色哟哟在线观看视频 | 国产人妻aⅴ色偷 | 欧美成人毛片 | a国产 | 图片区 小说区 区 亚洲五月 | 天天插天天搞 | av网址免费观看 | 久久精品www| 亚洲欧美一区二区三 | 女人张开双腿让男人捅 | 国产主播喷水 | 国产又色又爽又高潮免费 | 欧美一级黄色片 | 亚洲午夜在线播放 | 久操这里只有精品 | 男人添女人囗交视频 | 黄色精品一区二区 | 黄色av网站免费 | 日本wwwxxx| 暴操白虎 | 波多野结衣高清电影 | 三级欧美视频 | 日本少妇bb | 天天夜碰日日摸日日澡性色av | 三级网站在线 | 国产美女在线精品 | 成人免费黄色av | 久久综合亚洲 | eeuss鲁丝片一区二区三区 | 桥本有菜aⅴ一区二区三区 在线午夜电影 | 精品成人 | 在线天堂www在线国语对白 | 亚洲高清视频一区 | 日韩高清在线观看 | 他揉捏她两乳不停呻吟动态图 | 欧美一区二区三区久久成人精品 | 亚洲自拍偷拍综合 | 在线观看你懂的视频 | 不卡的av片| 日韩av中文在线 | 精品无码人妻一区二区三 | 久久精品久久精品久久精品 | 国产精品偷伦视频免费观看了 | 亚欧成人精品一区二区 | 欧美碰碰碰 | 电影寂寞少女免费观看 | 日韩一区在线观看视频 | 手机在线成人av | 欧美人体视频一区二区三区 |