mybatis03-多表查询、延迟加载、逆向工程

news2024/9/9 0:18:22

mybatis03

mybatis 多表联查

  • 背景产生:开发过程中单表查询 不能满足项目需求分析功能。对于复杂业务来说,关联的表有几张,甚至几十张 并且表与表之间的关系相当复杂。
  • 目的:实现复杂业务功能,必须进行多表查询,在mybatis中提供了多表查询的结果 映射标签,可以实现一对一、一对多、多对一、多对多关系映射。

一、一对一

1、创建表

  • 以 妻子表 和 丈夫表为例
drop database if exists db_418;
create database db_418;
use db_418;
create table wife(
	wid int primary key auto_increment,
	wname varchar(10) not null
);
create table husband(
	hid int primary key auto_increment,
	hname varchar(10) not null,
	wid int,
	foreign key(wid) references wife(wid)
);

2、业务需求

  • 查询出所有丈夫信息 及其妻子信息
# SQL语句查询
select * from wife w,husband h where w.wid=h.wid;

3、项目准备

(1)项目结构

在这里插入图片描述

(2)maven项目,引入在pom.xml文件中引入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.etime</groupId>
    <artifactId>day0418</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <spring.version>5.2.5.RELEASE</spring.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>
(3)配置数据源jdbc.properties属性文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db_418
root=root
password=root
(4)配置 mapper映射文件信息
<?xml version="1.0" encoding="UTF-8"?>
<!--引入dtd约束-->
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--配置连接数据库的信息:动态的读-->
    <properties resource="jdbc.properties"></properties>
    <!--给实体类取别名-->
    <typeAliases>
        <package name="com.etime.pojo"/>
    </typeAliases>
    <!--配置mybatis的环境-->
    <environments default="development">
        <!--配置环境-->
        <environment id="development">
            <!--配置事务的类型-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置链接数据库的信息:使用的是 数据源[连接池]-->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${root}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--注册映射文件位置-->
    <mappers>
        <package name="com.etime.mapper"/>
    </mappers>
</configuration>
(5)实体类:妻子类 和 丈夫类
  • 妻子类
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
@Data
public class Wife {

    private int wid;
    private String wname;
}
  • 丈夫类
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Husband {

    private int hid;
    private String hname;
    private int wid;
    private Wife wife;
}
(6)在 接口 HusbandMapper.java中定义方法
package com.etime.mapper;

import com.etime.pojo.Husband;

import java.util.List;

public interface HusbandMapper {

    List<Husband> getAllHusband();
}
(7)在 映射文件 HusbandMapper.xml 中进行配置
<?xml version="1.0" encoding="UTF-8" ?>
<!--
引入dtd约束-->
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace 是当前mapper对应的接口-->
<mapper namespace="com.etime.mapper.HusbandMapper">
    <select id="getAllHusband" resultMap="husbandAndWife">
        select * from wife w,husband h where w.wid=h.wid;
    </select>
    <resultMap id="husbandAndWife" type="Husband">
        <id property="hid" column="hid"></id>
        <result property="hname" column="hname"></result>
        <result property="wid" column="wid"></result>
        <association property="wife" javaType="Wife">
            <id property="wid" column="wid"></id>
            <result property="wname" column="wname"></result>
        </association>
    </resultMap>
</mapper>
(8)测试
package com.etime.test;

import com.etime.mapper.HusbandMapper;
import com.etime.pojo.Husband;
import com.etime.util.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class MybatisTest {

    @Test
    public void test01(){
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        HusbandMapper husbandMapper = sqlSession.getMapper(HusbandMapper.class);
        List<Husband> list = husbandMapper.getAllHusband();
        list.forEach(System.out::println);
        sqlSession.close();
    }
}
// 结果
Husband(hid=1, hname=周瑜, wid=1, wife=Wife(wid=1, wname=小乔))
Husband(hid=2, hname=孙悟空, wid=2, wife=Wife(wid=2, wname= 露娜))
Husband(hid=3, hname=孙策, wid=3, wife=Wife(wid=3, wname=大乔))
Husband(hid=4, hname=刘备, wid=4, wife=Wife(wid=4, wname=孙尚香))
Husband(hid=5, hname=项羽, wid=5, wife=Wife(wid=5, wname=虞姬))

