
前言
今天復習Java資料庫編程,二話不說MyBatis手把手保姆級教程獻上,再也不用擔心學不會!
資料:
鏈接:https://pan.baidu.com/s/1FIDi_9QiTuhb4x7pksGOUQ
提取碼:kevf
1. MyBatis入門
文章目錄
- 前言
- 1. MyBatis入門
- 1.1 概述
- 1.2 下載
- 1.3 與JDBC對比
- 1.4 入門案例:搭建環境
- 1.4.1 構建專案
- 1.4.2 資料庫和表:User
- 1.5 入門案例:查詢所有
- 1.5.1 JavaBean:User
- 1.5.2 撰寫Dao:UserMapper
- 1.5.3 撰寫核心組態檔:SqlMapConfig.xml
- 1.5.4 測驗類
- 1.6 總結
- 2. 基本操作:增刪改查
- 2.1 模糊查詢
- 2.2 插入資料
- 2.3 更新資料
- 2.4 洗掉資料
- 3.日志與工具類
- 3.1 日志
- 3.1.1 什么是日志
- 3.1.2 整合日志
- 3.2 工具類
- 3.2.1 拷貝工具類
- 3.2.2 工具類原理分析
- 3.2.3 測驗類
- 4.API詳解
- 4.1 核心組態檔詳解
- 4.1.1 根標簽:\
1.1 概述
? MyBatis是一個優秀的持久層框架,它對jdbc的操作資料庫的程序進行封裝,使開發者只需要關注 SQL 本身,而不需要花費精力去處理注冊驅動、創建Connection、創建Statement、手動設定引數、結果集檢索及映射等繁雜的程序代碼,

-
歷史行程
? MyBatis 本是apache的一個開源專案iBatis, 2010年這個專案由apache software foundation 遷移到了google code,并且改名為MyBatis,實質上Mybatis對iBatis進行一些改進,
-
多學一招
同層產品:commons-dbutils、spring-jdbc、Hibernate
1.2 下載
MyBaits的代碼由github.com管理,地址:https://github.com/mybatis/mybatis-3/releases
- 可以直接Copy老師的JAR包

1.3 與JDBC對比
-
JDBC撰寫DAO的步驟

-
MyBatis撰寫DAO的步驟

1.4 入門案例:搭建環境
1.4.1 構建專案
- 1)創建新專案:Java --> Java EE --> Web Application

- 2)創建專案名:mybatis-demo01

- 3)添加jar包
WEB-INF/lib目錄下(目錄不存在,需手動創建)

- 4)添加jar

1.4.2 資料庫和表:User
# 創建資料庫
CREATE DATABASE ssm_db1;
# 使用資料庫
USE ssm_db1;
# 1.1 創建用戶表
CREATE TABLE `user` (
`uid` VARCHAR(32) NOT NULL,
`username` VARCHAR(20) DEFAULT NULL, #用戶名
`password` VARCHAR(32) DEFAULT NULL, #密碼
`name` VARCHAR(20) DEFAULT NULL, #昵稱
`email` VARCHAR(30) DEFAULT NULL, #電子郵箱
`telephone` VARCHAR(20) DEFAULT NULL, #電話
`birthday` DATE DEFAULT NULL, #生日
`sex` VARCHAR(10) DEFAULT NULL, #性別
`state` INT(11) DEFAULT 0, #狀態:0=未激活,1=已激活
`code` VARCHAR(64) DEFAULT NULL, #激活碼
PRIMARY KEY (`uid`)
) ;
# 1.2 初始化用戶默認資料
INSERT INTO `user` VALUES ('u001','jack','1234','杰克','jack@czxy.com','13612345678','2015-11-04','男',0,NULL);
INSERT INTO `user` VALUES ('u002','rose','1234','肉絲','rose@czxy.com','13612345679','2015-11-05','女',0,NULL);
INSERT INTO `user` VALUES ('373eb242933b4f5ca3bd43503c34668b','ccc','ccc','aaa','bbb@store.com','15723689921','2015-11-04','男',0,'9782f3e837ff422b9aee8b6381ccf927bdd9d2ced10d48f4ba4b9f187edf7738'),('3ca76a75e4f64db2bacd0974acc7c897','bb','bb','張三','bbb@store.com','15723689921','1990-02-01','男',0,'1258e96181a9457987928954825189000bae305094a042d6bd9d2d35674684e6'),('62145f6e66ea4f5cbe7b6f6b954917d3','cc','cc','張三','bbb@store.com','15723689921','2015-11-03','男',0,'19f100aa81184c03951c4b840a725b6a98097aa1106a4a38ba1c29f1a496c231'),('c95b15a864334adab3d5bb6604c6e1fc','bbb','bbb','老王','bbb@store.com','15712344823','2000-02-01','男',0,'71a3a933353347a4bcacff699e6baa9c950a02f6b84e4f6fb8404ca06febfd6f'),('f55b7d3a352a4f0782c910b2c70f1ea4','aaa','aaa','小王','aaa@store.com','15712344823','2000-02-01','男',1,NULL);
1.5 入門案例:查詢所有
1.5.1 JavaBean:User

