主頁 >  其他 > ??爆肝六萬字最全總結Java資料庫編程MyBatis(建議收藏)

??爆肝六萬字最全總結Java資料庫編程MyBatis(建議收藏)

2021-09-26 12:30:38 其他

在這里插入圖片描述

前言

今天復習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、手動設定引數、結果集檢索及映射等繁雜的程序代碼,

image-20210720095805715

  • 歷史行程

    ? 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包

image-20210720100429509

1.3 與JDBC對比

  • JDBC撰寫DAO的步驟

    image-20210720100848189

  • MyBatis撰寫DAO的步驟

    image-20210720101026892

1.4 入門案例:搭建環境

1.4.1 構建專案

  • 1)創建新專案:Java --> Java EE --> Web Application

image-20210720101402733

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

image-20210720102340299

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

image-20210720102938138

  • 4)添加jar

image-20210720103009314

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

image-20210720104018907

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自動生成,并在測驗程式時自動執行,

image-20210720104245488

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

image-20210720104501947

  • 組態檔內容:
<?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 模糊查詢

image-20210720110922348

  • 功能介面中的方法

    • 如果引數簡單型別,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 插入資料

image-20210720112245191

  • 功能介面中的方法
    /**
     * 插入資料
     * @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 更新資料

image-20210720113540494

  • 功能介面中的方法
    /**
     * 插入資料
     * @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 洗掉資料

image-20210720113835328

  • 功能介面中的方法
    /**
     * 通過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陳述句

image-20210720115723948

3.1.2 整合日志

  • 1)添加jar包 (已添加)

    image-20210720115823376

  • 2)添加組態檔

    image-20210720153406467

# 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 拷貝工具類

  • 完成增刪改查的時候,我們發現有一些代碼大量重復,我們將提供工具類,對重復代碼進行簡化,

    image-20210720174410909

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 工具類原理分析

  • 工具類實作原理分析

image-20210720174052080

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核心組態檔,

image-20210720181532001

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>
    
  • 整體示意圖

image-20210720183034856

方式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" />
    
  • 整體示意圖

image-20210720183406195

注意事項

  • 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 | falsefalse
autoMappingBehavior指定 MyBatis 是否以及如何自動映射指定的列到欄位或屬性, NONE 表示取消自動映射; PARTIAL 只會自動映射沒有定義嵌套結果集映射的結果集, FULL 會自動映射任意復雜的結果集NONE, PARTIAL, FULLPARTIAL
useGeneratedKeys允許 JDBC 支持自動生成主鍵,需要驅動兼容,true | falsefalse
useColumnLabel使用列標簽代替列名,true | falsetrue
cacheEnabled該配置影響的所有映射器中配置的快取的全域開關,true | falsetrue
lazyLoadingEnabled延遲加載的全域開關,true | falsefalse
  • 駝峰命名設定
	<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 配置內容)

    1. 事務的配置項

      image-20210720184221903

    2. 連接池的配置項

      image-20210720184235536

    3. MANAGED 不管事務,只關閉連接

      image-20210720184248418

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 方法

    image-20210721100334133

        /**
         * 條件查詢
         * @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 表關系

image-20210721112640991

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沒有關系

image-20210721114058980

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之間的關系

image-20210721114451321

  • 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查詢所有的訂單

image-20210721115807048

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查詢用戶詳情(已有)

image-20210721143850814

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

5.4.4 訂單功能:通過id查詢訂單詳情

image-20210721143730694

    /**
     *
     * @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 表間關系

image-20210721145256539

#老師表
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及其關系

image-20210721145855505

  • 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

image-20210721155108930

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包

image-20210721161056976

7.1.2 添加插件

image-20210721161328679

	<!-- 插件 -->
	<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

image-20210721173357517

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)確定主鍵,否則所有欄位都是主鍵

    image-20210721173445273

  • 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 應用

image-20210721181052979

  • 2)創建專案mybatis-demo02

image-20210721181140709

9.1.2 添加jar包

image-20210721181735155

9.1.3 拷貝配置類

image-20210721181910319

9.1.4 拷貝工具類

image-20210721182024283

9.1.5 拷貝JavaBean

image-20210721182147874

9.2 入門案例:查詢所有

9.2.1 撰寫流程

  • 步驟1:撰寫Dao介面,用于確定方法名稱

  • 步驟2:撰寫Mapper.xml檔案,用于撰寫SQL陳述句

  • 步驟3:撰寫SqlMapConfig.xml 核心組態檔,并添加mapper xml檔案

  • 步驟4:測驗

9.2.2 撰寫Mapper介面

image-20210721183249994

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組態檔

image-20210721183325525

<?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組態檔的位置

image-20210721183634828

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

9.2.5 測驗類

image-20210721183708522

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 默認別名

別名映射型別
_bytebyte
_longlong
_shortshort
_intint
_integerint
_doubledouble
_floatfloat
_booleanboolean
stringString
byteByte
longLong
shortShort
intInteger
integerInteger
doubleDouble
floatFloat
booleanBoolean
dateDate
decimalBigDecimal
bigdecimalBigDecimal
mapMap

9.3.6 自定義別名

  • 宣告別名,在 SqlMapConfig.xml 組態檔中宣告

    • 方式1:一次定義一個類

      <typeAliases>
      	<typeAlias type="型別" alias="別名"/>
      </typeAliases>
      
    • 方式2:一次定義一個包下的所有類

      <typeAliases>
      	<package name="包名"/>
      </typeAliases>
      

    image-20210722184343089

  • 使用別名,在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 核心組態檔

image-20210723092353822

9.4.2 mapper介面

image-20210723092616856

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>進行取代,

  • 修改映射檔案

    image-20210723100326211

    	<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 核心組態檔

image-20210723104134065

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

標籤:其他

上一篇:炫“庫”行動——超全資料庫疑難知識總結(解說+案例)建議收藏!

下一篇:2021年大資料ELK(七):安裝Elasticsearch-head插件

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more