Process finished with exit code 0

二、一对多/多对一

1、创建表

  • 以 学生表 和 班级表 为例
CREATE TABLE classes(
	cid INT PRIMARY KEY AUTO_INCREMENT,
	cname VARCHAR(10) NOT NULL
);
CREATE TABLE student(
	sid INT PRIMARY KEY AUTO_INCREMENT,
	sname VARCHAR(10) NOT NULL,
	cid INT,
	FOREIGN KEY(cid) REFERENCES classes(cid)
);

2、业务需求

  • 查询出所有学生的信息及其所在班级的信息
# SQL语句查询
select * from classes c,student s where c.cid=s.cid;

3、代码示例编写

(1)方式1:多对一 使用resultMap来插叙
  • 多:学生(主体)
  • 一:班级
a.实体类编写
  • 班级类
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Classes {

    private int cid;
    private String cname;
}
  • 学生类(主体)
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Student {

    private int sid;
    private String sname;
    private int cid;
    private Classes classes;
}
b.在 接口 StudentMapper.java 中定义方法
public interface StudentMapper {
    List<Student> getAllStudent();
}
c.在 映射文件 StudentMapper.xml 中配置
<?xml version="1.0" encoding="UTF-8" ?>
<!--
引入dtd约束-->
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace 是当前mapper对应的接口-->
<mapper namespace="com.etime.mapper.StudentMapper">
    <select id="getAllStudent" resultMap="StudentAndClasses">
        select * from classes c,student s where c.cid=s.cid;
    </select>
    <resultMap id="StudentAndClasses" type="Student">
        <id property="sid" column="sid"></id>
        <result property="sname" column="sname"></result>
        <result property="cid" column="cid"></result>
        <association property="classes" javaType="Classes">
            <id property="cid" column="cid"></id>
            <result property="cname" column="cname"></result>
        </association>
    </resultMap>
</mapper>
d.测试
@Test
public void test02(){
    SqlSession sqlSession = SqlSessionUtil.getSqlSession();
    StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
    List<Student> list = studentMapper.getAllStudent();
    list.forEach(System.out::println);
    sqlSession.close();
}
// 结果
Student(sid=1, sname=李一, cid=1, classes=Classes(cid=1, cname=开发))
Student(sid=2, sname=李二, cid=1, classes=Classes(cid=1, cname=开发))
Student(sid=3, sname=张一, cid=1, classes=Classes(cid=1, cname=开发))
Student(sid=4, sname=张二, cid=2, classes=Classes(cid=2, cname=测试))
Student(sid=5, sname=张三, cid=2, classes=Classes(cid=2, cname=测试))
Student(sid=6, sname=李三, cid=2, classes=Classes(cid=2, cname=测试))
Student(sid=7, sname=李四, cid=3, classes=Classes(cid=3, cname=设计))

Process finished with exit code 0

(2)方式2:一对多 使用resultMap来插叙
  • 一:班级(主体)
  • 多:学生
a.实体类编写
  • 学生类
package com.etime.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
@Data
public class Student {

    private int sid;
    private String sname;
    private int cid;
}
  • 班级类(主体)
package com.etime.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@NoArgsConstructor
@AllArgsConstructor
@Data
public class Classes {

    private int cid;
    private String cname;
    private List<Student> studentList;
}
b.在 接口 ClassesMapper.java 中定义方法
package com.etime.mapper;

import com.etime.pojo.Classes;

import java.util.List;

public interface ClassesMapper {

    List<Classes> getAllClasses();
}
c.在 映射文件 ClassesMapper.xml 中配置
<?xml version="1.0" encoding="UTF-8" ?>
<!--
引入dtd约束-->
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace 是当前mapper对应的接口-->
<mapper namespace="com.etime.mapper.ClassesMapper">
    <select id="getAllClasses" resultMap="ClassesAndStudent">
        select * from classes c,student s where c.cid=s.cid;
    </select>
    <resultMap id="ClassesAndStudent" type="Classes">
        <id property="cid" column="cid"></id>
        <result property="cname" column="cname"></result>
        <collection property="studentList" ofType="Student">
            <id property="sid" column="sid"></id>
            <result property="sname" column="sname"></result>
            <result property="cid" column="cid"></result>
        </collection>
    </resultMap>
