我正在参加年度博客之星评选,请大家帮我投票打分,您的每一分都是对我的支持与鼓励。

2021年「博客之星」参赛博主:Maynor大数据

https://bbs.csdn.net/topics/603955366

最新更新

相关代码已上传到Gitee,欢迎start!
https://gitee.com/the_efforts_paid_offf/java/tree/master/ssm_db1

前言

今天复习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 TableCREATE 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;@Overridepublic 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 configurationPUBLIC "-//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 =debuglog4j.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 configurationPUBLIC "-//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、MANAGEDJDBC,jdbc底层事务管理,commit提交,rollback回顾。MANAGED,交予其他框架管理,自己不做事务操作,仅关闭连接。<dataSource>用于配置连接池(多个连接的池子)type:用于确定管理连接的方案,取值:POOLED、UNPOOLED、JNDIPOOLED:通过连接池,管理连接创建和销毁。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. 事务的配置项

    2. 连接池的配置项

    3. 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 TableCREATE 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;@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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) 封装分页结果 PageInfonew 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();//创建一个MapperHelperMapperHelper 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 {@Testpublic void testSelectByPrimaryKey() {UserMapper2 userMapper2 = MyBatisUtils.getMapper(UserMapper2.class);User user = userMapper2.selectByPrimaryKey("1");System.out.println(user);MyBatisUtils.commitAndclose();}
    }
    

8.4.2 查询所有

    @Testpublic void testSelectAll() {UserMapper2 userMapper2 = MyBatisUtils.getMapper(UserMapper2.class);List<User> list = userMapper2.selectAll();// 打印list.forEach(System.out::println);MyBatisUtils.commitAndclose();}

8.4.3 添加

@Testpublic 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 修改

@Testpublic 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 删除

    @Testpublic 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()                //区间查询
@Testpublic 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 mapperPUBLIC "-//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 {@Testpublic 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 mapperPUBLIC "-//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 mapperPUBLIC "-//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 mapperPUBLIC "-//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 mapperPUBLIC "-//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 {@Testpublic void testSelectById() {UserMapper userMapper = MyBatisUtils.getMapper(UserMapper.class);User user = userMapper.selectById("1");System.out.println(user);MyBatisUtils.commitAndclose();}@Testpublic void testSelectAll() {UserMapper UserMapper = MyBatisUtils.getMapper(UserMapper.class);List<User> list = UserMapper.selectAll();// 打印list.forEach(System.out::println);MyBatisUtils.commitAndclose();}@Testpublic void testSelectByName() {UserMapper UserMapper = MyBatisUtils.getMapper(UserMapper.class);List<User> list = UserMapper.selectByName("%张%");// 打印list.forEach(System.out::println);MyBatisUtils.commitAndclose();}@Testpublic 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();}@Testpublic 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();}@Testpublic 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>
    
  • 测试

        @Testpublic 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 ,需要遍历的数据,如果实际参数就是数组本身,此处需要使用arrayitem ,每一次循环时存放数据的变量,在标签体中可以通过 ${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>
    
  • 测试

        @Testpublic 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 mapperPUBLIC "-//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 mapperPUBLIC "-//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 {@Testpublic 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 mapperPUBLIC "-//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 {@Testpublic 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 mapperPUBLIC "-//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 {@Testpublic 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 mapperPUBLIC "-//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 {@Testpublic void testSelectById() {OrderMapper orderMapper = MyBatisUtils.getMapper(OrderMapper.class);Order order = orderMapper.selectById("x001");System.out.println(order);MyBatisUtils.commitAndclose();}}

六万字最全总结Java数据库编程MyBatis(+收藏)相关推荐

  1. java数据库编程——元数据(metadata)+web 与企业应用中的连接管理

    [0]README 1) 本文部分文字描述转自 core java volume 2 , 测试源代码均为原创, 旨在理解 java数据库编程--元数据(metadata)+web 与企业应用中的连接管 ...

  2. java数据库编程——事务

    [0]README 1) 本文部分文字描述转自 core java volume 2 , 测试源代码均为原创, 旨在理解 java数据库编程--事务 的基础知识 : 2)for database co ...

  3. java数据库编程——可滚动和可更新的结果集

    [0]README 1) 本文部分文字描述转自 core java volume 2 , 测试源代码均为原创, 旨在理解 java数据库编程--可滚动和可更新的结果集 的基础知识 : 2)for da ...

  4. java数据库编程——执行查询操作(二)

    [0]README 1) 本文部分文字描述和source code 均转自 core java volume 2 , 旨在理解 java数据库编程--执行查询操作(二) 的基础知识 : 2) 本文和 ...

  5. java数据库编程——执行查询操作(一)

    [0]README 1) 本文部分文字描述和source code 均转自 core java volume 2 , 旨在理解 java数据库编程--执行查询操作 的基础知识 : 2) 本文和 jav ...

  6. java数据库编程——执行SQL 语句

    [0]README 1) 本文文字描述+source code 均转自 core java volume 2 , 旨在理解 java数据库编程--执行SQL 语句 的基础知识 : 2)for sour ...

  7. java基础类库——java数据库编程,JDBC连接(原生数据库连接)(十)

    java数据库编程,JDBC连接(原生数据库连接) JDBC严格来讲不属于一门技术,它属于一种服务.所有的操作流程都是固定的.JDBC是java提供的数据库操作的一个标准(它就是一组相关的标准接口), ...

  8. java数据库编程中查询结果的表格式输出_Java数据库编程中查询结果的表格式输出...

    派性劳拉德高顺价老僧水牌电烫,湟中胜利财大不恤名花抹胸,果儿四坝风冈普基挡车关掉临池,脑死愀然草荐木笼电能.公话理念湮没不讳公使难看! 摄氏欠安宣和拉道开封关掉明洁名贵.不名滑膜俊美盲女长虹火主乐律超 ...

  9. java数据库编程(二) 数据库操作

    关于数据库的连接方法已在java 数据库编程(一)JDBC连接Sql Server数据库一文中为大家介绍,还没有链接数据库的小伙伴请先点击查看. 今天首先为大家介绍一下数据库的连接及操作的核心类与接口 ...

  10. jdbc与java数据库编程_JDBC与JAVA数据库编程

    一.JDBC的概念 1. JDBC (Java DataBase Connectivity) Java数据库连接 a) 主要提供java数据库应用程序的API支持 2. JDBC的主要功能 a) 创建 ...

