MyBatis学习总结一
Mybatis學(xué)習(xí)總結(jié)一
- 1、Mybatis介紹
- 2、Mybatis架構(gòu)圖
- 2.1、架構(gòu)圖的意義
- 2.1.1、JDBC編寫(xiě)
- 2.1.2、反思問(wèn)題
- 2.2、Mybatis架構(gòu)圖
- 3、入門(mén)案例
- 3.1、下載地址以及導(dǎo)入jar包
- 3.2、工程目錄
- 3.3、創(chuàng)建PO類(lèi)
- 3.4、創(chuàng)建全局配置文件
- 3.5、創(chuàng)建映射文件
- 3.6、在全局配置文件中加載映射文件
- 3.7、測(cè)試
- 3.8、實(shí)驗(yàn)結(jié)果
- 4、Mybatis開(kāi)發(fā)的兩種方式
- 4.0、映射文件User.xml詳解
- 4.0.1、mapper元素
- 4.0.2、CRUD元素
- 4.0.3、CRUD元素常用屬性
- 4.0.4、#{id}與${id}的區(qū)別
- 4.1、dao類(lèi)實(shí)現(xiàn)CRUD
- 4.1.0、工程目錄
- 4.1.1、UserDao
- 4.1.2、UserDaoImp
- 4.1.3、User.xml
- 4.1.3、測(cè)試Dao的CRUD
- 4.1.4、測(cè)試結(jié)果
- 4.1.5、log4j.properties導(dǎo)入及其測(cè)試結(jié)果
- 4.1.5.1、創(chuàng)建log4j.properties
- 4.1.5.1、編寫(xiě)log4j.properties
- 4.1.5.1、測(cè)試
- 4.1.4、編寫(xiě)Dao類(lèi)的問(wèn)題
- 4.2、使用動(dòng)態(tài)代理mapper實(shí)現(xiàn)CRUD
- 4.2.0、Mapper代理的開(kāi)發(fā)規(guī)范
- 4.2.1、開(kāi)發(fā)目錄
- 4.2.2、創(chuàng)建UserDao
- 4.2.3、配置mapper映射文件
- 4.2.4、測(cè)試
- 4.2.5、測(cè)試結(jié)果
- 5、全局配置文件詳解
- 5.1、properties元素
- 5.2、settings
- 5.3、typeAliases
- 5.3.1、Mybatis支持的別名
- 5.3.2、自定義別名
- 5.4、mappers
- 6、輸入映射與輸出映射
- 6.1、輸入映射與簡(jiǎn)單類(lèi)型輸出映射
- 6.1.1、簡(jiǎn)單類(lèi)型輸入
- 映射文件
- UserDao接口
- 測(cè)試方法
- 實(shí)驗(yàn)結(jié)果
- 6.1.2、POJO類(lèi)型輸入
- 映射文件
- UserDao接口
- 測(cè)試方法
- 實(shí)驗(yàn)結(jié)果
- 6.1.3、POJO類(lèi)型嵌套POPJ類(lèi)型的輸入映射
- User
- UserVo
- 映射文件
- UserDao接口
- 測(cè)試方法
- 實(shí)驗(yàn)結(jié)果
- 6.1.4、Map類(lèi)型的輸入映射
- 映射文件
- UserDao接口
- 測(cè)試
- 測(cè)試結(jié)果
- 6.2、簡(jiǎn)單類(lèi)型輸入映射與輸出映射
- 6.2.1、resultMap屬性
- 映射文件
- UserDao接口
- 測(cè)試
- 測(cè)試結(jié)果
- 復(fù)雜輸入類(lèi)型與復(fù)雜輸出類(lèi)型的一個(gè)例子
- UserVo類(lèi)
- UserDao接口
- 映射文件
- 測(cè)試
- 測(cè)試結(jié)果
- 7、動(dòng)態(tài)sql
- 7.1、動(dòng)態(tài)sql介紹
- 7.2、If標(biāo)簽/where標(biāo)簽
- 映射文件
- UserDao接口
- 測(cè)試
- 測(cè)試結(jié)果
- 7.3、sql片段
- 映射文件
- 7.4、sql片段
- 參考
1、Mybatis介紹
Mybatis是一個(gè)類(lèi)似于Hibernate的ORM持久化框架,支持普通SQL查詢(xún),存儲(chǔ)過(guò)程以及高級(jí)映射。Mybatis通過(guò)使用簡(jiǎn)單的XML或注解用于配置和原始映射,將接口和POJO對(duì)象映射成數(shù)據(jù)庫(kù)中的記錄。
Hibernate是一個(gè)完全的ORM框架,而Mybatis是一個(gè)不完全的orm框架。Mybatis讓程序員只關(guān)注sql本身,而不需要去關(guān)注如連接的創(chuàng)建、statement的創(chuàng)建等操作。Mybatis會(huì)將輸入?yún)?shù)、輸出結(jié)果進(jìn)行映射。
由于Mybatis是直接基于JDBC做了簡(jiǎn)單的映射包裝,所有從性能角度來(lái)看:JDBC > Mybatis > Hibernate。
2、Mybatis架構(gòu)圖
下圖來(lái)自于這里!
2.1、架構(gòu)圖的意義
2.1.1、JDBC編寫(xiě)
package com.csa.jdbc;import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import org.junit.jupiter.api.Test;public class App {@Testpublic void app() throws Exception {// 加載驅(qū)動(dòng)Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://127.0.0.1:3306/mybatis";String user = "root";String password = "3306";Connection connection = null;PreparedStatement statement = null;ResultSet resultSet = null;try {// 創(chuàng)建數(shù)據(jù)庫(kù)連接connection = DriverManager.getConnection(url, user, password);// 創(chuàng)建Statement對(duì)象String sql = "SELECT * FROM user WHERE username = ?";statement = connection.prepareStatement(sql);// 設(shè)置參數(shù),下標(biāo)從1開(kāi)始statement.setString(1, "rose");// 執(zhí)行sql,變量結(jié)果集resultSet = statement.executeQuery();while (resultSet.next()) {System.out.println("id: " + resultSet.getInt("id"));System.out.println("name: " + resultSet.getString("username"));System.out.println("age: " + resultSet.getString("age"));}} finally {// 釋放資源if (null != resultSet) {resultSet.close();}if (null != statement) {statement.close();}if (null != connection) {connection.close();}}} }2.1.2、反思問(wèn)題
JDBC這種固定的東西,完全可以用框架加以實(shí)現(xiàn)。因?yàn)榫帉?xiě)的內(nèi)容都是一樣的!
差不多有以下幾個(gè)問(wèn)題:
解決方案:配置xml文件來(lái)解決這些問(wèn)題,使得管理起來(lái)方便、高效!
2.2、Mybatis架構(gòu)圖
下圖來(lái)自于這里!
3、入門(mén)案例
3.1、下載地址以及導(dǎo)入jar包
Mybatis下載地址
別忘記連接數(shù)據(jù)庫(kù)的jar!
3.2、工程目錄
3.3、創(chuàng)建PO類(lèi)
package com.csa.po;public class User {private Integer id;private String username;private Integer age;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 Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "User [id=" + id + ", username=" + username + ", age=" + age + "]";} }3.4、創(chuàng)建全局配置文件
編寫(xiě)SqlMapConfig.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 resource="jdbc.properties"></properties><!-- 環(huán)境 --><environments default="development"><environment id="development"><transactionManager type="JDBC" /><dataSource type="POOLED"><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><!-- 加載UserMapper.xml文件 <mappers><mapper resource="User.xml"/></mappers>--> </configuration>3.5、創(chuàng)建映射文件
編寫(xiě)User.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="app"><select id="findUserById" parameterType="int" resultType="com.csa.po.User">select * from User where id = #{id}</select> </mapper>3.6、在全局配置文件中加載映射文件
重新編寫(xiě)SqlMapConfig.xml(在最后添加一個(gè)mappers):
<configuration>.........<environments ...>...</environments><!-- 加載UserMapper.xml文件 --><mappers><mapper resource="User.xml"/></mappers> </configuration>3.7、測(cè)試
package com.csa.app;import java.io.InputStream;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 com.csa.po.User;public class App {public static void main(String[] args) throws Exception {// 讀取全局配置文件String resource = "SqlMapConfig.xml";InputStream input = Resources.getResourceAsStream(resource);// 創(chuàng)建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);// 創(chuàng)建SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 調(diào)用SqlSession的增刪改查的方法User user = sqlSession.selectOne("app.findUserById",1);// 打印userSystem.out.println(user);// 關(guān)閉資源sqlSession.close();} }3.8、實(shí)驗(yàn)結(jié)果
4、Mybatis開(kāi)發(fā)的兩種方式
4.0、映射文件User.xml詳解
4.0.1、mapper元素
<mapper namespace="app">...</mapper>其中namespace是命名空間。
4.0.2、CRUD元素
分別是select、insert、update、delete元素。
例如:
<select id="findUserById" parameterType="int" resultType="com.csa.po.User">select *from User where id = #{id} </select>4.0.3、CRUD元素常用屬性
CRUD元素的幾個(gè)常用屬性:
4.0.4、#{id}與${id}的區(qū)別
#{id}是占位符,安全。
${id}是用于字符串連接的,不安全,會(huì)被sql注入。
4.1、dao類(lèi)實(shí)現(xiàn)CRUD
4.1.0、工程目錄
4.1.1、UserDao
package com.csa.dao;import java.util.List; import com.csa.po.User;public interface UserDao {/*** 添加用戶(hù) * @return 是否添加成功*/public boolean addUser(User user);/*** 刪除指定id的用戶(hù)* @param id */public boolean deleteUserById(Integer id);/*** 更新用戶(hù)信息* @param user*/public boolean updateUser(User user);/*** 通過(guò)id查找用戶(hù)* @param id* @return*/public User findUserById(Integer id);/*** 查找所有用戶(hù)* @return*/public List<User> selectUserList(); }4.1.2、UserDaoImp
package com.csa.dao.imp;import java.util.List;import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory;import com.csa.dao.UserDao; import com.csa.po.User;public class UserDaoImp implements UserDao {// DI依賴(lài)注入private SqlSessionFactory sqlSessionFactory;public UserDaoImp(SqlSessionFactory sqlSessionFactory) {this.sqlSessionFactory = sqlSessionFactory;}@Overridepublic boolean addUser(User user) {// 創(chuàng)建SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 調(diào)用SqlSession的增刪改查的方法int insert = sqlSession.insert("app.addUser", user);// 提交事務(wù)sqlSession.commit();// 關(guān)閉資源sqlSession.close();return insert != 0;}@Overridepublic boolean deleteUserById(Integer id) {// 創(chuàng)建SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 調(diào)用SqlSession的增刪改查的方法int delete = sqlSession.delete("app.deleteUserById", id);// 提交事務(wù)sqlSession.commit();// 關(guān)閉資源sqlSession.close();return delete != 0;}@Overridepublic boolean updateUser(User user) {// 創(chuàng)建SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 調(diào)用SqlSession的增刪改查的方法int update = sqlSession.update("app.updateUser", user);// 提交事務(wù)sqlSession.commit();// 關(guān)閉資源sqlSession.close();return update != 0;}@Overridepublic User findUserById(Integer id) {// 創(chuàng)建SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 調(diào)用SqlSession的增刪改查的方法User user = sqlSession.selectOne("app.findUserById", id);// 關(guān)閉資源sqlSession.close();return user;}@Overridepublic List<User> selectUserList() {// 創(chuàng)建SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 調(diào)用SqlSession的增刪改查的方法List<User> userList = sqlSession.selectList("app.selectUserList");// 關(guān)閉資源sqlSession.close();return userList;} }4.1.3、User.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="app"><!-- 增加 --><insert id="addUser" parameterType="com.csa.po.User"><!-- 對(duì)于這個(gè)例子keyProperty:查找的結(jié)果放在id中order:在執(zhí)行insert語(yǔ)句''之后(AFTER)"再執(zhí)行select last_insert_id()--><selectKey keyProperty="id" resultType="int" order="AFTER">select last_insert_id()</selectKey>insert into User(username,age) values(#{username},#{age})</insert><!-- 刪除 --><delete id="deleteUserById" parameterType="int">delete from User where id=#{id}</delete><!-- 改 --><update id="updateUser" parameterType="com.csa.po.User">update User set username=#{username},age=#{age} where id like #{id}</update><!-- 查詢(xún)一個(gè)對(duì)象 --><select id="findUserById" parameterType="int" resultType="com.csa.po.User">select * from User where id = #{id}</select><!-- 查詢(xún)多個(gè)對(duì)象 --><select id="selectUserList" resultType="com.csa.po.User">select * from User</select> </mapper>4.1.3、測(cè)試Dao的CRUD
package com.csa.app;import java.io.InputStream; import java.util.List; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import com.csa.dao.UserDao; import com.csa.dao.imp.UserDaoImp; import com.csa.po.User;public class App {public static void main(String[] args) throws Exception {// 讀取全局配置文件String resource = "SqlMapConfig.xml";InputStream input = Resources.getResourceAsStream(resource);// 創(chuàng)建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);// 創(chuàng)建dao類(lèi)UserDao userDao = new UserDaoImp(sqlSessionFactory);// 調(diào)用增刪改查方法// 1.增User user = new User();user.setUsername("hack");user.setAge(19);boolean insert = userDao.addUser(user);if(insert) {System.out.println("增加"+user+"成功");}else {System.out.println("增加失敗:"+user);}// 2.改user.setUsername("mybatis");user.setAge(0);boolean update = userDao.updateUser(user);if(update) {System.out.println("更新"+user+"成功");}else {System.out.println("更新失敗:"+user);}// 3.刪boolean delete = userDao.deleteUserById(user.getId());if(delete) {System.out.println("刪除"+user+"成功");}else {System.out.println("刪除失敗:"+user);}// 4.查// 4.1查詢(xún)單個(gè)user = userDao.findUserById(user.getId());if(user!=null) {System.out.println("查詢(xún)"+user+"成功");}else {System.out.println("查詢(xún)失敗:"+user);}// 4.2查詢(xún)所有List list = userDao.selectUserList();System.out.println(list);} }4.1.4、測(cè)試結(jié)果
如果發(fā)現(xiàn)WARN這種結(jié)果,是因?yàn)闆](méi)有l(wèi)og4j.properties文件。
4.1.5、log4j.properties導(dǎo)入及其測(cè)試結(jié)果
4.1.5.1、創(chuàng)建log4j.properties
4.1.5.1、編寫(xiě)log4j.properties
log4j.rootLogger=DEBUG, Console log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n log4j.logger.org.apache=INFO4.1.5.1、測(cè)試
4.1.4、編寫(xiě)Dao類(lèi)的問(wèn)題
我們發(fā)現(xiàn)一個(gè)問(wèn)題:編寫(xiě)了很多重復(fù)性的代碼,而且都是固定(模板)形式!
解決方案:使用動(dòng)態(tài)代理(Mapper)來(lái)解決!
4.2、使用動(dòng)態(tài)代理mapper實(shí)現(xiàn)CRUD
4.2.0、Mapper代理的開(kāi)發(fā)規(guī)范
4.2.1、開(kāi)發(fā)目錄
與上一個(gè)相比,只是少了實(shí)現(xiàn)類(lèi)。
4.2.2、創(chuàng)建UserDao
與上面一樣。
4.2.3、配置mapper映射文件
不同的地方就只有一處:注意看namespace屬性的不同。
<mapper namespace="com.csa.dao.UserDao">內(nèi)容與上面的一樣</mapper>4.2.4、測(cè)試
不同之處也只在于這兩行:
// 創(chuàng)建sqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 創(chuàng)建dao類(lèi) UserDao userDao = sqlSession.getMapper(UserDao.class);下面是一個(gè)完整的:
package com.csa.app;import java.io.InputStream; import java.util.List; 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 com.csa.dao.UserDao; import com.csa.po.User;public class App {public static void main(String[] args) throws Exception {// 讀取全局配置文件String resource = "SqlMapConfig.xml";InputStream input = Resources.getResourceAsStream(resource);// 創(chuàng)建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);// 創(chuàng)建sqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 創(chuàng)建dao類(lèi)UserDao userDao = sqlSession.getMapper(UserDao.class);// 調(diào)用增刪改查方法// 1.增User user = new User();user.setUsername("hack");user.setAge(19);boolean insert = userDao.addUser(user);if(insert) {System.out.println("增加"+user+"成功");}else {System.out.println("增加失敗:"+user);}// 2.改...// 3.刪...// 4.查// 4.1查詢(xún)單個(gè)...// 4.2查詢(xún)所有...} }4.2.5、測(cè)試結(jié)果
5、全局配置文件詳解
5.1、properties元素
用于加載配置文件。比如<properties resource="配置文件的路徑"></properties>。使用時(shí)${屬性名}即可。
5.2、settings
5.3、typeAliases
5.3.1、Mybatis支持的別名
| _byte | byte |
| _long | long |
| _short | short |
| _int | int |
| _integer | int |
| _double | double |
| _float | float |
| _boolean | boolean |
| string | String |
| byte | Byte |
| long | Long |
| short | Short |
| int | Integer |
| integer | Integer |
| double | Double |
| float | Float |
| boolean | Boolean |
| date | Date |
| decimal | BigDecimal |
| bigdecimal | BigDecimal |
5.3.2、自定義別名
<typeAliases><!--定義單個(gè)別名 --><typeAlias type="com.csa.po.User" alias="user"/><!-- 批量定義別名規(guī)則:類(lèi)首字母小寫(xiě)--><package name="com.csa.po"/> </typeAliases>5.4、mappers
以下4種形式,加載映射文件:
<!-- 加載UserMapper.xml文件 --> <mappers><!-- 相對(duì)路徑 --><mapper resource="User.xml"/><!-- 完全限定路徑 --><mapper url="file:///D:\Mybatis\MybatisPro2\src\User.xml"/><!-- 接口路徑 --><mapper class="com.csa.dao.UserDao"/><!-- 包路徑(常用) --><package name="com.csa.dao"/> </mappers>6、輸入映射與輸出映射
6.1、輸入映射與簡(jiǎn)單類(lèi)型輸出映射
6.1.1、簡(jiǎn)單類(lèi)型輸入
映射文件
<!-- 查詢(xún)對(duì)應(yīng)ID的用戶(hù)名 --> <select id="findUsernameById" parameterType="int" resultType="string">select username from User where id = #{id} </select>UserDao接口
/*** 通過(guò)id查找用戶(hù)名* @param id* @return 用戶(hù)名*/ public String findUsernameById(Integer id);測(cè)試方法
public static void main(String[] args) throws Exception {// 讀取全局配置文件String resource = "SqlMapConfig.xml";InputStream input = Resources.getResourceAsStream(resource);// 創(chuàng)建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);// 創(chuàng)建sqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 創(chuàng)建dao類(lèi)UserDao userDao = sqlSession.getMapper(UserDao.class);// 執(zhí)行簡(jiǎn)單類(lèi)型的查找userDao.findUsernameById(16);System.out.println(username);// 關(guān)閉sqlSessionsqlSession.close(); }實(shí)驗(yàn)結(jié)果
6.1.2、POJO類(lèi)型輸入
映射文件
<!-- 查詢(xún)符合年齡和出生月份的用戶(hù) --> <select id="selectUsernamesByBrithday" parameterType="com.csa.po.User" resultType="string">select username from User where age=${age} and brithdayMonth=${brithdayMonth} </select>UserDao接口
/*** 查找與User的同年同月生的用戶(hù)的用戶(hù)名* @param user* @return*/ public List<String> selectUsernamesByBrithday(User user);測(cè)試方法
public static void main(String[] args) throws Exception {// 讀取全局配置文件String resource = "SqlMapConfig.xml";InputStream input = Resources.getResourceAsStream(resource);// 創(chuàng)建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);// 創(chuàng)建sqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 創(chuàng)建dao類(lèi)UserDao userDao = sqlSession.getMapper(UserDao.class);User user = userDao.findUserById(15);System.out.println(user);List<String> usernames = userDao.selectUsernamesByBrithday(user);System.out.println(usernames);// 關(guān)閉sqlSessionsqlSession.close(); }實(shí)驗(yàn)結(jié)果
6.1.3、POJO類(lèi)型嵌套POPJ類(lèi)型的輸入映射
User
package com.csa.po;public class User {private Integer id;private String username;private Integer age;private Integer brithdayMonth;// set/get...@Overridepublic String toString() {return "User [id=" + id + ", username=" + username + ", age=" + age + ", brithdayMonth=" + brithdayMonth + "]";} }UserVo
package com.csa.po;public class UserVo {private User user;// set/get...@Overridepublic String toString() {return "UserVo [user=" + user + "]";} }映射文件
<!-- POJO類(lèi)型嵌套POPJ類(lèi)型的輸入映射,查詢(xún)符合年齡和出生月份的用戶(hù) --><select id="selectUserVonamesByBrithday" parameterType="com.csa.po.UserVo" resultType="string">select username from User where age=${user.age} and brithdayMonth=${user.brithdayMonth}</select>UserDao接口
/*** POJO類(lèi)型嵌套POPJ類(lèi)型的輸入映射* 查找與UserVo的同年同月生的用戶(hù)的用戶(hù)名* @param userVo* @return*/ public List<String> selectUserVonamesByBrithday(UserVo userVo);測(cè)試方法
public static void main(String[] args) throws Exception {// 讀取全局配置文件String resource = "SqlMapConfig.xml";InputStream input = Resources.getResourceAsStream(resource);// 創(chuàng)建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);// 創(chuàng)建sqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 創(chuàng)建dao類(lèi)UserDao userDao = sqlSession.getMapper(UserDao.class);User user = userDao.findUserById(15);UserVo userVo = new UserVo();userVo.setUser(user);System.out.println(userVo);List<String> usernames = userDao.selectUserVonamesByBrithday(userVo);System.out.println(usernames);// 關(guān)閉sqlSessionsqlSession.close(); }實(shí)驗(yàn)結(jié)果
6.1.4、Map類(lèi)型的輸入映射
映射文件
<!-- 查詢(xún)?cè)谀衬昴吃鲁錾挠脩?hù)的用戶(hù)名 --> <select id="findUsernamesByBrithday" parameterType="hashmap" resultType="string">select username from User where age=${age} and brithdayMonth=${brithdayMonth} </select>UserDao接口
/*** 通過(guò)hashmap查詢(xún)?cè)谀衬昴吃鲁錾挠脩?hù)的用戶(hù)名* @param map* @return*/ public List<String> findUsernamesByBrithday(Map<String,Object> map);測(cè)試
public static void main(String[] args) throws Exception {//讀取全局配置文件String resource = "SqlMapConfig.xml";InputStream input = Resources.getResourceAsStream(resource);// 創(chuàng)建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);// 創(chuàng)建sqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 創(chuàng)建dao類(lèi)UserDao userDao = sqlSession.getMapper(UserDao.class);Map<String,Object> map = new HashMap<>();map.put("age", 12);map.put("brithdayMonth", 10);List<String> usernames = userDao.findUsernamesByBrithday(map);System.out.println(usernames);// 關(guān)閉sqlSessionsqlSession.close(); }測(cè)試結(jié)果
6.2、簡(jiǎn)單類(lèi)型輸入映射與輸出映射
6.2.1、resultMap屬性
映射文件
<!-- 定義一個(gè)resultMap,id唯一標(biāo)識(shí) --> <resultMap type="com.csa.po.User" id="userMap"><result column="_id" property="id"/><result column="_username" property="username"/><result column="_age" property="age"/><result column="_brithdayMonth" property="brithdayMonth"/> </resultMap><!-- 使用resultMap,通過(guò)id查詢(xún)User --> <select id="selectUserMap" parameterType="int" resultMap="userMap">select id _id,username _username,age _age,brithdayMonth _brithdayMonth from User where id=#{id} </select>UserDao接口
/*** 通過(guò)id查詢(xún)User* @param id* @return*/ public User selectUserMap(Integer id);測(cè)試
public static void main(String[] args) throws Exception {// 讀取全局配置文件String resource = "SqlMapConfig.xml";InputStream input = Resources.getResourceAsStream(resource);// 創(chuàng)建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);// 創(chuàng)建sqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 創(chuàng)建daoUserDao userDao = sqlSession.getMapper(UserDao.class);User user = userDao.selectUserMap(15);System.out.println(user);// 關(guān)閉sqlSessionsqlSession.close(); }測(cè)試結(jié)果
復(fù)雜輸入類(lèi)型與復(fù)雜輸出類(lèi)型的一個(gè)例子
輸入類(lèi)型是map,輸出類(lèi)型是一個(gè)UserVo。
UserVo類(lèi)
package com.csa.po; public class UserVo {private User user;public User getUser() {return user;}public void setUser(User user) {this.user = user;}@Overridepublic String toString() {return "UserVo [user=" + user + "]";} }UserDao接口
/*** 通過(guò)map類(lèi)型查找UserVo* @param map* @return*/ public List<UserVo> selectUserVosMap(Map<String,Object> map);映射文件
<!-- 復(fù)雜輸入類(lèi)型與復(fù)雜輸出類(lèi)型的一個(gè)例子 --> <!-- resultmap --> <resultMap type="com.csa.po.UserVo" id="userVoMap"><result column="id" property="user.id"/><result column="username" property="user.username"/><result column="age" property="user.age"/><result column="brithdayMonth" property="user.brithdayMonth"/> </resultMap> <!-- 使用resultMap,查詢(xún)?cè)谀衬昴吃鲁錾腢ser并封裝到UserVo --> <select id="selectUserVosMap" parameterType="hashmap" resultMap="userVoMap">select * from User where age=#{age} and brithdayMonth=#{brithdayMonth} </select>測(cè)試
public static void main(String[] args) throws Exception {// 讀取全局配置文件String resource = "SqlMapConfig.xml";InputStream input = Resources.getResourceAsStream(resource);// 創(chuàng)建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);// 創(chuàng)建sqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 創(chuàng)建daoUserDao userDao = sqlSession.getMapper(UserDao.class);Map<String,Object> map = new HashMap<>();map.put("age", 12);map.put("brithdayMonth", 10);List<UserVo> userVo = userDao.selectUserVosMap(map);System.out.println(userVo);// 關(guān)閉sqlSessionsqlSession.close(); }測(cè)試結(jié)果
7、動(dòng)態(tài)sql
7.1、動(dòng)態(tài)sql介紹
在mybatis中,它提供了一些動(dòng)態(tài)sql標(biāo)簽,可以讓程序員更快的進(jìn)行mybatis的開(kāi)發(fā),這些動(dòng)態(tài)sql可以通過(guò)sql的可重用性。
常用的動(dòng)態(tài)sql標(biāo)簽:if標(biāo)簽、where標(biāo)簽、sql片段、foreach標(biāo)簽。
7.2、If標(biāo)簽/where標(biāo)簽
映射文件
<!-- 復(fù)雜輸入類(lèi)型與復(fù)雜輸出類(lèi)型的一個(gè)例子 --> <!-- resultmap --> <resultMap type="com.csa.po.UserVo" id="userVoMap"><result column="id" property="user.id"/><result column="username" property="user.username"/><result column="age" property="user.age"/><result column="brithdayMonth" property="user.brithdayMonth"/> </resultMap><!-- 輸入類(lèi)型:UserVo輸出類(lèi)型:UserVo查詢(xún)特定某年某月出生的用戶(hù),如果這個(gè)用戶(hù)年齡和月份沒(méi)有透露完全,則根據(jù)對(duì)應(yīng)的去查找--> <select id="selectUserVoList" parameterType="com.csa.po.UserVo" resultMap="userVoMap">select * from User<!-- where標(biāo)簽:默認(rèn)去掉后面第一個(gè)and,如果沒(méi)有參數(shù),則把自己干掉 --><where><!-- if標(biāo)簽:可以對(duì)輸入的參數(shù)進(jìn)行判斷 --><!-- 與OGNL表達(dá)式類(lèi)似 --><if test="user != null"><if test="user.age != null">and age=#{user.age}</if><if test="user.brithdayMonth != null">and brithdayMonth=#{brithdayMonth}</if></if></where> </select>UserDao接口
/*** 查詢(xún)特定某年某月出生的用戶(hù),如果這個(gè)用戶(hù)年齡和月份沒(méi)有透露完全,則根據(jù)對(duì)應(yīng)的去查找* @param userVo* @return*/ public List<UserVo> selectUserVoList(UserVo userVo);測(cè)試
public static void main(String[] args) throws Exception {// 讀取全局配置文件String resource = "SqlMapConfig.xml";InputStream input = Resources.getResourceAsStream(resource);// 創(chuàng)建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);// 創(chuàng)建sqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 創(chuàng)建daoUserDao userDao = sqlSession.getMapper(UserDao.class);User user = new User();UserVo userVo = new UserVo();user.setAge(12);userVo.setUser(user);List<UserVo> userVoList = userDao.selectUserVoList(userVo);System.out.println(userVoList);// 關(guān)閉sqlSessionsqlSession.close(); }測(cè)試結(jié)果
7.3、sql片段
映射文件
<!-- 輸入類(lèi)型:UserVo輸出類(lèi)型:UserVo查詢(xún)特定某年某月出生的用戶(hù),如果這個(gè)用戶(hù)年齡和月份沒(méi)有透露完全,則根據(jù)對(duì)應(yīng)的去查找--> <select id="selectUserVoList" parameterType="com.csa.po.UserVo" resultMap="userVoMap">select * from User<include refid="whereUser"></include> </select><sql id="whereUser"><!-- where標(biāo)簽:默認(rèn)去掉后面第一個(gè)and,如果沒(méi)有參數(shù),則把自己干掉 --><where><!-- if標(biāo)簽:可以對(duì)輸入的參數(shù)進(jìn)行判斷 --><!-- 與OGNL表達(dá)式類(lèi)似 --><if test="user != null"><if test="user.age != null">and age=#{user.age}</if><if test="user.brithdayMonth != null">and brithdayMonth=#{brithdayMonth}</if></if></where> </sql>7.4、sql片段
<foreach collection="迭代集合" item="迭代對(duì)象" open="()" close=")" separator=",">#{迭代對(duì)象.屬性} </foreach>參考
黑馬筆記和各種博客!
總結(jié)
以上是生活随笔為你收集整理的MyBatis学习总结一的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: HR面试看重这些点
- 下一篇: Mybatis学习总结二