</mapper>
d.测试
@Test
public void test03(){
    SqlSession sqlSession = SqlSessionUtil.getSqlSession();
    ClassesMapper classesMapper = sqlSession.getMapper(ClassesMapper.class);
    List<Classes> list = classesMapper.getAllClasses();
    list.forEach(System.out::println);
    sqlSession.close();
}

三、多对多

1、创建表

  • 学生表 和 课程表 以及中间表
CREATE TABLE classes(
	cid INT PRIMARY KEY AUTO_INCREMENT,
	cname VARCHAR(10) NOT NULL
);
CREATE TABLE student(
	sid INT PRIMARY KEY AUTO_INCREMENT,
	sname VARCHAR(10) NOT NULL,
	cid INT,
	FOREIGN KEY(cid) REFERENCES classes(cid)
);
CREATE TABLE course(
	courseid INT PRIMARY KEY AUTO_INCREMENT,
	coursename VARCHAR(10) NOT NULL
);

CREATE TABLE studentcourse(
	scid INT PRIMARY KEY AUTO_INCREMENT,
	sid INT,
	courseid INT,
	FOREIGN KEY(sid) REFERENCES student(sid),
	FOREIGN KEY(courseid) REFERENCES course(courseid)
);

2、业务需求

  • 查询学生学习的课程
# SQL语句查询
select * from student s,course c,studentcourse sc where s.sid=sc.sid and c.courseid=sc.courseid;

3、示例代码编写

(1)方式1:无中间表实体类
a.实体类
  • 课程类
package com.etime.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
@Data
public class Course {

    private int courseid;
    private String coursename;
}
  • 学生类 (主体)
package com.etime.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@NoArgsConstructor
@AllArgsConstructor
@Data
public class Student {

    private int sid;
    private String sname;
    private int cid;
    private List<Course> courseList;
}
b.在 接口 StudentMapper.java 中定义方法
List<Student> getAllStudentAndCourse();
c.在 映射文件 StudentMapper.xml 中配置信息
<select id="getAllStudentAndCourse" resultMap="StudentAndCourse">
    select * from student s,course c,studentcourse sc where s.sid=sc.sid and c.courseid=sc.courseid;
</select>
<resultMap id="StudentAndCourse" type="Student">
    <id property="sid" column="sid"></id>
    <result property="sname" column="sname"></result>
    <result property="cid" column="cid"></result>
    <collection property="courseList" ofType="Course">
        <id property="courseid" column="courseid"></id>
        <result property="coursename" column="coursename"></result>
    </collection>
</resultMap>
d.测试
@Test
public void test04(){
    SqlSession sqlSession = SqlSessionUtil.getSqlSession();
    StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
    List<Student> list = studentMapper.getAllStudentAndCourse();
    list.forEach(System.out::println);
    sqlSession.close();
}
// 结果
Student(sid=1, sname=李一, cid=1, courseList=[Course(courseid=1, coursename=Java高级语言), Course(courseid=2, coursename=JavaWeb), Course(courseid=3, coursename=JavaEE)])
Student(sid=2, sname=李二, cid=1, courseList=[Course(courseid=1, coursename=Java高级语言), Course(courseid=4, coursename=数据结构)])
Student(sid=3, sname=张一, cid=1, courseList=[Course(courseid=2, coursename=JavaWeb), Course(courseid=3, coursename=JavaEE)])

Process finished with exit code 0
(2)方式2:加入中间表
a.实体类
  • 课程类
package com.etime.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
@Data
public class Course {

    private int courseid;
    private String coursename;
}
  • 中间表类(主体2)
package com.etime.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
@Data
public class StudentCourse {

    private int scid;
    private int sid;
    private int courseid;
    private Course course;
}
  • 学生类(主体1)
package com.etime.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@NoArgsConstructor
@AllArgsConstructor
@Data
public class Student {