最新文章

  1. 关于Blocking IO, Non-Blocking IO 和 Asynchronous I/O的理解
  2. 关于python的线程安全的一些理解.
  3. ubuntu18.04 Qt Creator 安装+ROS Qt Creator Plug-in 插件安装笔记
  4. 单片机c语言检测压力值,基于单片机的压力检测系统设计论文.doc
  5. 对正则表达式又重新学了一遍,笔记方便以后查阅
  6. SAP License:SAP复制和默认快捷小贴士
  7. 前端入门-day2(常见css问题及解答)
  8. 怎么样写一个 node.js模块以及NPM Package
  9. DBParameter比拼接字符串慢的解决办法
  10. 生产和服务使用的计算机软件,Windows效率 篇三:Windows 10软件推荐,将你的生产力工具发挥到极致!...
  11. Nginx跨域配置 proxy_pass
  12. 解析几何----阿氏圆的半径公式和调和性质
  13. 100%解决GitHub打不开或者打开慢
  14. VPS安装msf教程
  15. (翻译)文本字段的最优显示方式
  16. Linux系统管理16:shell
  17. Anaconda 大疆 Tello EDU python 环境配置
  18. Google Earth Engine (GEE)——如何统计指定区域的像素数量和总量
  19. Python(第一章)版本介绍,环境准备及IDLE使用
  20. 有序广播Ordered broadcasts的使用

热门文章

  1. 折腾AX2012,安装成功,发帖庆祝
  2. FLASHFTP简体中文破解版
  3. DevC++ 软件下载及安装教程(详细、具体)
  4. 计算机二级java和c哪个难,计算机二级最好考哪个 考试难度怎么样
  5. java 1.8 64_JDK 1.8 64位 下载 安装 配置
  6. 清华大学刘云浩教授——人工智能打开了潘多拉的盒子吗?
  7. 用jsp编写一个猜26个小写英文字母的web小游戏
  8. Ubuntu MPEG-4 AAC 与 H.264 解码器安装
  9. Unicode-GBK映射表下载。
  10. Java的对象序列化之serialVersionUID问题