package com.czxy.ssm.domain;
import java.util.Date;
/**
*
Create Table
CREATE TABLE `user` (
`uid` varchar(32) NOT NULL,
`username` varchar(20) DEFAULT NULL,
`password` varchar(20) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`email` varchar(30) DEFAULT NULL,
`birthday` date DEFAULT NULL,
`sex` varchar(10) DEFAULT NULL,
`state` int(11) DEFAULT NULL,
`code` varchar(64) DEFAULT NULL,
PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
*/
public class User {
private String uid;
private String username;
private String password;
private String name;
private String email;
private Date birthday;
private String sex;
private Integer state;
private String code;
@Override
public String toString() {
return "User{" +
"uid='" + uid + '\'' +
", username='" + username + '\'' +
", password='" + password + '\'' +
", name='" + name + '\'' +
", email='" + email + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", state=" + state +
", code='" + code + '\'' +
'}';
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getState() {
return state;
}
public void setState(Integer state) {
this.state = state;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public User(String uid, String username, String password, String name, String email, Date birthday, String sex, Integer state, String code) {
this.uid = uid;
this.username = username;
this.password = password;
this.name = name;
this.email = email;
this.birthday = birthday;
this.sex = sex;
this.state = state;
this.code = code;
}
public User() {
}
}
1.5.2 撰寫Dao:UserMapper
之前的開發中我們撰寫的都是UserDao,在MyBatis將dao稱為Mapper,
所以此后所有dao介面統一命名成Mapper,
- 在MyBatis只需要撰寫介面即可,實作類由MyBatis自動生成,并在測驗程式時自動執行,

package com.czxy.ssm.mapper;
import com.czxy.ssm.domain.User;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* @author manor的大資料之路
*
*/
public interface UserMapper {
/**
* 查詢所有
* @return
*/
@Select("select * from user")
public List<User> selectAll();
}
1.5.3 撰寫核心組態檔:SqlMapConfig.xml
-
組態檔名稱:SqlMapConfig.xml
-
組態檔位置:src

- 組態檔內容:
<?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>
<!-- 環境: default的值參考什么id,就表示使用什么資料庫了-->
<environments default="db1">
<!-- 配置資料庫連接資訊及事務 -->
<environment id="db1">
<!-- 表示使用事務:默認是自動開啟事務 -->
<transactionManager type="JDBC" />
<!-- 使用連接池 -->
<dataSource type="POOLED">
<!-- 資料庫連接基本資訊 -->
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/ssm_db1" />
<property name="username" value="root" />
<property name="password" value="1234" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- 表示加載此包下的所有dao介面-->
<package name="com.czxy.ssm.mapper"/>
</mappers>
</configuration>
1.5.4 測驗類
package com.czxy.ssm.test;
import com.czxy.ssm.domain.User;
import com.czxy.ssm.mapper.UserMapper;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @author manor的大資料之路
*
*/
public class Test01_SelectAll {
public static void main(String[] args) throws IOException {
//1 加載組態檔
// 1.1 獲得資源流
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
// 1.2 獲得工廠
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//2 獲得會話(連接)
SqlSession session = factory.openSession();
//3獲得功能介面
UserMapper userMapper = session.getMapper(UserMapper.class);
//4 呼叫功能
List<User> userList = userMapper.selectAll();
//5 列印查詢結果
for (User user : userList) {
System.out.println(user);
}
}
}
1.6 總結
- 到這里MyBatis的入門案例已經完成,我們總結一下:
- 撰寫SqlMapConfig.xml,用于配置資料源和需要加載的Mapper
- 撰寫UserMapper.java介面,用于執行方法與SQL陳述句的系結
- 基本API使用,流程是:加載資源、獲得工廠、獲得會話、獲得Mapper,
2. 基本操作:增刪改查
2.1 模糊查詢

-
功能介面中的方法
-
如果引數簡單型別,sql陳述句需要使用value [不推薦]
@Select("select * from user where name like #{value}") public List<User> selectByName(String name); -
如果使用@Param,可以進行相應的命名 【推薦】
@Select("select * from user where name like #{name}") public List<User> selectByName(@Param("name") String name);
-
-
測驗類
package com.czxy.ssm.test;
import com.czxy.ssm.domain.User;
import com.czxy.ssm.mapper.UserMapper;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @author manor的大資料之路
*
*/
public class Test02_Like {
public static void main(String[] args) throws IOException {
//1 加載組態檔
// 1.1 獲得資源流
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
// 1.2 獲得工廠
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//2 獲得會話(連接)
SqlSession session = factory.openSession();
//3獲得功能介面
UserMapper userMapper = session.getMapper(UserMapper.class);
//4 呼叫功能
List<User> userList = userMapper.selectByName("%王%");
//5 列印查詢結果
for (User user : userList) {
System.out.println(user);
}
}
}
2.2 插入資料

- 功能介面中的方法
/**
* 插入資料
* @param user
*/
@Insert("insert into user(uid, username, password, name, email, birthday, sex, state) values(#{uid},#{username},#{password},#{name},#{email},#{birthday},#{sex},#{state})")
public Integer insert(User user);
- 測驗類(注意:需要提交事務)
package com.czxy.ssm.test;
import com.czxy.ssm.domain.User;
import com.czxy.ssm.mapper.UserMapper;
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 java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
/**
* @author manor的大資料之路
*
*/
public class Test03_Insert {
public static void main(String[] args) throws IOException {
//1 加載組態檔
// 1.1 獲得資源流
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
// 1.2 獲得工廠
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//2 獲得會話(連接)
SqlSession session = factory.openSession();
//3獲得功能介面
UserMapper userMapper = session.getMapper(UserMapper.class);
//4 呼叫功能
User user = new User();
user.setUid("1");
user.setUsername("jack");
user.setPassword("1234");
user.setName("杰克");
user.setEmail("itcast_lt@163.com");
user.setBirthday(new Date());
user.setSex("男");
user.setSex("0");
Integer result = userMapper.insert(user);
System.out.println(result);
//5 提交資源
session.commit();
//6 釋放資源
session.close();
}
}
2.3 更新資料

- 功能介面中的方法
/**
* 插入資料
* @param user
*/
@Insert("update user set username=#{username}, password=#{password}, name=#{name}, email=#{email},birthday=#{birthday},sex=#{sex}, state=#{state} where uid=#{uid}")
public Integer update(User user);
- 測驗類
package com.czxy.ssm.test;
import com.czxy.ssm.domain.User;
import com.czxy.ssm.mapper.UserMapper;
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 java.io.IOException;
import java.io.InputStream;
import java.util.Date;
/**
* @author manor的大資料之路
*
*/
public class Test04_Update {
public static void main(String[] args) throws IOException {
//1 加載組態檔
// 1.1 獲得資源流
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
// 1.2 獲得工廠
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//2 獲得會話(連接)
SqlSession session = factory.openSession();
//3獲得功能介面
UserMapper userMapper = session.getMapper(UserMapper.class);
//4 呼叫功能
User user = new User();
user.setUid("1");
user.setUsername("jack1");
user.setPassword("12341");
user.setName("杰克");
user.setEmail("itcast_lt@163.com");
user.setBirthday(new Date());
user.setSex("男");
user.setSex("0");
Integer result = userMapper.update(user);
System.out.println(result);
//5 提交資源
session.commit();
//6 釋放資源
session.close();
}
}
2.4 洗掉資料

- 功能介面中的方法
/**
* 通過id洗掉
* @param uid
*/
@Delete("delete from user where uid = #{uid}")
public Integer deleteByPrimaryKey(@Param("uid") Integer uid);
- 測驗類
package com.czxy.ssm.test;
import com.czxy.ssm.domain.User;
import com.czxy.ssm.mapper.UserMapper;
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 java.io.IOException;
import java.io.InputStream;
import java.util.Date;
/**
* @author manor的大資料之路
*
*/
public class Test05_Delete {
public static void main(String[] args) throws IOException {
//1 加載組態檔
// 1.1 獲得資源流
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
// 1.2 獲得工廠
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//2 獲得會話(連接)
SqlSession session = factory.openSession();
//3獲得功能介面
UserMapper userMapper = session.getMapper(UserMapper.class);
//4 呼叫功能
Integer result = userMapper.deleteByPrimaryKey(1);
System.out.println(result);
//5 提交資源
session.commit();
//6 釋放資源
session.close();
}
}
3.日志與工具類
3.1 日志
3.1.1 什么是日志
- 記錄程式運行的程序細節,例如:我們在控制臺可以看到SQL陳述句

3.1.2 整合日志
-
1)添加jar包 (已添加)

-
2)添加組態檔

# 2. 輸出格式
## log4j.appender.stdout=輸出位置(固定值,由log4j提供)
## log4j.appender.stdout.Target=方式
## log4j.appender.stdout.layout=布局(固定值)
## log4j.appender.stdout.layout.ConversionPattern=格式
# 2.1 將日志輸出到控制臺
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c:%L - %m%n
# 2.2 將日志輸出到檔案
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=d:/file.log
log4j.appender.file.Append=false
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c:%L - %m%n
#1.log4j.rootLogger=日志級別, 輸出方式1, 輸出方式2, ...
## 日志級別:debug、info、warn、error
log4j.rootLogger=debug, stdout, file
# 3 自定義日志級別
## log4j.logger.包=日志級別
#log4j.logger.com.ibatis = debug
#log4j.logger.com.ibatis.common.jdbc.SimpleDataSource = debug
#log4j.logger.com.ibatis.common.jdbc.ScriptRunner = debug
#log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate = debug
#log4j.logger.java.sql.Connection = debug
#log4j.logger.java.sql.Statement = debug
#log4j.logger.java.sql.PreparedStatement = debug
#log4j.logger.java.sql.ResultSet =debug
log4j.logger.org.apache.ibatis.transaction = info
log4j.logger.org.apache.ibatis.io = info
log4j.logger.org.apache.ibatis.datasource = info
log4j.logger.org.apache.ibatis.logging = info
3.2 工具類
3.2.1 拷貝工具類
-
完成增刪改查的時候,我們發現有一些代碼大量重復,我們將提供工具類,對重復代碼進行簡化,

package com.czxy.ssm.utils;
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 java.io.InputStream;
/**
* @author manor的大資料之路
*
*/
public class MyBatisUtils {
// 會話工廠
private static SqlSessionFactory factory;
static{
try {
// 1.1 加載核心組態檔
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
// 1.2 獲得工廠
factory = new SqlSessionFactoryBuilder().build(is);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static ThreadLocal<SqlSession> local = new ThreadLocal<>();
/**
* 獲得新會話
* @return
*/
private static SqlSession openSession(){
SqlSession sqlSession = local.get();
if(sqlSession == null){
sqlSession = factory.openSession();
local.set(sqlSession);
}
return sqlSession;
}
/**
* 獲得mapper
* @param clazz
* @return
*/
public static <T> T getMapper(Class<T> clazz){
return openSession().getMapper(clazz);
}
/**
* 釋放資源
*/
public static void close() {
SqlSession sqlSession = openSession();
if(sqlSession != null){
sqlSession.close();
}
}
/**
* 提交并釋放資源
*/
public static void commitAndclose() {
SqlSession sqlSession = openSession();
if(sqlSession != null){
sqlSession.commit();
close();
}
}
/**
* 回滾并釋放資源
*/
public static void rollbackAndclose() {
SqlSession sqlSession = openSession();
if(sqlSession != null){
sqlSession.rollback();
close();
}
}
}
3.2.2 工具類原理分析
- 工具類實作原理分析

3.2.3 測驗類
package com.czxy.ssm.test;
import com.czxy.ssm.domain.User;
import com.czxy.ssm.mapper.UserMapper;
import com.czxy.ssm.utils.MyBatisUtils;
import java.util.Date;
/**
* @author manor的大資料之路
*
*/
public class Test06_Utils {
public static void main(String[] args) {
UserMapper userMapper = MyBatisUtils.getMapper(UserMapper.class);
User user = new User();
user.setUid("1");
user.setUsername("jack");
user.setPassword("1234");
user.setName("杰克");
user.setEmail("itcast_lt@163.com");
user.setBirthday(new Date());
user.setSex("男");
user.setSex("0");
Integer result = userMapper.insert(user);
System.out.println(result);
MyBatisUtils.commitAndclose();
}
}
4.API詳解
4.1 核心組態檔詳解
? 在實際開發中,開發者會事先準備好組態檔模板,然后把模板Copy到專案中,再去修改重要的配置引數即可,這樣開發者就無需把組態檔的結構背下來,但是開發者還是需要能夠讀懂組態檔的,下面我們來學習MyBatis核心組態檔,

4.1.1 根標簽:<configuration>
-
配置子標簽時,多個標簽之間有先后順序,使用時一定要注意,
-
如下就是常用4個標簽的使用順序:
<?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></properties> <typeAliases></typeAliases> <environments></environments> <mappers></mappers> </configuration> -
常見子標簽介紹
| 標簽名稱 | 描述 |
|---|---|
| properties | 屬性配置,也可引入外部properties檔案 |
| settings | 系統引數配置,所有引數都有默認值,通常不用配置 |
| typeAliases | 型別別名,簡化開發,僅減少類完全限定名的冗余,用于xml開發, |
| plugins | 插件,用于添加擴展功能, |
| environments | 環境配置,提供給factory配置資訊 |
| mappers | 映射器,確定SQL陳述句的位置 |
4.1.2 屬性:<properties>
? 將易于修改的配置內容抽取到properties中,方便統一管理,mybatis提供兩種方式來維護properties:property標簽和properties組態檔,
方式1:property標簽
-
1)配置:將需要的內容配置在
<property name="標識" value="值"/><properties> <property name="jdbc.driver" value="com.mysql.cj.jdbc.Driver"/> <property name="jdbc.url" value="jdbc:mysql://localhost:3306/ssm_db1"/> <property name="jdbc.username" value="root"/> <property name="jdbc.password" value="1234"/> </properties> -
2)使用:在組態檔的其他位置,通過
${標識}方式獲得內容<!-- 使用連接池 --> <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> -
整體示意圖