    private int sid;
    private String sname;
    private int cid;
    private List<StudentCourse> studentCourseList;
}
b.在接口 StudentMapper.java 文件中定义方法
List<Student> getAllStudentAndCourseByMindTable();
c.在映射文件 StudentMapper.xml 文件中 配置信息
  • 注意:在测试时其他方法的配置信息可能出错,比如上个方法中的 courseList,因为实体类中属性发生了变动。
<select id="getAllStudentAndCourseByMindTable" resultMap="MindTable">
     select * from student s,course c,studentcourse sc where s.sid=sc.sid and c.courseid=sc.courseid;
</select>
<resultMap id="MindTable" type="Student">
    <id property="sid" column="sid"></id>
    <result property="sname" column="sname"></result>
    <result property="cid" column="cid"></result>
    <collection property="studentCourseList" ofType="StudentCourse">
        <id property="scid" column="scid"></id>
        <result property="sid" column="sid"></result>
        <result property="courseid" column="courseid"></result>
        <association property="course" column="Course">
            <id property="courseid" column="courseid"></id>
            <result property="coursename" column="coursename"></result>
        </association>
    </collection>
</resultMap>
d.测试
@Test
public void test05(){
    SqlSession sqlSession = SqlSessionUtil.getSqlSession();
    StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
    List<Student> list = studentMapper.getAllStudentAndCourseByMindTable();
    list.forEach(System.out::println);
    sqlSession.close();
}

mybatis 延迟加载

  • 目的:Mybatis优化性能。

一、什么是延迟加载

  1. 延迟加载(lazy load)是(也称为懒加载)关联关系对象默认的加载方式。
  2. 延迟加载机制是为了避免一些无谓的性能开销而提出来的。
  3. 延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作
  4. 延迟加载,可以简单理解为,只有在使用的时候,才会发出sql语句进行查询。

二、为什么要使用延迟加载

  • 减少访问数据库的频率
    • 访问的数据量过大,明显缓存不太合适。因为内存容量有限为了减少并发量,减少系统资源的消耗
  • 使用前提条件:、必须是嵌套方式
    • 嵌套的是对象、集合等。例:association、collection 具备延迟加载功能。

三、局部延迟加载

  • 在 映射文件 Mapper中设计延迟加载

在这里插入图片描述

四、全局延迟加载

  • 在 mybatis核心配置文件 mybatisConfig.xml中配置
  • 注意:标签的位置(dtd约束中体现)
<!--全局加载-->
<settings>
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>

mybatis 逆向工程

一、mybatis 逆向工程概述

1、前言

​ 我们企业开发中是先进行数据建模即建库建表并设定表和表之间的关系。可以举方活中的列子,如盖楼先有图纸,才能盖楼,而不是先盖楼再画图纸。

2、产生背景

​ mybatis 考虑到对单标进行 CRUD时,对于映射文件来说只是标签和SQL语句的不同,所以提供了 逆向工程,可以通过过表直接生成实体类、接口、接口的映射文件,来减轻开人员工作量,提高开发效率。

二、编写示例代码

1、构建maven项目,引入依赖,配置pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.etime</groupId>
    <artifactId>generatorTest</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <spring.version>5.2.5.RELEASE</spring.version>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.1</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.7</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
    </dependencies>
</project>

2、创建数据源 jdbc.properties 属性文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db_418
root=root
password=root

3、创建mybatis核心配置文件 mybatisConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--引入dtd约束-->
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--配置连接数据库的信息:动态的读-->
    <properties resource="jdbc.properties"></properties>
    <!--全局加载-->
    <settings>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>
    <!--给实体类取别名-->
    <typeAliases>
        <package name="com.etime.pojo"/>
    </typeAliases>
    <!--配置mybatis的环境-->
    <environments default="development">
        <!--配置环境-->
        <environment id="development">
            <!--配置事务的类型-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置链接数据库的信息:使用的是 数据源[连接池]-->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${root}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--注册映射文件位置-->
    <mappers>
        <package name="com.etime.mapper"/>
    </mappers>
</configuration>

