Mybatis學習筆記(傳智播客)(完結)
說明:本文由大量的原始碼,及截圖,建議讀者,操作一遍。ide:IDEA。文末有筆記及視訊分享
Mybatis
1、對原生態jdbc程式(單獨使用jdbc開發)問題總結
先來看一部分程式碼
Public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//載入資料庫驅動
Class.forName("com.mysql.jdbc.Driver");
//通過驅動管理類獲取資料庫連結
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "mysql");
//定義sql語句 ?表示佔位符
String sql = "select * from user where username = ?" ;
//獲取預處理statement
preparedStatement = connection.prepareStatement(sql);
//設定引數,第一個引數為sql語句中引數的序號(從1開始),第二個引數為設定的引數值
preparedStatement.setString(1, "王五");
//向資料庫發出sql執行查詢,查詢出結果集
resultSet = preparedStatement.executeQuery();
//遍歷查詢結果集
while(resultSet.next()){
System.out.println(resultSet.getString("id")+" "+resultSet.getString("username"));
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//釋放資源
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
上面程式碼有如下幾個問題:
- 資料庫連線,使用時建立,不使用就關閉,對資料庫進行頻繁連線開啟和關閉,造成資料庫資源的浪費
- 解決:使用資料庫連線池管理資料庫連線
- 將sql 語句硬編碼到Java程式碼中,如果sql語句修改,需要對java程式碼重新編譯,不利於系統維護
- 解決:將sql語句設定在xml配置檔案中,即使sql變化,也無需重新編譯
- 向preparedStatement中設定引數,對佔位符位置和設定引數值,硬編碼到Java檔案中,不利於系統維護
- 解決:將sql語句及佔位符,引數全部配置在xml檔案中
- 從resutSet中遍歷結果集資料時,存在硬編碼,將獲取表的欄位進行硬編碼,不利於系統維護。
- 解決:將查詢的結果集,自動對映成java物件
2、Mybatis框架原理(掌握)
- 什麼是Mybatis?
- mybatis是一個持久層的框架,是apache下的頂級專案。
- mybatis託管到goolecode下,後來託管到github下:mybatis Github地址
- mybatis讓程式將主要精力放在sql上,通過mybatis提供的對映方式,自由靈活生成(半自動化,大部分需要程式設計師編寫sql)滿足需要sql語句。
- mybatis可以將向 preparedStatement中的輸入引數自動進行輸入對映,將查詢結果集靈活對映成java物件。(輸出對映)
- Mybatis原理圖:
3、Mybatis入門程式
- Mybatis和SpringMVC實現訂單商品案例
- 需求
- 根據使用者的id查詢使用者資訊
- 根據使用者的名稱模糊查詢使用者資訊
- 新增使用者
- 刪除使用者
- 更新使用者
Mybatis的執行環境(jar包)
從這裡點選下載
筆者下載的是:
下載mybatis-3.4.6.zip解壓即可
- lib下:依賴包
- mybatis-3.4.6.jar:核心 包
- mybatis-3.4.6.pdf,操作指南
目錄結構:
jar包結構
過程中需要資料庫的連線,junit的除錯,注意要將jar包build path!
log4j.properties
# Global logging configuration
# 開發環境下,日誌級別要設定成DEBUG或者ERROR
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
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>
<!-- 和spring整合後 environments配置將廢除-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事務管理-->
<transactionManager type="JDBC" />
<!-- 資料庫連線池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="" />
</dataSource>
</environment>
</environments>
<!--載入對映檔案-->
<mappers>
<mapper resource="sqlmap/User.xml"/>
</mappers>
</configuration>
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">
<!--
名稱空間,作用為,對sql進行分類化管理,理解sql隔離,
注意:使用mapper代理方法開發,namespace有特殊作用
-->
<mapper namespace="test">
<!--在對映檔案中配置sql-->
<!--
findUserById
通過select執行資料庫查詢
id:標識對映檔案的sql
將sql語句封裝到mappedStatement物件中,所以將id稱為Statement的id
#{}:表示一個佔位符
parameterType:指定輸入引數的型別
#{id}:其中的id表示接收輸入的引數,引數的名稱就是id,如果輸入引數型別為簡單型別,那麼#{}中的引數可以任意,可以是value或其他
resultType:指定sql輸出結果的所對映的Java物件型別,select指定的resultType表示將單條記錄對映成的Java物件
-->
<select id="findUserById" parameterType="int" resultType="com.nuc.mybatis.po.User">
select * from user where id=#{VALUE }
</select>
<!--
findUserByName
${}:表示拼接字串,將接收到的sql不加任何修飾拼接在sql語句裡
使用${}拼接sql,可能會引起sql注入,一般不建議使用
${value}:接收引數的內容,如果傳入的的是簡單型別,${}中只能使用value
-->
<select id="findUserByName" parameterType="java.lang.String" resultType="com.nuc.mybatis.po.User">
select * from user WHERE username LIKE '%${value}%'
</select>
<!--
新增使用者
parameterType:指定引數型別為pojo型別
#{}中指定pojo的屬性名,接收到的pojo物件的屬性值,mybatis通過OGNL獲取物件的值
SELECT LAST_INSERT_ID():得到剛剛insert進去的記錄的主鍵值,只適用於主鍵自增
非主鍵自的則需要使用uuid()來實現,表的id型別也得設定為tring(詳見下面的註釋)
keyProperty:將查詢到的主鍵值設定到SparameterType指定的物件的哪個屬性
order:SELECT LAST_INSERT_ID()執行順序,相當於insert語句來說它的實現順序
-->
<insert id="insertUser" parameterType="com.nuc.mybatis.po.User">
<!--uuid()-->
<!--
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.String">
SELECT uuid()
</selectKey>
insert into user (id,username,birthday,sex,address) value(#{id},#{username},#{birthday},#{sex},#{address})
-->
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
insert into user (username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address})
</insert>
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id=#{id}
</delete>
<update id="updateUser" parameterType="com.nuc.mybatis.po.User">
UPDATE user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
</update>
</mapper>
User.java
package com.nuc.mybatis.po;
import java.util.Date;
public class User {
//使用者po
//屬性名和資料庫欄位名對應
private int id;
private String username;// 使用者姓名
private String sex;// 性別
private Date birthday;// 生日
private String address;// 地址
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
MybatisFirst.java
package com.nuc.mybatis.first;
import com.nuc.mybatis.po.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.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
public class MybatisFirst {
//根據id查詢使用者資訊,得到一條記錄
@Test
public void findUserByIdTest() throws IOException {
//mybatis配置檔案
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//建立會話工廠
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通過工廠得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//通過SqlSession操作資料庫
//第一個引數:對映檔案中的statement的id,等於namespace+"."+statement的id
//第二個引數:指定和對映檔案中所匹配的所有parameterType的型別
//sqlSession.selectOne()的結果是對映檔案中所匹配的resultType型別的物件
User user = sqlSession.selectOne("test.findUserById",1);
System.out.println(user);
//釋放資源
sqlSession.close();
}
//根據使用者名稱稱查詢使用者列表
@Test
public void findUserByName() throws IOException {
//mybatis配置檔案
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//建立會話工廠
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通過工廠得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
List<User> list= sqlSession.selectList("test.findUserByName","小明");
System.out.println(list);
sqlSession.close();
}
/*
小結:
selectOne和selectList:
selectOne表示查詢出一條記錄進行對映。如果使用selectOne可以實現使用selectList也可以實現(list中只有一個物件)。
selectList表示查詢出一個列表(多條記錄)進行對映。如果使用selectList查詢多條記錄,不能使用selectOne。
如果使用selectOne報錯:
org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 4
*/
@Test
public void insertUserTest() throws IOException {
//mybatis配置檔案
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//建立會話工廠
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通過工廠得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = new User();
user.setUsername("宋江濤");
user.setBirthday(new Date());
user.setSex("男");
user.setAddress("山西");
//list中的user和對映檔案User.xml中的resultType的型別一直
sqlSession.insert("test.insertUser",user);
//提交事務
sqlSession.commit();
//獲取主鍵
System.out.println(user.getId());
sqlSession.close();
}
//刪除使用者
@Test
public void deleteUserTest() throws IOException {
//mybatis配置檔案
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//建立會話工廠
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通過工廠得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//list中的user和對映檔案User.xml中的resultType的型別一直
sqlSession.delete("test.deleteUser",30);
//提交事務
sqlSession.commit();
sqlSession.close();
}
//更新使用者
@Test
public void updateUserTest() throws IOException {
//mybatis配置檔案
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//建立會話工廠
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通過工廠得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = new User();
user.setId(27);
user.setUsername("宋江濤new2");
user.setBirthday(new Date());
user.setSex("男");
user.setAddress("山西太原new");
//list中的user和對映檔案User.xml中的resultType的型別一直
sqlSession.update("test.updateUser",user);
//提交事務
sqlSession.commit();
sqlSession.close();
}
}
資料庫的設計圖
部分測試結果
jdbc的測試程式,前面已經沾過。
重點內容在程式碼的註釋中均已說明
mybatis和hibernate本質區別和應用場景
hibernate:是一個標準ORM框架(物件關係對映)。入門門檻較高的,不需要程式寫sql,sql語句自動生成了。
對sql語句進行優化、修改比較困難的。- 應用場景:
- 適用與需求變化不多的中小型專案,比如:後臺管理系統,erp、orm、oa。。
- 應用場景:
mybatis:專注是sql本身,需要程式設計師自己編寫sql語句,sql修改、優化比較方便。mybatis是一個不完全 的ORM框架,雖然程式設計師自己寫sql,mybatis 也可以實現對映(輸入對映、輸出對映)。
- 應用場景:
- 適用與需求變化較多的專案,比如:網際網路專案。
- 應用場景:
企業進行技術選型,以低成本 高回報作為技術選型的原則,根據專案組的技術力量進行選擇。
4、Mybatis開發dao的方法
原始dao開發方法(程式需要編寫dao介面和dao實現類)(掌握)
- 在原有專案的基礎上,src目錄下建立com.nuc.mybatis.dao
- 在這個包裡有兩個檔案,一個是UserDao.java,另一個是UserDaoImpl.java這個類繼承介面UserDao.java
- 在建立一個和src同級的資料夾(記的把它標記為sources)具體方法見詳情
在test下建立com.nuc.mybatis.test,建立類UserDaoImplTest.java
具體目錄結構:
結構中的相關mapper請先忽略
UserDao.java
package com.nuc.mybatis.dao;
import com.nuc.mybatis.po.User;
public interface UserDao {
//dao原始開發
//根據id查詢使用者資訊
public User findUserById(int id) throws Exception;
//新增使用者
public void insertUser(User user) throws Exception;
//刪除使用者
public void deleteUser(int id) throws Exception;
}
UserDaoImpl.java
package com.nuc.mybatis.dao;
import com.nuc.mybatis.po.User;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSession;
public class UserDaoImpl implements UserDao {
//原生態的dao
//需要向dao實現類裡注入SqlSessionFactory
//通過構造方法
private SqlSessionFactory sqlSessionFactory;
public UserDaoImpl(SqlSessionFactory sqlSessionFactory){
this.sqlSessionFactory=sqlSessionFactory;
}
@Override
public User findUserById(int id) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = sqlSession.selectOne("test.findUserById",id);
sqlSession.close();
return user;
}
@Override
public void insertUser(User user) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.insert("test.insertUser",user);
sqlSession.commit();
sqlSession.close();
}
@Override
public void deleteUser(int id) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.insert("test.deleteUser",id);
sqlSession.commit();
sqlSession.close();
}
}
UserDaoImplTest.java
package com.nuc.mybatis.test;
import com.nuc.mybatis.mapper.UserMapper;
import com.nuc.mybatis.po.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.Before;
import org.junit.Test;
import java.io.InputStream;
import java.util.List;
public class UserMapperTest {
//原始dao的測試
private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception{
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//建立會話工廠
sqlSessionFactory = new
SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindUserById() throws Exception{
SqlSession sqlSession = sqlSessionFactory.openSession();
//建立UserMapper的物件,mybatis自動呼叫
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.findUserById(1);
System.out.println(user);
}
@Test
public void testFindUserByName() throws Exception{
SqlSession sqlSession = sqlSessionFactory.openSession();
//建立UserMapper的物件,mybatis自動呼叫
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> list= userMapper.findUserByName("宋江濤");
System.out.println(list);
}
//其他的測試,可以照貓畫虎
}
測試結果:
Mybatis的mapper介面(相當於dao介面)代理開發方法(掌握)
根據上面的結構圖建立相應檔案,原始碼如下:
UserMapper.java
package com.nuc.mybatis.mapper;
import com.nuc.mybatis.po.User;
import java.util.List;
public interface UserMapper {
//mapper代理開發和dao開發對比
// mapper介面,相當於dao介面,mybatis可以自動生成mapper介面實現類的代理物件
//根據id查詢使用者資訊
public User findUserById(int id) throws Exception;
//根據使用者名稱查詢使用者列表
public List<User>findUserByName(String name) throws Exception;
//新增使用者
public void insertUser(User user) throws Exception;
//刪除使用者
public void deleteUser(int id) throws Exception;
}
UserMapper.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.nuc.mybatis.mapper.UserMapper">
<select id="findUserById" parameterType="int" resultType="com.nuc.mybatis.po.User">
select * from user where id=#{VALUE }
</select>
<select id="findUserByName" parameterType="java.lang.String" resultType="com.nuc.mybatis.po.User">
select * from user WHERE username LIKE '%${value}%'
</select>
<insert id="insertUser" parameterType="com.nuc.mybatis.po.User">
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
insert into user (username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address})
</insert>
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id=#{id}
</delete>
<update id="updateUser" parameterType="com.nuc.mybatis.po.User">
UPDATE user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
</update>
</mapper>
在測試之前需要在SqlMapConfig.xml中載入mapper.xml這個對映檔案
UserMapperTest.java
package com.nuc.mybatis.test;
import com.nuc.mybatis.mapper.UserMapper;
import com.nuc.mybatis.po.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.Before;
import org.junit.Test;
import java.io.InputStream;
import java.util.List;
public class UserMapperTest {
//原始mapper的測試
private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception{
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//建立會話工廠
sqlSessionFactory = new
SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindUserById() throws Exception{
SqlSession sqlSession = sqlSessionFactory.openSession();
//建立UserMapper的物件,mybatis自動呼叫
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.findUserById(1);
System.out.println(user);
}
@Test
public void testFindUserByName() throws Exception{
//返回列表測試
SqlSession sqlSession = sqlSessionFactory.openSession();
//建立UserMapper的物件,mybatis自動呼叫
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> list= userMapper.findUserByName("宋江濤");
System.out.println(list);
}
}
部分測試結果:
總結:
- 原始dao開發問題
- dao介面實現類方法中存在大量模板方法,設想能否將這些程式碼提取出來,大大減輕程式設計師的工作量。
- 呼叫sqlsession方法時將statement的id硬編碼了
mapper開發
- 只需要編寫兩個檔案,mapper.java,mapper.xml。即可,不需要類來繼承它。
mapper開發只需要遵守幾個規範即可
- 在mapper.xml中namespace等於mapper介面地址
- mapper.java介面中的方法名和mapper.xml中statement的id一致
- mapper.java介面中的方法輸入引數型別和mapper.xml中statement的parameterType指定的型別一致。
- mapper.java介面中的方法返回值型別和mapper.xml中statement的resultType指定的型別一致。
- 在mapper.xml中namespace等於mapper介面地址
其實,以上開發規範主要是對下邊的程式碼進行統一生成:
User user = sqlSession.selectOne("test.findUserById", id); sqlSession.insert("test.insertUser", user); 。。。。
mapper介面方法引數只能有一個是否影響系統 開發?mapper介面方法引數只能有一個,系統是否不利於擴充套件維護?
- 系統 框架中,dao層的程式碼是被業務層公用的。
- 即使mapper介面只有一個引數,可以使用包裝型別的pojo滿足不同的業務方法的需求。
注意:持久層方法的引數可以包裝型別、map。。。,service方法中建議不要使用包裝型別(不利於業務層的可擴充套件)。
5、Mybatis配置檔案SqlMapConfig.xml
properties(屬性)
- 將資料庫連線的引數單獨配置在,db.properties中,只需要在SqlMapConfig.xml中載入db.properties的屬性值。在SqlMapConfig.xml中就不需要對資料庫連線引數硬編碼。
- 好處:方便對引數進行統一管理,其它xml可以引用該db.properties
特性: MyBatis 將按照下面的順序來載入屬性:
- 在 properties 元素體內定義的屬性首先被讀取。
- 然後會讀取properties 元素中resource或 url 載入的屬性,它會覆蓋已讀取的同名屬性。
- 最後讀取parameterType傳遞的屬性,它會覆蓋已讀取的同名屬性。
建議:
- 不要在properties元素體內新增任何屬性值,只將屬性值定義在properties檔案中。
- 在properties檔案中定義屬性名要有一定的特殊性,如XXXXX.XXXXX.XXXX
- settings(全域性配置引數)
- mybatis框架在執行時可以調整一些執行引數。比如:開啟二級快取、開啟延遲載入。。全域性引數將會影響mybatis的執行行為。具體如下:
- mybatis框架在執行時可以調整一些執行引數。比如:開啟二級快取、開啟延遲載入。。全域性引數將會影響mybatis的執行行為。具體如下:
- typeAliases(類型別名)(重點)
- 單個定義
- 批量定義(常用)
這樣在其他地方就可以使用,例如:
- mybatis預設支援的別名
- 單個定義
- typeHandlers(型別處理器)
- mybatis中通過typeHandlers完成jdbc型別和java型別的轉換。通常情況下,mybatis提供的型別處理器滿足日常需要,不需要自定義.
- mybatis支援的型別處理器
- objectFactory(物件工廠)
- 這個自行檢視下載mybatis時附帶的pdf檔案,用的不多
- plugins(外掛)
- environments(環境集合屬性物件)
- environment(環境子屬性物件)
- transactionManager(事務管理)
- dataSource(資料來源)
- environment(環境子屬性物件)
- mappers(對映器)
- 通過resource
- 通過class
- 通過package(推薦使用)
- 通過resource
6、Mybatis核心
Mybatis輸入對映(掌握)
- 通過parameterType指定輸入引數的型別,型別可以是簡單型別、hashmap、pojo的包裝型別
- 傳遞pojo的包裝物件
- 需求:完成使用者資訊的綜合查詢,需要傳入查詢條件很複雜(可能包括使用者資訊、其它資訊,比如商品、訂單的)
- 針對上邊需求,建議使用自定義的包裝型別的pojo。
在包裝型別的pojo中將複雜的查詢條件包裝進去。
- 傳遞pojo的包裝物件
目錄結構
UserCustom.java- 通過parameterType指定輸入引數的型別,型別可以是簡單型別、hashmap、pojo的包裝型別
package com.nuc.mybatis.po;
public class UserCustom extends User {
//可擴充套件使用者資訊
}
UserQueryVo.java
package com.nuc.mybatis.po;
public class UserQueryVo {
//這裡包裝所需的查詢條件
//使用者查詢條件
private UserCustom userCustom;
public UserCustom getUserCustom() {
return userCustom;
}
public void setUserCustom(UserCustom userCustom) {
this.userCustom = userCustom;
}
//可包裝其他的查詢條件,訂單,商品。。。
}
UserMapper.xml中配置新的查詢
UserMapperTest.java中新增測試
相關推薦
Mybatis學習筆記(傳智播客)(完結)
說明:本文由大量的原始碼,及截圖,建議讀者,操作一遍。ide:IDEA。文末有筆記及視訊分享 Mybatis 1、對原生態jdbc程式(單獨使用jdbc開發)問題總結 先來看一部分程式碼 Public static void ma
web前端入門學習筆記——html基礎(傳智播客)
Html基礎1 常用快捷鍵Ctrl+c複製Ctrl+v貼上Ctrl+x剪下Ctrl+a全選Ctrl+s儲存Ctrl+z撤銷一步Windows+d返回桌面Windows+e我的電腦Windows+r開啟執行Alt+tab切換軟體Ctrl+tab軟體文件之間的切換F2重新命
SpringMVC學習筆記(傳智播客)(完結)
說明:所有程式碼調式的環境:開發環境idea,jdk7,tomcat8.5.27,資料庫MySQL5.1,spring3.2 SpringMVC 1、什麼是SpringMVC? springmvc是spring框架的一個模組,springmv
Java學習筆記--異常處理(傳智播客的總結)
背景: 我們的java程式也是會存在某些不正常 的情況的,這些不正常的 情況我們就統稱異常。(還有一種是IO流的異常 要包裝成執行時異常) 異常體系: ———-| Throwable 所以異常或者錯誤類的超類 ————–|Erro
JDBC學習記錄(傳智播客視訊)
1、概念JDBC:java Data Base Connectivity ,即java資料庫連結JDBC是一套API,也就是sun公司定義的類或者介面。而驅動是資料庫公司定義的類庫,實現了sun公司規定的介面。2、JDBC開發步驟a、註冊驅動:告知JVM使用的是哪一個資料庫的
Hadoop2.7.3-HA 叢集搭建(傳智播客)
前期準備 1 修改Linux主機名 2 修改IP 3 修改主機名和IP的對映關係 /etc/hosts 4 關閉防火牆 5 ssh免登陸 6 安裝JDK,配置環境變數等 叢集規劃 主機名
傳智播客javascript視訊教程(楊中科)學習筆記
這套視訊僅僅講述了JS的除錯,引用,array,和for迴圈的知識。非常的基礎,很多其他內容沒有涉及到。拿出一天來學習足以。 以下是這套視訊的下載地址,共十八級: http://www.itcast.cn/news/bd4612c7/a940/4585/9153/487b
傳智播客c/c++公開課學習筆記--郵箱賬戶的破解與郵箱安全防控
用戶登陸 const mod ase content Coding 一行 學習筆記 ++ 一、SMTP協議 SMTP(SimpleMail Transfer Protocol)即簡單郵件傳輸協議。SMTP協議屬於TCP/IP協議簇,通過SMTP協議
傳智播客掃地僧C/C++學習筆記氣泡排序
#include "stdlib.h" #include "string.h" #include "stdio.h" void main() { int i = 0; int a[] = { 22, 56, 4, 57, 8, 10 }; print
傳智播客-劉意-java深入淺出精華版學習筆記Day01
計算機基礎知識:開啟控制行的方法:win+R,cmd回車Tips:1.切換碟符的時候大小寫無所謂。2.安裝軟體的時候在非系統盤裡建立一個新的目錄,把所有的程式檔案放到這個目錄起來,這樣既不佔系統盤空間,也不會把非系統盤搞得亂七八糟。3.刪除帶內容的資料夾:rd後加/s關鍵字,
傳智播客 劉意_2015年Java基礎視訊-深入淺出精華版 筆記(2015年10月25日23:28:50)
day01 win 7系統開啟DOS有趣方法:按住shift+右鍵,單擊“在此處開啟命令視窗”(注意:在此處可以是任何的資料夾,不一定是桌面) 用DOS刪除的檔案不可以在回收站恢復?!! 常用DOS命令 d: 回車 碟符切換 dir(direct
傳智播客webService第(二-三)天課堂筆記
這幾天心情一直不好,原來的畢業設計進度也因此嚴重的落伍了,但我還是準備一步步的完成!!! webservice這三天可是把我講的有點暈,不過還是在徐老師的幫助下,迴歸正途。。 徐老師傳智播客新來的老師,夠牛!!! 以前我在地下室的時候,徐老師來我旁邊坐,我還以為是同志,好是
傳智播客-劉意-java深入淺出精華版學習筆記Day07
成員變數和區域性變數的區別:成員變數:類中方法外 堆記憶體中 隨著物件的建立存在 隨著物件的消失而消失 有預設初始化值區域性變數:方法定義中或者方法宣告上
傳智播客黑馬 Python學習筆記之第一個 Python 程式
第一個 Python 程式 目標 第一個 HelloPython 程式 Python 2.x 與 3.x 版本簡介 執行 Python 程式的三種方式 直譯器 —— python / python3 互動式 —— ipytho
傳智播客-Java學習筆記day11
Object:類 Object 是類層次結構的根類。每個類都使用 Object 作為超類。 * 每個類都直接或者間接的繼承自Object類。 * * Object類的方法: * public int hashCode():返回該物件的雜湊碼值。 * 注意:
傳智播客-劉意-java深入淺出精華版學習筆記Day08
工具中使用靜態:在同一個類中,main方法只能訪問靜態方法。【錯誤:無法從靜態上下文中引用非靜態,這樣的錯誤一定是因為在main方法中呼叫了非靜態方法。】對非靜態方法來說,只能通過物件(也就是其他類的物件)來呼叫非靜態方法。靜態方法當然也可以,而且靜態方法可以直接呼叫類名來訪
傳智播客-劉意-java深入淺出精華版學習筆記Day02
Java基本語法關鍵字:被java賦予特殊含義的單詞要點:關鍵字必須全部小寫;goto和const作為保留字存在,目前並不實用注意:main雖然被JVM識別,但是它並不是關鍵字。String、System也被JVM識別,但是它有大寫字母,所以也不是關鍵字。關鍵字列表:識別符號
傳智播客-劉意-java深入淺出精華版學習筆記Day09
這幾天的課真是越來越難了。。。。final:我們知道,在繼承中,有方法的重寫這一項。如果我不想讓子類重寫父類的方法,應該怎麼做?針對這種情況,Java提供了關鍵字final。final可以修飾類、方法、變數。在父類中,如果final修飾了一個方法,在子類中試圖對該方法進行重寫
傳智播客c/c++公開課學習筆記--C語言與木馬惡意程式碼分析和360安全防護揭祕
【課程簡介】 C/C++語言是除了彙編之外,最接近底層的計算機語言,目前windows,linux,iOS,Android等主流作業系統都是用C/C++編寫的,所以很多病毒、木馬也都是用C/C++實現的。課程的目的就是通過C語言揭祕木馬和各種遠端控制軟體的實現原理以及如
【傳智播客鄭州校區】數據庫MYSQL筆記詳解
含義 訪問 面試題 增長 variable 切換 dos命令 技術 運行 第1章 數據庫1.1 數據庫概述l 什麽是數據庫數據庫就是存儲數據的倉庫,其本質是一個文件系統,數據按照特定的格式將數據存儲起來,用戶可以對數據庫中的數據進行增加,修改,刪除及查詢操作。l 什麽是數據