方式2:properties組態檔
? 在實際開發中,我們常見資料庫的配置資訊存放到properties檔案,mybatis也提供了對組態檔的支持,
-
1)添加 db.properties組態檔
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssm_db1 jdbc.username=root jdbc.password=1234 -
2)加載properties檔案,修改核心組態檔
<properties resource="db.properties" /> -
整體示意圖

注意事項
- properties組態檔加載的內容,將覆寫<property>標簽配置的內容,
- 先加載<property>標簽配置的內容
- 再加載 resource指定的properties組態檔配置的內容,也就是后者覆寫了前者,
<!--最后url的值為 db.properties配置的內容 -->
<properties resource="db.properties" >
<property name="jdbc.url" value="jdbc:mysql://localhost:3306/ssm_db2"/>
</properties>
<!-- 【開發中不建議混搭使用】 -->
4.1.3 設定:<settings>
-
mybatis框架系統配置settings,用于改變 MyBatis 的運行時行為,
-
mybatis提供可多種設定,用于系統的優化,
| 設定引數 | 描述 | 有效值 | 默認值 |
|---|---|---|---|
| mapUnderscoreToCamelCase | 是否開啟自動駝峰命名規則映射, 即從經典資料庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的類似映射, | true | false | false |
| autoMappingBehavior | 指定 MyBatis 是否以及如何自動映射指定的列到欄位或屬性, NONE 表示取消自動映射; PARTIAL 只會自動映射沒有定義嵌套結果集映射的結果集, FULL 會自動映射任意復雜的結果集 | NONE, PARTIAL, FULL | PARTIAL |
| useGeneratedKeys | 允許 JDBC 支持自動生成主鍵,需要驅動兼容, | true | false | false |
| useColumnLabel | 使用列標簽代替列名, | true | false | true |
| cacheEnabled | 該配置影響的所有映射器中配置的快取的全域開關, | true | false | true |
| lazyLoadingEnabled | 延遲加載的全域開關, | true | false | false |
- 駝峰命名設定
<settings>
<!-- java物件屬性駝峰,對應資料的下劃線 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
4.1.4 環境:<environments>
-
MyBatis通過環境environments來配置資料庫的連接和事務管理,
-
確定使用哪個配置
<!-- default用于確定當前環境使用哪個配置 <environment id=””>用于提供一套配置方案,id的值提供給default使用, --> <environments default="配置2"> <environment id="配置1"> </environment> <environment id="配置2"> </environment> </environments> -
配置內容
<!-- <transactionManager> 用于配置事務管理方案 type:用于確定管理事務具體方案,取值:JDBC、MANAGED JDBC,jdbc底層事務管理,commit提交,rollback回顧, MANAGED,交予其他框架管理,自己不做事務操作,僅關閉連接, <dataSource>用于配置連接池(多個連接的池子) type:用于確定管理連接的方案,取值:POOLED、UNPOOLED、JNDI POOLED:通過連接池,管理連接創建和銷毀, UNPOOLED:不使用連接池,每一次都創建和銷毀連接, JNDI:將連接池存放到JNDI中, --> <environment id="development"> <!-- 使用jdbc管理事務 --> <transactionManager type="JDBC"></transactionManager> <!-- 配置資料源(配置連接) --> <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> -
擴展(查看原始碼,可以確定 type 配置內容)
-
事務的配置項

-
連接池的配置項

-
MANAGED 不管事務,只關閉連接

-
4.1.5 映射器:<mappers>
-
加載指定包package所有的介面,
<!-- 映射檔案 --> <mappers> <package name="com.czxy.ssm.mapper"/> </mappers>
4.2 輸入:vo 條件查詢
? 在開發中,一個物件的查詢條件,比物件中封裝的屬性更多,例如:user有birthday,我們需要查詢2010-2020年的資料,時間段beginTime、endTime在User物件中就沒有提供屬性,實際開發中,一般提供一個自定義物件,例如:UserVo,
-
1)撰寫vo
package com.czxy.ssm.vo; /** * @author manor的大資料之路 * */ public class UserVo { private String beginTime; // 開始時間 private String endTime; // 結束時間 public UserVo() { } public UserVo(String beginTime, String endTime) { this.beginTime = beginTime; this.endTime = endTime; } public String getBeginTime() { return beginTime; } public void setBeginTime(String beginTime) { this.beginTime = beginTime; } public String getEndTime() { return endTime; } public void setEndTime(String endTime) { this.endTime = endTime; } } -
2)修改Mapper,添加 condition 方法