4、创建 逆向工程核心配置文件 generatorConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <context id="testTables" targetRuntime="mybatis3">
        <commentGenerator>
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/db_418"
                        userId="root" password="root">
        </jdbcConnection>
        <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
           NUMERIC 类型解析为java.math.BigDecimal -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>
        <!-- targetProject:生成实体类的位置 -->
        <javaModelGenerator targetPackage="com.etime.pojo" targetProject=".\src\main\java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false" />
            <!-- 从数据库返回的值被清理前后的空格 -->
            <property name="trimStrings" value="true" />
       </javaModelGenerator>
        <!-- targetProject:mapper映射文件生成的位置 -->
        <sqlMapGenerator targetPackage="com.etime.mapper" targetProject=".\src\main\resources">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>
        <!-- targetPackage:mapper接口生成的位置 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.etime.mapper" targetProject=".\src\main\java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>
        <!-- 指定数据库表 -->
        <table tableName="classes"></table>
        <table tableName="course"></table>
        <table tableName="husband"></table>
        <table tableName="studentcourse"></table>
        <table tableName="student"></table>
        <table tableName="wife"></table>
   </context>
</generatorConfiguration>

5、根据逆向工程 API 编写代码

package com.etime.test;

import org.junit.Test;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;

import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class TestDemo {

    @Test
    public void test01(){
        File file = new File("F:\\mavenProject\\generatorTest\\src\\main\\resources\\ generatorConfig.xml");
        List<String> list = new ArrayList<>();
        ConfigurationParser configurationParser = new ConfigurationParser(list);
        try {
            Configuration configuration = configurationParser.parseConfiguration(file);
            DefaultShellCallback defaultShellCallback = new DefaultShellCallback(true);
            MyBatisGenerator myBatisGenerator = new MyBatisGenerator(configuration,defaultShellCallback,list);
            myBatisGenerator.generate(null);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (XMLParserException e) {
            e.printStackTrace();
        } catch (InvalidConfigurationException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

    }
}

6、逆向工程测试结果

在这里插入图片描述

7、根据逆向工程生成的文件进行相关操作

package com.etime.test;

import com.etime.mapper.StudentMapper;
import com.etime.pojo.Student;
import com.etime.pojo.StudentExample;
import com.etime.util.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class GeneratorTest {

    // 查询所有学生
    @Test
    public void test01(){
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
        StudentExample studentExample = new StudentExample();
        List<Student> list = studentMapper.selectByExample(studentExample);
        list.forEach(System.out::println);
        sqlSession.close();
    }

    // 根据主键查询学生信息
    @Test
    public void test02(){
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
        Student student = studentMapper.selectByPrimaryKey(1);
        System.out.println(student);
        sqlSession.close();
    }

    // 根据其他信息查询学生,例:根据学生班级查询学生
    @Test
    public void test03(){
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
        StudentExample studentExample = new StudentExample();
        // 创建条件对象
        StudentExample.Criteria criteria = studentExample.createCriteria();
        criteria.andCidEqualTo(1);
        List<Student> list = studentMapper.selectByExample(studentExample);
        list.forEach(System.out::println);
        sqlSession.close();
    }

    // 新增学生
    @Test
    public void test04(){
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
        Student student = new Student();
        student.setSid(0);
        student.setSname("tom");
        student.setCid(1);
        int res = studentMapper.insert(student);
        System.out.println("add res = " + res);
        sqlSession.close();
    }

    // 根据主键修改学生
    @Test
    public void test05(){
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
        Student student = new Student();
        student.setSid(8);
        student.setSname("狮子王");
        student.setCid(1);
        int res = studentMapper.updateByPrimaryKey(student);
        System.out.println("update res = " + res);
        sqlSession.close();
    }

    // 根据主键删除学生
    @Test
    public void test06(){
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
        int res = studentMapper.deleteByPrimaryKey(8);
        System.out.println("delete res = " + res);
        sqlSession.close();
    }
}

dent.setSid(0);
student.setSname(“tom”);
student.setCid(1);
int res = studentMapper.insert(student);
System.out.println("add res = " + res);
sqlSession.close();
}

// 根据主键修改学生
@Test
public void test05(){
    SqlSession sqlSession = SqlSessionUtil.getSqlSession();
    StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
    Student student = new Student();
    student.setSid(8);
    student.setSname("狮子王");
    student.setCid(1);
    int res = studentMapper.updateByPrimaryKey(student);
    System.out.println("update res = " + res);
    sqlSession.close();
}

// 根据主键删除学生
@Test
public void test06(){
    SqlSession sqlSession = SqlSessionUtil.getSqlSession();
    StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
    int res = studentMapper.deleteByPrimaryKey(8);
    System.out.println("delete res = " + res);
    sqlSession.close();
}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/445633.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开发插件JFormDesigner(可视化GUI编程)的使用与注册-简单几步即可完成

开发插件JFormDesigner&#xff08;可视化GUI编程&#xff09;的使用与注册 获取链接&#xff1a;1.JFormDesigner获取2.记录插件下载路径3.使用zcj注册4.生成license5.打开idea进行注册 获取链接&#xff1a; https://pan.baidu.com/s/1N9ua2p3BpiMIARCEewRxIw?pwd4e9a 提取…

WebSocket 通信 —— 浏览器原生支持

在上一篇内容中讲到使用Node中的Net核心模块完成socket通信&#xff0c;那么本篇就继续来讲关于浏览器原生支持的 WebSocket &#xff0c;实现通信。那么什么是 WebSocket ? 它是HTML5开始提供的一种浏览器与服务器间进行全双工&#xff08;全双工&#xff1a;同时进行双向传输…

激活函数(Activation Function)及十大常见激活函数

目录 1 激活函数的概念和作用 1.1 激活函数的概念 1.2 激活函数的作用 1.3 通俗地理解一下激活函数&#xff08;图文结合&#xff09; 1.3.1 无激活函数的神经网络 1.3.2 带激活函数的神经网络 2 神经网络梯度消失与梯度爆炸 2.1 简介梯度消失与梯度爆炸 2.2 梯度不稳…

asp.net+C#房地产销售系统文献综述和开题报告+Lw

本系统使用了B/S模式&#xff0c;使用ASP.NET语言和SQL Server来设计开发的。首先把所有人分为了用户和管理员2个部分&#xff0c;一般的用户可以对系统的前台进行访问&#xff0c;对一般的信息进行查看&#xff0c;而注册用户就可以通过登录来完成对房屋信息的查看和对房屋的…

动态通讯录——C语言【详解+全部码源】

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a;进阶C语言&#xff0c;本专栏主要讲解数据存储&#xff0c;进阶指针&#xff0c;动态内存管理&a…

企业数据安全能力建设思路

在现代社会&#xff0c;企业数据安全已经成为一个非常重要的话题。企业数据安全能力的建设是每个企业都必须面对和解决的问题。企业数据安全能力建设思路包括以下几个方面&#xff1a; 1. 建立完善的安全管理制度 企业要建立完善的安全管理制度&#xff0c;包括信息安全政策、…

[入门必看]数据结构5.1:树的基本概念

[入门必看]数据结构5.1&#xff1a;树的基本概念 第五章 树与二叉树5.1 树的基本概念知识总览5.1.15.1.2 树的定义和基本术语5.1.3 树的性质 5.1.15.1.2 树的定义和基本术语树的基本概念树形逻辑结构的应用结点之间的关系描述结点、树的属性描述有序树 V.S 无序树树 V.S 森林 5…

软考 软件设计师上午题uml

UML uml事物依赖关系关联聚合组合关系泛化关系实现关系关联多重度UML类图UML 类图的概念对象图用例图包含关系扩展关系泛化关系用例图概念交互图通信图![在这里插入图片描述](https://img-blog.csdnimg.cn/d62c6f00d57a48949e3306461f3fbe25.png)通信图例子状态图状态图的状态和…

# 生成器

生成器 生成器是什么&#xff1f; 生成器&#xff08;generator&#xff09;是一种用来生成数据的对象。它们是普通函数的一种特殊形式&#xff0c;可以用来控制数据的生成过程。 生成器有什么优势&#xff1f; 使用生成器的优势在于它们可以在生成数据的同时控制数据的生成过程…

android ContentObserver实时监测媒体图片增删改,java(1)

android ContentObserver实时监测媒体图片增删改,java&#xff08;1&#xff09; <uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name"android.permission.READ_MEDIA_IMAGES" /> impl…

七、JS07使用 jQuery 操作 DOM

七、使用 jQuery 操作 DOM 7.1 DOM 操作 7.1.1 DOM 操作分类 使用 JavaScript 操作 DOM 时分为三类——DOM Core(核心)、HTML-DOM 和 CSS-DOMjQuery 操作也同样分为这三类下面主要回顾以下 JavaScript 中的 DOM 操作 JavaScript 中的 getElementById()、getElementByTagName…

c++内联函数inline

目录 内联函数的概念&#xff1a; 内联函数的用法&#xff1a; 内联的优点&#xff1a; 内联的缺点&#xff1a; 内联的使用场景 内联注意事项&#xff1a; 内联函数的概念&#xff1a; C中内联&#xff08;inline&#xff09;是一种关键字&#xff0c;用于告诉编译器把函…

以太网和DNS

以太网 数据链路层考虑的是相邻俩个节点之间的传输(通过网线/光纤/无线直接相连的设备),数据链路层中最典型的协议就说"以太网" 以太网协议规定了数据链路层,也规定了物理层的内容,我们使用的网线,也叫做"以太网线"(遵守以太网协议的网线) 以太网帧格式…

使用RecyclerView开发TabView

github链接 demo代码 效果图 这个功能是使用RecyclerView开发的&#xff0c;需要解决下面这些问题 单个item滚动的问题&#xff1a;左边的view需要固定、手指松开之后&#xff0c;惯性的处理滑动布局子View事件分发冲突的解决多个item联合滚动滚动header解决itemView与Recycl…

【MYSQL】表的增删改查(进阶)

文章目录 &#x1f337; 1. 数据库约束⭐ 1.1 约束类型⭐ 1.2 NULL约束⭐ 1.3 UNIQUE&#xff1a;唯一约束⭐ 1.4 DEFAULT&#xff1a;默认值约束⭐ 1.5 PRIMARY KEY&#xff1a;主键约束⭐ 1.6 FOREIGN KEY&#xff1a;外键约束⭐ 1.7 CHECK约束&#xff08;了解&#xff09; …

实在智能创意沙画引爆第25届“海博会”,数字员工为电商超自动化转型加“数”

4月18日&#xff0c;由中国纺织工业联合会、中国服装协会、中国服装设计师协会、台湾纺织业拓展会主办&#xff0c;石狮市人民政府指导的第二十五届海峡两岸纺织服装博览会暨科技成果交易会&#xff08;下称“海博会”&#xff09;在石狮市举行。本届海博会以“融合创新、共享时…

Android Jetpack 应用指南 - Navigation

前言 在Android开发的过去几年中&#xff0c;在公司的项目中一直没有机会尝试单Activity多Fragment的开发模式&#xff0c;随着Google推出Navigation组件&#xff0c;我意识到&#xff0c;终于有机会学习一种全新的开发模式了。 与上一篇文章相同&#xff0c;本篇同样是Navig…

Lenovo IdeaPad S540-14IML 电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板Lenovo IdeaPad S540-14IML 2019 (Type 81NF) 处理器Intel Core i5-10210U / i7-10510U已驱动 内存Internal 4GB 2666 Changeable 8GB 2666 memo…

Android进程间通信

在操作系统中&#xff0c;每个进程都有一块独立的内存空间。为了保证程序的的安全性&#xff0c;操作系统都会有一套严格的安全机制来禁止进程间的非法访问&#xff0c;但是&#xff0c;很多情况下进程间也是需要相互通信的 进程间通信&#xff08;Inter-process communication…

嵌入式学习笔记——SPI通信的应用

SPI通信的应用 前言屏幕分类1.3OLED概述驱动芯片框图原理图通信时序显示的方式页地址、列地址初始化指令 程序设计初始化代码初始化写数据与写命令清屏函数 初始化代码字符显示函数 总结 前言 上一篇中介绍了STM32的SPI通信&#xff0c;并根据框图和寄存器进行了SPI通信的初始…