/** * 條件查詢 * @param userVo * @return */ @Select("select * from user where birthday >= #{beginTime} and birthday <= #{endTime}") public List<User> condition(UserVo userVo); -
3)測驗類
package com.czxy.ssm.test; import com.czxy.ssm.domain.User; import com.czxy.ssm.mapper.UserMapper; import com.czxy.ssm.utils.MyBatisUtils; import com.czxy.ssm.vo.UserVo; import java.util.Date; import java.util.List; /** * @author manor的大資料之路 * */ public class Test07_Condition { public static void main(String[] args) { UserMapper userMapper = MyBatisUtils.getMapper(UserMapper.class); List<User> list = userMapper.condition(new UserVo("2010-01-01", "2021-01-01")); // 列印 list.forEach(user -> { System.out.println(user); }); MyBatisUtils.commitAndclose(); } }
4.3 輸出:結果集映射Result
實際開發中,如果資料庫欄位和Java物件欄位不能對應,就需要我們撰寫對應關系,
| 注解 | 描述 |
|---|---|
| @Results | 物件和表的映射關系, |
| @Result | 一個物件屬性和一個表的欄位的映射關系, |
| @ResultMap | 映射關系,使用@Results宣告的映射關系, |
4.3.1 基本使用
- 語法
/**
@Results(value = 一組Result )
*/
@Results(value = {
@Result(property = "屬性名", column = "欄位名", id = true),
@Result(property = "屬性名2", column = "欄位名2"),
@Result(property = "屬性名3", column = "欄位名3")
})
- 基本使用
/**
* 查詢所有
* @return
*/
@Select("select * from user")
@Results({
@Result(property = "uid", column = "uid", id = true),
@Result(property = "username", column = "username"),
@Result(property = "password", column = "password")
})
public List<User> selectAll();
4.3.2 重復使用
-
語法
@Select(...) @Results(id = "標識", value = {...}) public 回傳值 方法名(); @Select(...) @ResultMap("標識") public 回傳值 方法名2(); -
使用
/** * 查詢所有 * @return */ @Select("select * from user") @Results(id = "userResult", value = { @Result(property = "uid", column = "uid", id = true), @Result(property = "username", column = "username"), @Result(property = "password", column = "password") }) public List<User> selectAll(); /** * 通過id查詢詳情 * @param uid * @return */ @Select("select * from user where uid = #{uid}") @ResultMap("userResult") public User selectById(@Param("uid") String uid);
4.4 已有注解總結
| 注解名稱 | 描述 |
|---|---|
| @Insert | 添加sql |
| @Update | 更新sql |
| @Delete | 洗掉sql |
| @Select | 查詢sql |
| @Param | 形參命名 |
| @Results | 物件和表的映射關系, |
| @Result | 一個物件屬性和一個表的欄位的映射關系, |
5. 關聯查詢:一對多
5.1 用戶和訂單資料模型
5.1.1 表關系

CREATE TABLE `orders` (
`oid` VARCHAR(32) PRIMARY KEY NOT NULL,
`ordertime` DATETIME DEFAULT NULL, #下單時間
`total_price` DOUBLE DEFAULT NULL, #總價
`state` INT(11) DEFAULT NULL, #訂單狀態:1=未付款;2=已付款,未發貨;3=已發貨,沒識訓;4=識訓,訂單結束
`address` VARCHAR(30) DEFAULT NULL, #識訓地址
`name` VARCHAR(20) DEFAULT NULL, #識訓人
`telephone` VARCHAR(20) DEFAULT NULL, #識訓人電話
`uid` VARCHAR(32) DEFAULT NULL,
CONSTRAINT `order_fk_0001` FOREIGN KEY (`uid`) REFERENCES `user` (`uid`)
) ;
INSERT INTO `orders` VALUES ('x001','2010-10-10',10,1,'江蘇','張三','12345','u001');
INSERT INTO `orders` VALUES ('x002','2010-11-11',20,2,'河北','李四','67890','u001');
INSERT INTO `orders` VALUES ('x003','2011-10-10',30,3,'山西','王五','66666','u002')
5.1.2 JavaBean
- 默認情況下,兩個JavaBean沒有關系

package com.czxy.ssm.domain;
import java.util.Date;
/**
*
Create Table
CREATE TABLE `orders` (
`oid` varchar(32) NOT NULL,
`ordertime` datetime DEFAULT NULL,
`total` double DEFAULT NULL,
`state` int(11) DEFAULT NULL,
`address` varchar(30) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`telephone` varchar(20) DEFAULT NULL,
`uid` varchar(32) DEFAULT NULL,
PRIMARY KEY (`oid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
*/
public class Order {
private String oid; // 訂單編號
private Date ordertime; // 下單時間
private Double total; // 訂單總金額
private Integer state; // 訂單狀態 0 未支付 1 已支付 2已發貨 3已識訓
private String address; // 識訓人地址
private String name; // 識訓人姓名
private String telephone; // 識訓人電話
private String uid;
@Override
public String toString() {
return "Order{" +
"oid='" + oid + '\'' +
", ordertime=" + ordertime +
", total=" + total +
", state=" + state +
", address='" + address + '\'' +
", name='" + name + '\'' +
", telephone='" + telephone + '\'' +
", uid='" + uid + '\'' +
'}';
}
public String getOid() {
return oid;
}
public void setOid(String oid) {
this.oid = oid;
}
public Date getOrdertime() {
return ordertime;
}
public void setOrdertime(Date ordertime) {
this.ordertime = ordertime;
}
public Double getTotal() {
return total;
}
public void setTotal(Double total) {
this.total = total;
}
public Integer getState() {
return state;
}
public void setState(Integer state) {
this.state = state;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public Order(String oid, Date ordertime, Double total, Integer state, String address, String name, String telephone, String uid) {
this.oid = oid;
this.ordertime = ordertime;
this.total = total;
this.state = state;
this.address = address;
this.name = name;
this.telephone = telephone;
this.uid = uid;
}
public Order() {
}
}
5.1.3 JavaBean關系
- 以物件的方法,描述兩個JavaBean之間的關系

-
JavaBean:User
public class User { private String uid; private String username; private String password; private String name; private String email; private Date birthday; private String sex; private Integer state; private String code; // 一對多:一個用戶 擁有【多個用戶】 private List<Order> orderList = new ArrayList<>(); // ... } -
JavaBean:Order
public class Order { private String oid; // 訂單編號 private Date ordertime; // 下單時間 private Double total; // 訂單總金額 private Integer state; // 訂單狀態 0 未支付 1 已支付 2已發貨 3已識訓 private String address; // 識訓人地址 private String name; // 識訓人姓名 private String telephone; // 識訓人電話 private String uid; // 多對一, 多個訂單 屬于 【一個用戶】 private User user; // ... }
5.2 一對多
5.2.1 語法
在Mybatis注解開發中,需要通過@Result進行關聯關系的描述,
- 一對多:需要使用many屬性和@Many注解,
@Result(
property = "1表JavaBean屬性名",
column = "1表欄位名",
many = @Many(select = "多表Mapper的方法簽名")
)
5.2.2 需求&分析
- 需求:查詢用戶的同時,查詢每個用戶對應的訂單
- 分析:
- 修改OrderMapper,完成通過uid查詢所有的訂單
- 修改UserMapper,完成查詢用戶資訊時,查詢對應的訂單
5.2.3 訂單功能:通過uid查詢所有的訂單

package com.czxy.ssm.mapper;
import com.czxy.ssm.domain.Order;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
/**
* @author manor的大資料之路
*
*/
public interface OrderMapper {
/**
* 通過id查詢詳情
* @param uid
* @return
*/
@Select("select * from orders where uid = #{uid}")
public Order findOrdersByUserId(@Param("uid") String uid) ;
}
5.2.4 用戶功能:關聯查詢
public interface UserMapper {
/**
* 查詢所有
* @return
*/
@Select("select * from user")
@Results(id = "userResult", value = {
@Result(property = "uid", column = "uid", id = true),
@Result(property = "username", column = "username"),
@Result(property = "password", column = "password"),
@Result(property="orderList" , many=@Many(select="com.czxy.ssm.mapper.OrderMapper.findOrdersByUserId"), column="uid")
})
public List<User> selectAll();
}
5.3 多對一
5.3.1 語法
在Mybatis注解開發中,需要通過@Result進行關聯關系的描述,
- 多對一:需要使用one屬性和@One注解
@Result(
property = "多表JavaBean屬性名",
column = "多表欄位名",
one = @One(select ="1表Mapper的方法簽名")
)
5.3.2 需求&分析
-
需求:查詢訂單時,查詢關聯的用戶資訊
-
分析:
1)通過user_id查詢用戶詳情
2)通過id查詢訂單詳情
5.4.3 用戶功能:通過id查詢用戶詳情(已有)

/**
* 通過id查詢詳情
* @param uid
* @return
*/
@Select("select * from user where uid = #{uid}")
@ResultMap("userResult")
public User selectById(@Param("uid") String uid);
5.4.4 訂單功能:通過id查詢訂單詳情

/**
*
* @param id
* @return
*/
@Select("select * from orders where oid = #{oid}")
@Results({
@Result(property="oid" , column="oid"),
@Result(property="ordertime" , column="ordertime"),
@Result(property="total" , column="total"),
@Result(property="state" , column="state"),
@Result(property="address" , column="address"),
@Result(property="name" , column="name"),
@Result(property="telephone" , column="telephone"),
@Result(property="uid" , column="uid"),
@Result(property="user" , one=@One(select="com.czxy.ssm.mapper.UserMapper.selectById") , column="uid"),
})
public Order selectById(@Param("oid") String id);
6.關聯查詢:多對多
6.1 學生和老師資料模型
6.1.1 表間關系

#老師表
CREATE TABLE teacher(
tid INT PRIMARY KEY,
NAME VARCHAR(50)
);
#學生表
CREATE TABLE student(
sid INT PRIMARY KEY,
NAME VARCHAR(50)
);
#中間表
CREATE TABLE teacher_student(
teacher_id INT ,
student_id INT,
CONSTRAINT ts_t_fk FOREIGN KEY (teacher_id) REFERENCES teacher(tid),
CONSTRAINT ts_s_fk FOREIGN KEY (student_id) REFERENCES student(sid)
);
INSERT INTO teacher VALUES (1,'肖老師');
INSERT INTO teacher VALUES (2,'馬老師');
INSERT INTO student VALUES (1,'張三');
INSERT INTO student VALUES (2,'李四');
INSERT INTO student VALUES (3,'王五');
INSERT INTO teacher_student VALUES (1,1);
INSERT INTO teacher_student VALUES (1,2);
INSERT INTO teacher_student VALUES (1,3);
INSERT INTO teacher_student VALUES (2,1);
INSERT INTO teacher_student VALUES (2,2);
6.1.2 JavaBean及其關系

-
JavaBean:Student
package com.czxy.ssm.domain; import java.util.ArrayList; import java.util.List; /** * #學生表 * CREATE TABLE student( * sid INT PRIMARY KEY, * NAME VARCHAR(50) * ); * @author manor的大資料之路 * */ public class Student { private Integer sid; private String name; private List<Teacher> teacherList = new ArrayList<>(); public Integer getSid() { return sid; } public void setSid(Integer sid) { this.sid = sid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Teacher> getTeacherList() { return teacherList; } public void setTeacherList(List<Teacher> teacherList) { this.teacherList = teacherList; } @Override public String toString() { return "Student{" + "sid=" + sid + ", name='" + name + '\'' + ", teacherList=" + teacherList + '}'; } } -
JavaBean:Teacher
package com.czxy.ssm.domain; import java.util.ArrayList; import java.util.List; /** * #老師表 * CREATE TABLE teacher( * tid INT PRIMARY KEY, * NAME VARCHAR(50) * ); * @author manor的大資料之路 * */ public class Teacher { private Integer tid; private String name; private List<Student> studentList = new ArrayList<>(); public Integer getTid() { return tid; } public void setTid(Integer tid) { this.tid = tid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Student> getStudentList() { return studentList; } public void setStudentList(List<Student> studentList) { this.studentList = studentList; } @Override public String toString() { return "Teacher{" + "tid=" + tid + ", name='" + name + '\'' + ", studentList=" + studentList + '}'; } }
6.2 多對多:老師–>學生
- 需要根據老師tid查詢中間表中,對應的所有學生id

6.2.1 student 映射
package com.czxy.ssm.mapper;
import com.czxy.ssm.domain.Student;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
/**
* @author manor的大資料之路
*
*/
public interface StudentMapper {
/**
* 通過tid查詢對應的學生
* @param tid
* @return
* @throws Exception
*/
@Select("select * from student s where s.sid in (select student_id from teacher_student where teacher_id = #{tid} )")
public Student findStudentByTeacherId(@Param("tid") Integer tid) throws Exception;
}
6.2.2 teacher 映射
package com.czxy.ssm.mapper;
import com.czxy.ssm.domain.Teacher;
import org.apache.ibatis.annotations.*;
/**
* @author manor的大資料之路
*
*/
public interface TeacherMapper {
@Select("select * from teacher t where t.tid = #{tid}")
@Results({
@Result(property="tid" , column="tid"),
@Result(property="name" , column="name"),
@Result(property="studentList" , many=@Many(select="com.czxy.ssm.mapper.StudentMapper.findStudentByTeacherId") , column="tid"),
})
public Teacher selectById(@Param("tid") Integer tid);
}
6.2.3 測驗
package com.czxy.ssm.test;
import com.czxy.ssm.domain.Order;
import com.czxy.ssm.domain.Teacher;
import com.czxy.ssm.mapper.OrderMapper;
import com.czxy.ssm.mapper.TeacherMapper;
import com.czxy.ssm.utils.MyBatisUtils;
/**
* @author manor的大資料之路
*
*/
public class Test09_SelectTeacher {
public static void main(String[] args) {
TeacherMapper teacherMapper = MyBatisUtils.getMapper(TeacherMapper.class);
Teacher teacher = teacherMapper.selectById(1);
// 列印
System.out.println(teacher);
MyBatisUtils.commitAndclose();
}
}
6.2.4 鞏固練習
-
查詢所有的老師,并查詢老師對應的學生,
package com.czxy.ssm.mapper; import com.czxy.ssm.domain.Teacher; import org.apache.ibatis.annotations.*; import java.util.List; /** * @author manor的大資料之路 * */ public interface TeacherMapper { /** * 通過id查詢詳情 * @param tid * @return */ @Select("select * from teacher t where t.tid = #{tid}") @Results(id = "teacherResult" , value = { @Result(property="tid" , column="tid"), @Result(property="name" , column="name"), @Result(property="studentList" , many=@Many(select="com.czxy.ssm.mapper.StudentMapper.findStudentByTeacherId") , column="tid"), }) public Teacher selectById(@Param("tid") Integer tid); /** * 查詢所有 * @return */ @Select("select * from teacher") @ResultMap("teacherResult") public List<Teacher> selectList(); } -
測驗類
package com.czxy.ssm.test; import com.czxy.ssm.domain.Teacher; import com.czxy.ssm.mapper.TeacherMapper; import com.czxy.ssm.utils.MyBatisUtils; import java.util.List; /** * @author manor的大資料之路 * */ public class Test10_SelectAllTeacher { public static void main(String[] args) { TeacherMapper teacherMapper = MyBatisUtils.getMapper(TeacherMapper.class); List<Teacher> teacherList = teacherMapper.selectList(); // 列印 teacherList.forEach(teacher -> { System.out.println(teacher); }); MyBatisUtils.commitAndclose(); } }
7.分頁查詢
MyBatis沒有提供分頁支持,需要自己撰寫limit陳述句,
開發中我們采用PageHelper插件,
7.1 搭建環境
7.1.1 匯入jar包

7.1.2 添加插件

<!-- 插件 -->
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<!-- 方言 -->
<property name="dialect" value="mysql"/>
<!-- 設定為true時,使用RowBounds分頁會進行count查詢 -->
<property name="rowBoundsWithCount" value="true"/>
</plugin>
</plugins>
7.2 語法
1) 設定分頁資料
PageHelper.startPage(int pageNum, int pageSize)
引數1:pageNum 第幾頁
引數2:pageSize 頁面顯示個數
2) 封裝分頁結果 PageInfo
new PageInfo(查詢結果) //創建分頁物件
pageInfo.getTotal(), //自動查詢總條數
pageInfo.getPages(), //總分頁數
7.3 使用
package com.czxy.ssm.test;
import com.czxy.ssm.domain.Teacher;
import com.czxy.ssm.domain.User;
import com.czxy.ssm.mapper.TeacherMapper;
import com.czxy.ssm.mapper.UserMapper;
import com.czxy.ssm.utils.MyBatisUtils;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import java.util.List;
/**
* @author manor的大資料之路
*
*/
public class Test11_Page {
public static void main(String[] args) {
UserMapper userMapper = MyBatisUtils.getMapper(UserMapper.class);
// 設定分頁 **
PageHelper.startPage(1,2);
// 查詢
List<User> users = userMapper.selectAll();
// 獲得封裝物件 **
PageInfo<User> pageInfo = new PageInfo<>(users);
// 列印分頁資訊
long total = pageInfo.getTotal();
List<User> list = pageInfo.getList();
System.out.println("總條數:" + total);
System.out.println("分頁資料:");
list.forEach(user -> {
System.out.println(user);
});
MyBatisUtils.commitAndclose();
}
}
8. 通用Mapper
8.1 概述
-
通用Mapper對MyBatis進行簡化的第三方工具包,
-
通用Mapper提供了一個名為
Mapper<T>的介面,用于自動完成單表的增刪改查操作,
public interface UserMapper extends Mapper<User> {
}
- 如果通用Mapper中的方法不足以滿足你的需求,直接添加自定義方法即可,
8.2 搭建環境
8.2.1 匯入jar

8.2.2 修改工具類
- 添加內容從官方檔案中拷貝
package com.czxy.ssm.utils;
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 tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;
import tk.mybatis.mapper.entity.Config;
import tk.mybatis.mapper.mapperhelper.MapperHelper;
import java.io.InputStream;
/**
* @author manor的大資料之路
*
*/
public class MyBatisUtils {
// 會話工廠
private static SqlSessionFactory factory;
static{
try {
// 1.1 加載核心組態檔
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
// 1.2 獲得工廠
factory = new SqlSessionFactoryBuilder().build(is);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static ThreadLocal<SqlSession> local = new ThreadLocal<>();
/**
* 獲得新會話
* @return
*/
private static SqlSession openSession(){
SqlSession sqlSession = local.get();
if(sqlSession == null){
sqlSession = factory.openSession();
//創建一個MapperHelper
MapperHelper mapperHelper = new MapperHelper();
//特殊配置
Config config = new Config();
// 設定UUID生成策略
// 配置UUID生成策略需要使用OGNL運算式
// 默認值32位長度:@java.util.UUID@randomUUID().toString().replace("-", "")
//config.setUUID("");
// 主鍵自增回寫方法,默認值MYSQL,詳細說明請看檔案
// config.setIDENTITY("HSQLDB");
// 支持方法上的注解
// 3.3.1版本增加
config.setEnableMethodAnnotation(true);
config.setNotEmpty(true);
// 序列的獲取規則,使用{num}格式化引數,默認值為{0}.nextval,針對Oracle
// 可選引數一共3個,對應0,1,2,分別為SequenceName,ColumnName, PropertyName
//config.setSeqFormat("NEXT VALUE FOR {0}");
// 設定全域的catalog,默認為空,如果設定了值,操作表時的sql會是catalog.tablename
//config.setCatalog("");
// 設定全域的schema,默認為空,如果設定了值,操作表時的sql會是schema.tablename
// 如果同時設定了catalog,優先使用catalog.tablename
//config.setSchema("");
// 主鍵自增回寫方法執行順序,默認AFTER,可選值為(BEFORE|AFTER)
//config.setOrder("AFTER");
//設定配置
mapperHelper.setConfig(config);
// 注冊通用tk.mybatis.mapper.common.Mapper介面 - 可以自動注冊繼承的介面
mapperHelper.registerMapper(Mapper.class);
mapperHelper.registerMapper(MySqlMapper.class);
// mapperHelper.registerMapper(SqlServerMapper.class);
// mapperHelper.registerMapper(IdsMapper.class);
//配置完成后,執行下面的操作
mapperHelper.processConfiguration(sqlSession.getConfiguration());
local.set(sqlSession);
}
return sqlSession;
}
/**
* 獲得mapper
* @param clazz
* @return
*/
public static <T> T getMapper(Class<T> clazz){
return openSession().getMapper(clazz);
}
/**
* 釋放資源
*/
public static void close() {
SqlSession sqlSession = openSession();
if(sqlSession != null){
sqlSession.close();
}
}
/**
* 提交并釋放資源
*/
public static void commitAndclose() {
SqlSession sqlSession = openSession();
if(sqlSession != null){
sqlSession.commit();
close();
}
}
/**
* 回滾并釋放資源
*/
public static void rollbackAndclose() {
SqlSession sqlSession = openSession();
if(sqlSession != null){
sqlSession.rollback();
close();
}
}
}
8.3 撰寫Mapper
- 撰寫介面,繼承tk.mybatis.mapper.common.Mapper介面即可
- 注意:Mapper介面以tk開頭
package com.czxy.ssm.mapper;
import com.czxy.ssm.domain.User;
import tk.mybatis.mapper.common.Mapper;
/**
* @author manor的大資料之路
*
*/
public interface UserMapper2 extends Mapper<User> {
}
8.4 通用API
-
查詢方法
方法名 描述 T selectOne(T t) 根據物體中的屬性進行查詢,只能有一個回傳值,有多個結果是拋出例外,查詢條件使用等號 List select(T t) 根據物體中的屬性值進行查詢,查詢條件使用等號 List selectAll() 查詢全部結果 int selectCount(T t) 根據物體中的屬性查詢總數,查詢條件,使用等號 T selectByPrimaryKey(Object key) 根據主鍵欄位進行查詢 boolean existsWhithPrimaryKey(Object key) 根據主鍵欄位查詢記錄是否存在 List selectByExample(Object example) 根據Example條件進行查詢 T selectOneByExample(Object example) 根據Example條件進行查詢,只能有一個回傳值 int selectCountByExample(Object example) 根據Example條件進行查詢記錄數 -
插入方法
方法名 描述 int insert(T t) 保存一個物體,null的屬性也會保存,不會使用資料庫默認值 int intsertSelective(T t) 保存一個物體,null的屬性不會保存,使用資料庫默認值 -
更新方法
方法名 描述 int updateByPrimaryKey(T t) 根據主鍵更新物體全部欄位,null值會被更新 int updateByPrimaryKeySelective(T t) 根據主鍵更新物體中不為null值的欄位 -
洗掉方法
方法名 描述 int delete(T t) 根據物體屬性作為條件進行洗掉,查詢條件使用等號 int deletePrimaryKey(Object key) 根據主鍵欄位進行洗掉 int deleteByExample(Object example) 根據Example條件洗掉資料
8.4.1 通過主鍵查詢
-
1)確定主鍵,否則所有欄位都是主鍵

-
2)測驗
package com.czxy.ssm.test; import com.czxy.ssm.domain.User; import com.czxy.ssm.mapper.UserMapper; import com.czxy.ssm.mapper.UserMapper2; import com.czxy.ssm.utils.MyBatisUtils; import org.junit.Test; import java.io.IOException; import java.util.List; /** * @author manor的大資料之路 * */ public class Test13_Mapper { @Test public void testSelectByPrimaryKey() { UserMapper2 userMapper2 = MyBatisUtils.getMapper(UserMapper2.class); User user = userMapper2.selectByPrimaryKey("1"); System.out.println(user); MyBatisUtils.commitAndclose(); } }
8.4.2 查詢所有
@Test
public void testSelectAll() {
UserMapper2 userMapper2 = MyBatisUtils.getMapper(UserMapper2.class);
List<User> list = userMapper2.selectAll();
// 列印
list.forEach(System.out::println);
MyBatisUtils.commitAndclose();
}
8.4.3 添加
@Test
public void testInsert() {
UserMapper2 userMapper2 = MyBatisUtils.getMapper(UserMapper2.class);
User user = new User();
user.setUid("2");
user.setUsername("jack");
user.setPassword("1234");
user.setName("杰克");
user.setEmail("itcast_lt@163.com");
user.setBirthday(new Date());
user.setSex("男");
user.setSex("0");
int result = userMapper2.insert(user);
// 列印
System.out.println(result);
MyBatisUtils.commitAndclose();
}
8.4.4 修改
@Test
public void testUpdate() {
UserMapper2 userMapper2 = MyBatisUtils.getMapper(UserMapper2.class);
User user = new User();
user.setUid("2");
user.setUsername("jack");
user.setPassword("1234");
user.setName("杰克");
user.setEmail("itcast_lt@163.com");
user.setBirthday(new Date());
user.setSex("男");
user.setSex("0");
int result = userMapper2.updateByPrimaryKey(user);
// 列印
System.out.println(result);
MyBatisUtils.commitAndclose();
}
8.4.5 洗掉
@Test
public void testDelete() {
UserMapper2 userMapper2 = MyBatisUtils.getMapper(UserMapper2.class);
int result = userMapper2.deleteByPrimaryKey("2");
// 列印
System.out.println(result);
MyBatisUtils.commitAndclose();
}
8.4.6 多條件查詢
- 語法:
// 獲得多條件物件
Example example = new Example(物件.class);
Example.Criteria criteria = example.createCriteria();
// 常見條件方法
andLike() //模糊查詢
andEqualTo() //等值查詢
andLessThanOrEqualTo() //<=查詢
andGreaterThanOrEqualTo() //>=查詢
andBetween() //區間查詢
@Test
public void testCondition() {
UserMapper2 userMapper2 = MyBatisUtils.getMapper(UserMapper2.class);
Example example = new Example(User.class);
Example.Criteria criteria = example.createCriteria();
criteria.andLike("name", "%王%");
criteria.andEqualTo("sex", "男");
List<User> list = userMapper2.selectByExample(example);
for (User user : list) {
System.out.println(user);
}
MyBatisUtils.commitAndclose();
}
9. 基于XML
9.1 搭建環境
9.1.1 創建專案
- 1)選擇Web 應用

- 2)創建專案mybatis-demo02

9.1.2 添加jar包

9.1.3 拷貝配置類

9.1.4 拷貝工具類

9.1.5 拷貝JavaBean

9.2 入門案例:查詢所有
9.2.1 撰寫流程
-
步驟1:撰寫Dao介面,用于確定方法名稱
-
步驟2:撰寫Mapper.xml檔案,用于撰寫SQL陳述句
-
步驟3:撰寫SqlMapConfig.xml 核心組態檔,并添加mapper xml檔案
-
步驟4:測驗
9.2.2 撰寫Mapper介面

package com.czxy.ssm.mapper;
import com.czxy.ssm.domain.User;
/**
* @author manor的大資料之路
*
*/
public interface UserMapper {
/**
* 通過id查詢詳情
* @param uid
* @return
*/
public User selectById(String uid);
}
9.2.3 撰寫Mapper 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.czxy.ssm.mapper.UserMapper">
<select id="selectById" parameterType="string" resultType="com.czxy.ssm.domain.User">
select * from user where uid = #{id}
</select>
</mapper>
9.2.4 修改核心組態檔
- 核心組態檔 <mapper resource=""/> 用于確定mapper組態檔的位置

<mappers>
<!-- 表示加載此包下的所有dao介面-->
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
9.2.5 測驗類

package com.czxy.ssm.test;
import com.czxy.ssm.domain.User;
import com.czxy.ssm.mapper.UserMapper;
import com.czxy.ssm.utils.MyBatisUtils;
import org.junit.Test;
/**
* @author manor的大資料之路
*
*/
public class TestUserMapper {
@Test
public void testSelectById() {
UserMapper userMapper = MyBatisUtils.getMapper(UserMapper.class);
User user = userMapper.selectById("1");
System.out.println(user);
MyBatisUtils.commitAndclose();
}
}
9.3 組態檔詳解
9.3.1 Mapper基本結構
<?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="Mapper類">
<!-- 查詢 -->
<select id="方法名">SQL陳述句</select>
<!-- 添加 -->
<insert id="方法名">SQL陳述句</insert>
<!-- 更新 -->
<update id="方法名">SQL陳述句</update>
<!-- 洗掉 -->
<delete id="方法名">SQL陳述句</delete>
</mapper>
9.3.2 Mapper 引數型別:parameterType
- 在映射檔案mapper中,我們使用parameterType設定請求引數的型別
<?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="mapper類">
<select id="方法名" parameterType="引數型別">SQL陳述句</select>
</mapper>
-
簡單型別:
<!-- 通過id查詢 --> <select id="findUserById" parameterType="int" resultType="com.czxy.domain.User"> select * from user where uid = #{id} </select> -
POJO型別:
<!-- 添加用戶 --> <insert id="insertUser" parameterType="com.czxy.domain.User"> insert into user(uid, username, password, name, email, birthday, sex, state) values(#{uid},#{username},#{password},#{name},#{email},#{birthday},#{sex},#{state}) </insert>
9.3.3 Mapper 結果型別:resultType
- 在映射檔案mapper中,我們使用resultType設定查詢結果型別
<?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="mapper類">
<select id="方法名" resultType="結果型別">SQL陳述句</select>
</mapper>
-
簡單型別
<!-- 總記錄數 --> <select id="findUserCount" resultType="int"> select count(*) from user </select> -
POJO型別
<!-- 通過id查詢 --> <select id="findUserById" parameterType="int" resultType="com.czxy.domain.User"> select * from user where uid = #{id} </select>
9.3.4 Mapper 映射關系:ResultMap
-
resultType可以指定pojo將查詢結果封裝到該pojo中,但需要pojo的屬性名和sql查詢的列名保持一致,
-
如果sql查詢欄位名和pojo的屬性名不一致,可以通過resultMap將欄位名和屬性名作一個對應關系,
-
語法:
<!--宣告映射--> <resultMap type="JavaBean型別" id="resultMap名稱"> <id column="表列名" property="JavaBean屬性名"/> <!--用于配置主鍵的映射--> <result column="表列名" property="JavaBean屬性名"/> <!--用于配置普通結果集映射--> </resultMap> <!--使用映射--> <select resultMap="resultMap名稱"> </select> -
實體:
<resultMap type="com.czxy.ssm.domain.User" id="userResultMap"> <id column="uid" property="uid"/> <result column="username" property="username"/> </resultMap> <select id="selectById" parameterType="string" resultMap="userResultMap"> select * from user where uid = #{id} </select>
9.3.5 默認別名
| 別名 | 映射型別 |
|---|---|
| _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 |
| map | Map |
9.3.6 自定義別名
-
宣告別名,在 SqlMapConfig.xml 組態檔中宣告
-
方式1:一次定義一個類
<typeAliases> <typeAlias type="型別" alias="別名"/> </typeAliases> -
方式2:一次定義一個包下的所有類
<typeAliases> <package name="包名"/> </typeAliases>

-
-
使用別名,在mapper中直接使用
<!--使用別名--> <select id="selectById" parameterType="string" resultType="user"> select * from user where uid = #{id} </select>
9.3.7 加載Mapper檔案
-
在SqlMapConfig.xml檔案中,通過
<mappers>和<mapper>加載映射檔案 -
方式1:加載指定檔案
<mappers> <!-- 表示加載此包下的所有dao介面--> <mapper resource="mapper/UserMapper.xml"/> </mappers> -
方式2:加載指定包下的所有映射檔案
- 要求:要求mapper介面名稱和mapper映射檔案名稱相同,且放在同一個目錄中
<mappers> <package name="com.czxy.ssm.mapper"/> </mappers>
9.4 增刪改查
9.4.1 核心組態檔

9.4.2 mapper介面

package com.czxy.ssm.mapper;
import com.czxy.ssm.domain.User;
import com.czxy.ssm.vo.UserVo;
import org.apache.ibatis.annotations.*;
import java.util.List;
/**
* @author manor的大資料之路
*
*/
public interface UserMapper {
/**
* 通過id查詢詳情
* @param uid
* @return
*/
public User selectById(String uid);
/**
* 查詢所有
* @return
*/
public List<User> selectAll();
/**
* 模糊查詢
* @param name
* @return
*/
public List<User> selectByName(@Param("name") String name);
/**
* 插入資料
* @param user
*/
public Integer insert(User user);
/**
* 插入資料
* @param user
*/
public Integer updateByPrimaryKey(User user);
/**
* 通過id洗掉
* @param uid
*/
public Integer deleteByPrimaryKey(@Param("uid") String uid);
/**
* 條件查詢
* @param userVo
* @return
*/
public List<User> condition(UserVo userVo);
}
9.4.3 Mapper 映射檔案
<?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.czxy.ssm.mapper.UserMapper">
<resultMap type="com.czxy.ssm.domain.User" id="userResultMap">
<id column="uid" property="uid"/>
<result column="username" property="username"/>
</resultMap>
<select id="selectById" parameterType="string" resultMap="userResultMap">
select * from user where uid = #{id}
</select>
<select id="selectAll" parameterType="string" resultMap="userResultMap">
select * from user
</select>
<select id="selectByName" parameterType="string" resultMap="userResultMap">
select * from user where name like #{name}
</select>
<insert id="insert" parameterType="user">
insert into user(uid, username, password, name, email, birthday, sex, state) values(#{uid},#{username},#{password},#{name},#{email},#{birthday},#{sex},#{state})
</insert>
<update id="updateByPrimaryKey" parameterType="user">
update user set username=#{username}, password=#{password}, name=#{name}, email=#{email},birthday=#{birthday},sex=#{sex}, state=#{state} where uid=#{uid}
</update>
<delete id="deleteByPrimaryKey" >
delete from user where uid = #{uid}
</delete>
</mapper>
9.4.4 測驗
package com.czxy.ssm.test;
import com.czxy.ssm.domain.User;
import com.czxy.ssm.mapper.UserMapper;
import com.czxy.ssm.utils.MyBatisUtils;
import org.junit.Test;
import java.util.Date;
import java.util.List;
/**
* @author manor的大資料之路
*
*/
public class TestUserMapper {
@Test
public void testSelectById() {
UserMapper userMapper = MyBatisUtils.getMapper(UserMapper.class);
User user = userMapper.selectById("1");
System.out.println(user);
MyBatisUtils.commitAndclose();
}
@Test
public void testSelectAll() {
UserMapper UserMapper = MyBatisUtils.getMapper(UserMapper.class);
List<User> list = UserMapper.selectAll();
// 列印
list.forEach(System.out::println);
MyBatisUtils.commitAndclose();
}
@Test
public void testSelectByName() {
UserMapper UserMapper = MyBatisUtils.getMapper(UserMapper.class);
List<User> list = UserMapper.selectByName("%張%");
// 列印
list.forEach(System.out::println);
MyBatisUtils.commitAndclose();
}
@Test
public void testInsert() {
UserMapper UserMapper = MyBatisUtils.getMapper(UserMapper.class);
User user = new User();
user.setUid("2");
user.setUsername("jack");
user.setPassword("1234");
user.setName("杰克");
user.setEmail("itcast_lt@163.com");
user.setBirthday(new Date());
user.setSex("男");
user.setSex("0");
int result = UserMapper.insert(user);
// 列印
System.out.println(result);
MyBatisUtils.commitAndclose();
}
@Test
public void testUpdate() {
UserMapper UserMapper = MyBatisUtils.getMapper(UserMapper.class);
User user = new User();
user.setUid("2");
user.setUsername("jack");
user.setPassword("1234");
user.setName("杰克");
user.setEmail("itcast_lt@163.com");
user.setBirthday(new Date());
user.setSex("男");
user.setSex("0");
int result = UserMapper.updateByPrimaryKey(user);
// 列印
System.out.println(result);
MyBatisUtils.commitAndclose();
}
@Test
public void testDelete() {
UserMapper UserMapper = MyBatisUtils.getMapper(UserMapper.class);
int result = UserMapper.deleteByPrimaryKey("2");
// 列印
System.out.println(result);
MyBatisUtils.commitAndclose();
}
}
9.5 動態SQL
9.5.1 什么是動態SQL
動態SQL就是Mybatis允許在映射檔案中通過標簽控制SQL陳述句最后的拼湊結果,
9.5.2 <if>標簽
-
語法:在mapper映射檔案中,<if>標簽就相當于Java中if陳述句,如果條件成立,標簽體內的SQL陳述句有效,
<select> <if test="條件"> //有效的SQL陳述句片段 </if> <select> -
封裝物件:UserVo
public class UserVo { private String name; // 模糊查詢 private String beginTime; // 開始時間 private String endTime; // 結束時間 // ... } -
多條件查詢,拼湊恒等條件 where 1=1
<select id="condition" parameterType="userVo" resultType="user" > select * from user where 1=1 <if test="name != null and name != ''"> and name like '%${name}%' </if> </select> -
測驗
@Test public void testCondtion() { UserMapper UserMapper = MyBatisUtils.getMapper(UserMapper.class); UserVo userVo = new UserVo(); userVo.setName("張"); List<User> list = UserMapper.condition(userVo); // 列印 list.forEach(System.out::println); MyBatisUtils.commitAndclose(); }
9.5.3 <where>標簽
-
多條件查詢時,我們使用了一個小技巧“where 1=1”,mybatis提供了一個
<where>進行取代, -
修改映射檔案

<select id="condition" parameterType="userVo" resultType="user" > select * from user <where> <if test="name != null and name != ''"> and name like '%${name}%' </if> </where> </select>
9.5.4 <foreach>標簽
-
語法:
<!-- <foreach> 就是遍歷一組資料,根據指定的內容拼湊成SQL陳述句片段 collection ,需要遍歷的資料,如果實際引數就是陣列本身,此處需要使用array item ,每一次回圈時存放資料的變數,在標簽體中可以通過 ${item值}獲得遍歷資料 open ,SQL陳述句片段的開發位置 separator,分隔符號 close ,SQL陳述句片段的結束位置 --> <!-- 例如:uid in (1,2,4,6) 片段的拼湊 開始 (變數 分隔符)*4 結束 --> <foreach collection="陣列" open="uid in (" item="變數" separator="," close=")"> </foreach> -
封裝物件
public class UserVo { private List<String> ids = new ArrayList<>(); private String name; // 模糊查詢 private String beginTime; // 開始時間 private String endTime; // 結束時間 // ... } -
多條件查詢
<select id="condition" parameterType="userVo" resultType="user" > select * from user <where> <!-- uid in (1,2,4,6) --> <foreach collection="ids" open="uid in (" item="id" separator="," close=")"> '${id}' </foreach> </where> </select> -
測驗
@Test public void testCondtion() { UserMapper UserMapper = MyBatisUtils.getMapper(UserMapper.class); UserVo userVo = new UserVo(); userVo.setIds(Arrays.asList("u001","u002")); List<User> list = UserMapper.condition(userVo); // 列印 list.forEach(System.out::println); MyBatisUtils.commitAndclose(); }
9.5.5 <choose>標簽:多條件
- 語法
<select id="">
<choose>
<when test=""></when>
<when test=""></when>
<otherwise></otherwise>
</choose>
</select>
9.5.6 <sql>標簽
- MyBatis為我們提供了代碼片段,使用
<sql>定義公共SQL陳述句,使用<include>將需要的SQL片段拼湊到指定的位置,
<!-- 所有欄位名稱SQL片段 -->
<sql id="user_all_column">uid, username, password, name, email, birthday, sex, state</sql>
<select id="selectAll" parameterType="string" resultMap="userResultMap">
select <include refid="user_all_column" /> from user
</select>
9.6 關系映射:一對多
9.6.1 mapper介面
-
UserMapper,已有
public interface UserMapper { /** * 通過id查詢詳情 * @param uid * @return */ public User selectById(String uid); } -
OrderMapper
package com.czxy.ssm.mapper; import com.czxy.ssm.domain.Order; import org.apache.ibatis.annotations.Param; /** * @author manor的大資料之路 * */ public interface OrderMapper { /** * 查詢指定用戶的所有的訂單 * @param uid * @return */ public Order findOrdersByUserId(@Param("uid") Integer uid) ; }
9.6.2 Mapper 映射檔案
-
OrdersMapper.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.czxy.ssm.mapper.OrderMapper"> <select id="findOrdersByUserId" parameterType="string" resultType="order" > select * from orders where uid = #{uid} </select> </mapper> -
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.czxy.ssm.mapper.UserMapper"> <resultMap type="com.czxy.ssm.domain.User" id="userResultMap"> <id column="uid" property="uid"/> <result column="username" property="username"/> <collection property="orderList" column="uid" select="com.czxy.ssm.mapper.OrderMapper.findOrdersByUserId" /> </resultMap> <select id="selectById" parameterType="string" resultMap="userResultMap"> select * from user where uid = #{id} </select> </mapper>
9.6.3 核心組態檔

9.6.4 測驗
public class TestUserMapper {
@Test
public void testSelectById() {
UserMapper userMapper = MyBatisUtils.getMapper(UserMapper.class);
User user = userMapper.selectById("u001");
System.out.println(user);
MyBatisUtils.commitAndclose();
}
}
9.7 關系映射:多對一
9.7.1 mapper介面
package com.czxy.ssm.mapper;
import com.czxy.ssm.domain.Order;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author manor的大資料之路
*
*/
public interface OrderMapper {
/**
*
* @param oid
* @return
*/
public Order selectById(@Param("oid") String oid);
}
9.7.2 映射檔案:OrdersMapper.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.czxy.ssm.mapper.OrderMapper">
<resultMap id="ordersResultMap" type="order">
<id property="oid" column="oid"></id>
<result property="ordertime" column="ordertime" ></result>
<result property="total" column="total" ></result>
<result property="state" column="state" ></result>
<result property="address" column="address" ></result>
<result property="name" column="name" ></result>
<result property="telephone" column="telephone" ></result>
<result property="uid" column="uid" ></result>
<association property="user" select="com.czxy.ssm.mapper.UserMapper.selectById" column="uid" />
</resultMap>
<select id="selectById" resultMap="ordersResultMap">
select * from orders where oid = #{oid}
</select>
</mapper>
9.7.3 測驗類
package com.czxy.ssm.test;
import com.czxy.ssm.domain.Order;
import com.czxy.ssm.domain.User;
import com.czxy.ssm.mapper.OrderMapper;
import com.czxy.ssm.mapper.UserMapper;
import com.czxy.ssm.utils.MyBatisUtils;
import com.czxy.ssm.vo.UserVo;
import org.junit.Test;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
/**
* @author manor的大資料之路
*
*/
public class TestOrderMapper {
@Test
public void testSelectById() {
OrderMapper orderMapper = MyBatisUtils.getMapper(OrderMapper.class);
Order order = orderMapper.selectById("x001");
System.out.println(order);
MyBatisUtils.commitAndclose();
}
}
tis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.czxy.ssm.mapper.OrderMapper">
<select id="findOrdersByUserId" parameterType="string" resultType="order" >
select * from orders where uid = #{uid}
</select>
</mapper>
-
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.czxy.ssm.mapper.UserMapper"> <resultMap type="com.czxy.ssm.domain.User" id="userResultMap"> <id column="uid" property="uid"/> <result column="username" property="username"/> <collection property="orderList" column="uid" select="com.czxy.ssm.mapper.OrderMapper.findOrdersByUserId" /> </resultMap> <select id="selectById" parameterType="string" resultMap="userResultMap"> select * from user where uid = #{id} </select> </mapper>
9.6.3 核心組態檔
[外鏈圖片轉存中…(img-emp3n0Qt-1632570480007)]
9.6.4 測驗
public class TestUserMapper {
@Test
public void testSelectById() {
UserMapper userMapper = MyBatisUtils.getMapper(UserMapper.class);
User user = userMapper.selectById("u001");
System.out.println(user);
MyBatisUtils.commitAndclose();
}
}
9.7 關系映射:多對一
9.7.1 mapper介面
package com.czxy.ssm.mapper;
import com.czxy.ssm.domain.Order;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author manor的大資料之路
*
*/
public interface OrderMapper {
/**
*
* @param oid
* @return
*/
public Order selectById(@Param("oid") String oid);
}
9.7.2 映射檔案:OrdersMapper.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.czxy.ssm.mapper.OrderMapper">
<resultMap id="ordersResultMap" type="order">
<id property="oid" column="oid"></id>
<result property="ordertime" column="ordertime" ></result>
<result property="total" column="total" ></result>
<result property="state" column="state" ></result>
<result property="address" column="address" ></result>
<result property="name" column="name" ></result>
<result property="telephone" column="telephone" ></result>
<result property="uid" column="uid" ></result>
<association property="user" select="com.czxy.ssm.mapper.UserMapper.selectById" column="uid" />
</resultMap>
<select id="selectById" resultMap="ordersResultMap">
select * from orders where oid = #{oid}
</select>
</mapper>
9.7.3 測驗類
package com.czxy.ssm.test;
import com.czxy.ssm.domain.Order;
import com.czxy.ssm.domain.User;
import com.czxy.ssm.mapper.OrderMapper;
import com.czxy.ssm.mapper.UserMapper;
import com.czxy.ssm.utils.MyBatisUtils;
import com.czxy.ssm.vo.UserVo;
import org.junit.Test;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
/**
* @author manor的大資料之路
*
*/
public class TestOrderMapper {
@Test
public void testSelectById() {
OrderMapper orderMapper = MyBatisUtils.getMapper(OrderMapper.class);
Order order = orderMapper.selectById("x001");
System.out.println(order);
MyBatisUtils.commitAndclose();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/302999.html
標籤:其他
