Mybatis总结
MyBatis实现Mysql数据库分库分表操作和总结

MyBatis实现Mysql数据库分库分表操作和总结前⾔作为⼀个数据库,作为数据库中的⼀张表,随着⽤户的增多随着时间的推移,总有⼀天,数据量会⼤到⼀个难以处理的地步。
这时仅仅⼀张表的数据就已经超过了千万,⽆论是查询还是修改,对于它的操作都会很耗时,这时就需要进⾏数据库切分的操作了。
MyBatis实现分表最简单步骤既然⽂章的标题都这么写了,不如直接上⼲货来的⽐较实际,我们就先来看看如何实现最简单的分表。
1、我们模拟⽤户表数据量超过千万(虽然实际不太可能)2、⽤户表原来的名字叫做user_tab,我们切分为user_tab_0和user_tab_1(实际也可能不是这么随意的名字),这样就能把原来千万的数据分离成两个百万的数据量的两张表了。
3、如何操作这两张表呢?我们利⽤userId也就是⽤户的唯⼀标识进⾏区分。
4、userId%2 == 0的⽤户操作表user_tab_0,同理userId%2 == 1的⽤户操作表user_tab_15、那么在MyBatis中sql语句如何实现呢?下⾯是举例查询⼀个⽤户的sql语句<select id="getUser" parameterType="java.util.Map" resultType="UserDO">SELECT userId, nameFROM user_tab_#{tabIndex}WHERE userId = #{userId}</select>其中我们传⼊了两个参数tabIndex和userId,tabIndex就是需要操作表的标⽰值(0或1),这样如果需要查询userId为5的⽤户,那么最终出现的sql语句就会是:SELECT userId, nameFROM user_tab_1WHERE userId = 5其他多余的DAO服务和实现我这⾥就不多展⽰了,相信聪明的你肯定会的。
mybatis数据库开发实验总结

mybatis数据库开发实验总结MyBatis数据库开发实验总结一、引言MyBatis是一种Java持久化框架,它简化了数据库操作的开发过程。
在本次实验中,我们使用MyBatis进行了数据库开发,通过对实验过程的总结,可以对MyBatis的使用方法和注意事项有更深入的了解。
二、实验目的本次实验的目的是熟悉MyBatis的基本用法,掌握MyBatis的配置和使用方法。
具体来说,我们需要完成以下几个任务:1. 创建数据库表并插入数据;2. 编写实体类和映射文件;3. 配置MyBatis的数据库连接信息;4. 编写数据库操作接口和SQL语句;5. 测试数据库操作功能。
三、实验步骤1. 安装MyBatis并配置开发环境。
2. 创建数据库表,包括表结构和数据。
3. 编写实体类,对应数据库表的字段。
4. 创建映射文件,配置实体类和数据库表的映射关系。
5. 配置MyBatis的数据库连接信息,包括数据库驱动、连接URL、用户名和密码。
6. 编写数据库操作接口,定义数据库操作的方法。
7. 编写SQL语句,包括插入、更新、删除和查询等操作。
8. 测试数据库操作功能,验证数据库操作的正确性和可靠性。
四、实验结果与分析经过实验,我们成功完成了数据库的创建和数据的插入。
通过编写实体类和映射文件,我们实现了实体类和数据库表的映射关系。
在数据库操作接口中,我们定义了各种数据库操作的方法,并在SQL 语句中实现了这些操作。
最后,通过测试数据库操作功能,我们验证了数据库操作的正确性和可靠性。
五、实验总结通过本次实验,我对MyBatis的使用方法和注意事项有了更深入的了解。
首先,我们需要正确配置MyBatis的数据库连接信息,包括数据库驱动、连接URL、用户名和密码。
其次,我们需要编写实体类和映射文件,对应数据库表的字段和映射关系。
在数据库操作接口中,我们定义了各种数据库操作的方法,并在SQL语句中实现了这些操作。
最后,通过测试数据库操作功能,我们验证了数据库操作的正确性和可靠性。
MyBatis逆向工程生成的Example类的方法总结

MyBatis逆向⼯程⽣成的Example类的⽅法总结很早之前就在项⽬开发中多次使⽤MyBatis逆向⼯程⽣成的Example类,但⼀直没有对其下的⽅法做⼀个简单的总结,现总结如下:⼀、mapper接⼝中的⽅法解析mapper接⼝中的部分常⽤⽅法及功能如下:⽅法功能说明int countByExample(UserExample example) thorws SQLException按条件计数int deleteByPrimaryKey(Integer id) thorws SQLException按主键删除int deleteByExample(UserExample example) thorws SQLException按条件删除String/Integer insert(User record) thorws SQLException插⼊数据(返回值为ID)User selectByPrimaryKey(Integer id) thorws SQLException按主键查询ListselectByExample(UserExample example) thorws SQLException按条件查询ListselectByExampleWithBLOGs(UserExample example) thorws SQLException 按条件查询(包括BLOB字段)。
只有当数据表中的字段类型有为⼆进制的才会产⽣int updateByPrimaryKey(User record) thorws SQLException按主键更新int updateByPrimaryKeySelective(User record) thorws SQLException按主键更新值不为null的字段int updateByExample(User record, UserExample example) thorwsSQLException按条件更新int updateByExampleSelective(User record, UserExample example)thorws SQLException按条件更新值不为null的字段⼆、Example类解析mybatis的逆向⼯程中会⽣成实体类及实体类对应的example类,example类⽤于添加条件,相当where后⾯的部分。
【Java】关于MyBatis框架的总结

【Java】关于MyBatis框架的总结最近在学习MyBatis框架,我在这⾥记录⼀下学习MyBatis过程中的⼼得体会。
Mybatis是什么?使⽤它我们可以做什么?MyBatis是⼀个开源的数据持久层框架,它内部封装了通过JDBC访问数据库的操作,⽀持普通的SQL查询、存储过程和⾼级映射,⼏乎消除了所有的JDBC代码和参数的⼿⼯设置以及结果集的检索。
MyBatis作为持久层框架,其主要思想是将程序中⼤量SQL语句剥离出来,配置在配置⽂件中,实现SQL的灵活配置。
这样做的好处是将SQL与程序代码分离,可以在不修改程序代码的情况下,直接在配置⽂件中修改SQL。
Mybatis通过简单的XML或者注解进⾏配置和原始映射,将实体类和SQL语句之间建⽴映射关系,是⼀种半⾃动化的ORM实现。
MyBatis环境搭建这⾥我们使⽤的编译程序以Eclipse为例。
下载jar包==>部署jar包==>编写configuration核⼼配置⽂件==>创建pojo实体类==>创建DAO接⼝==>创建SQL映射⽂件==>编写测试类需要的jar包:创建MyBatis核⼼配置⽂件configuration.xmlMyBatis核⼼配置⽂件主要⽤于配置数据库连接和MyBatis运⾏时所需的各种特性,包含了设置和影响MyBatis⾏为的属性MyBatis的核⼼接⼝和类1)每个MyBatis的应⽤程序都以⼀个SqlSessionFactory对象的实例为核⼼。
2)⾸先获取SqlSessionFactoryBuilder对象,可以根据XML配置⽂件或Configuration类的实例构建该对象。
3)然后获取SqlSessionFactory对象,该对象实例可以通过SqlSessionFactoryBuilder对象来获得。
4)使⽤SqlSessionFactory对象获取SqlSession实例。
SqlSessionFactoryBuilder负责构建SqlSessionFactory,提供多个build()⽅法的重载,主要分为三个:build(Reader reader,String environment,Properties properties)build(InputStream inputStream,String environment,Properties properties)build(Configuration config)最⼤的特点是⽤过即丢,⼀旦创建了SqlSessionFactory对象之后,这个类就不再需要存在了,因此SqlSessionFactoryBuilder的最佳作⽤范围就是存在于⽅法体内,也就是局部变量。
spring整合mybatis出现的异常总结

spring整合mybatis出现的异常总结1.数据库版本及url配置问题,如图-20所⽰:问题分析:在url中追加时区配置(serverTimezone=GMT%2B8)2.数据库服务连接不上,如图-21所⽰:问题分析:检查数据库服务是否启动,连接数据库的⽤户名,密码是否正确.3.数据库版本或url配置问题,如图-22所⽰:问题分析:检查数据的服务是否已启动,连接数据的url配置是否正确,数据库版本与驱动是否匹配.4.访问的数据库不存在,如图-23所⽰:问题分析:检查url配置的数据库是否存在(数据库是否没创建)5.指定命名空间下的元素ID已经存在。
问题分析:可能是GoodsDao接⼝或映射⽂件对应的映射元素有重复。
6.MyBatis 绑定异常,如图-24所⽰问题分析:1. 检查接⼝类全名与映射⽂件中的命名空间是否不⼀致。
2. 检查接⼝⽅法名与映射⽂件中的元素是否不⼀致。
3. 查接⼝⽅法参数与映射⽂件可接收的参数不匹配。
4. 检查接⼝对应的映射⽂件路径是否配置不正确(mapper-locations)。
7.MyBatis 参数绑定异常,如图-25所⽰:问题分析:检查调⽤的dao⽅法参数与对应的SQL参数是否有映射关系.(SQL中的使⽤的ids参数可能没有使⽤@Param注解进⾏描述)8.运⾏时的SQL语法问题,图-26所⽰问题分析:1. 认真分析操作中提⽰的SQL语法问题,以及出现的⼤概位置。
2. 检测业务执⾏时传⼊的参数数据是否正常。
9.⽆限递归调⽤导致的栈内存溢出,如图-27所⽰:问题分析:基于错误检查⾃⼰写的类,哪⾥出现了循环递归调⽤。
10.JVM端⼝号被占⽤,如图-28所⽰其解决⽅案为:1. 关闭已启动的tomcat,重新启动。
2. 杀进程(windows)1. 查找进程id:netstat -ano|findstr "8080"2. 基于进程id杀进程:taskkill /f /pid 进程id11.URL响应资源不存在,如图-29所⽰:问题分析:检查tomcat启动是否OK,检查url对应的服务端资源是否匹配(客户端url与controller定义url),检查controller的包结构(所在包应在主启动类所在包的同包或⼦包中)。
基于mybatis的学生信息管理系统实训总结

基于mybatis的学生信息管理系统实训总结学生信息管理系统是一个常见的基于数据库的管理系统,通过MyBatis等框架的实现,可以实现对学生的信息管理、查询、修改和删除等操作。
以下是学生信息管理系统的实训总结:1、数据库设计和建模:首先需要进行数据库设计和建模,确定学生信息的数据结构,包括学生的基本信息(姓名、学号、性别等)和选课信息(课程名称、成绩等)。
同时需要确定数据表之间的关系,如学生和课程之间的关系。
2、MyBatis框架的配置和基本使用:MyBatis是一款优秀的ORM 框架,可以实现数据库操作和对象之间的映射。
在实训中需要掌握MyBatis框架的配置和使用方法,包括定义Mapper接口和XML映射文件,以及使用MyBatis进行数据库的增删改查操作。
3、学生信息管理功能的实现:学生信息管理是系统的核心功能,包括学生的基本信息查询、修改和删除,以及学生选课信息的查询和修改。
在实训中需要掌握如何使用MyBatis进行数据的查询和更新操作,以及如何通过前端界面实现对学生信息的操作和管理。
4、用户权限管理:学生信息管理系统需要设置用户权限管理,以保证学生信息的安全性和保密性。
在实训中需要实现用户注册、登录、权限分配等功能,同时需要保证用户信息的安全性和验证机制。
5、系统测试和调试:最后需要对系统进行测试和调试,确保系统的稳定性和正确性。
在实训中需要对系统的各个功能模块进行测试,并记录测试结果,及时发现和解决问题,确保系统的质量。
在实现学生信息管理系统时,需要注意以下几点:1、数据库设计和建模是系统的基础,需要充分考虑数据结构和关系的设计。
2、MyBatis框架的配置和使用是系统的关键,需要熟练掌握ORM 框架的基本原理和使用方法。
3、功能模块的实现需要注重代码的可读性和可维护性,遵循面向对象编程的基本原则。
4、用户权限管理是系统的安全保障,需要充分考虑用户验证、授权和安全保护机制的实现。
5、系统测试和调试是保证系统质量的重要环节,需要充分测试各个功能模块的正确性和稳定性。
MyBatis框架常见问题解析

MyBatis框架常见问题解析MyBatis是一种持久化框架,它简化了Java与数据库之间的交互。
尽管MyBatis使用起来相对容易,但在实际应用中,仍然会遇到一些常见的问题。
本文将对MyBatis框架的常见问题进行解析,帮助读者更好地理解和使用该框架。
一、连接数据库问题连接数据库是使用MyBatis框架的第一步,但在实践中可能会遇到一些连接数据库的问题。
以下是一些常见问题及解决方案:1. 数据库连接失败:MyBatis框架不能直接连接数据库,而是通过数据源来管理数据库连接。
因此,当数据库连接失败时,首先需要检查数据源的配置是否正确、数据库是否正常运行以及网络连接等因素。
2. 连接池问题:连接池的配置对于数据库连接的性能和稳定性至关重要。
如果连接池的配置不合理,可能导致数据库连接过多或者连接不释放,进而影响系统的性能。
解决该问题的方法包括调整连接池的大小、配置连接的最大空闲时间等。
二、SQL语句编写问题在使用MyBatis框架时,编写SQL语句是最常见的操作之一。
下面是一些SQL语句编写常见问题及解决方案:1. SQL注入问题:为了避免SQL注入漏洞,应该使用预编译的语句,而不是直接拼接SQL字符串。
同时,还可以使用参数化查询等方式来提高SQL的安全性。
2. 动态SQL问题:MyBatis框架允许使用动态SQL语句,但在实践中可能出现逻辑错误。
解决该问题的方法包括熟悉动态SQL的语法、使用if、choose和foreach等标签来构建复杂的SQL查询。
三、异常处理问题在使用MyBatis框架时,可能会遇到一些异常情况。
以下是一些常见的异常问题及解决方案:1. 数据库事务问题:在处理数据库操作时,可能遇到事务异常的情况。
解决该问题的方法包括配置事务管理器、使用@Transactional注解等方式来确保事务的正确提交和回滚。
2. 数据库乐观锁问题:在并发环境下,可能会出现数据库的乐观锁问题,导致数据的不一致性。
mybatis传入集合参数遍历查询总结

mybatis传⼊集合参数遍历查询总结出⾃:/u013628152/article/details/511846411. findByIds(List ids)如果参数的类型是List, 则在使⽤时,collection属性要必须指定为 list<select id="findByIdsMap" resultMap="BaseResultMap">Select<include refid="Base_Column_List"/>from jria where ID in<foreach item="item" index="index" collection="list" open="(" separator="," close=")">#{item}</foreach></select>2:findByIds(Long[] ids)如果参数的类型是Array,则在使⽤时,collection属性要必须指定为 array<select id="findByIdsMap" resultMap="BaseResultMap">select<include refid="Base_Column_List"/>from tabs where ID in<foreach item="item" index="index" collection="array" open="(" separator="," close=")">#{item}</foreach></select>3. findByIds(String name, Long[] ids)当查询的参数有多个时:这种情况需要特别注意,在传参数时,⼀定要改⽤Map⽅式, 这样在collection属性可以指定名称Map<String, Object> params = new HashMap<String, Object>(2);params.put("name", name);params.put("ids", ids);mapper.findByIdsMap(params);<select id="findByIdsMap" resultMap="BaseResultMap">select<include refid="Base_Column_List"/>from tabs wherename = #{name}and ID in<foreach item="item" index="index" collection="ids" open="(" separator="," close=")">#{item}</foreach></select>。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Mybatis总结1.mybatis的简单概述:1.1mybatis简单概述:MyBatis 是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。
MyBatis 避免了几乎所有的JDBC 代码和手动设置参数以及获取结果集。
MyBatis 可以使用简单的XML 或注解来配置和映射原生信息,将接口和Java 的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
1.2 功能架构:分为三层:(1).API接口层:定义api接口,外部人员通过这个接口来调用方法从而操纵数据库。
(2).数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。
它主要的目的是根据调用的请求完成一次数据库操作。
(3).基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。
为上层的数据处理层提供最基础的支撑。
2.mybatis快速入门:a. 添加jar包:mybatisasm-3.3.1.jarcglib-2.2.2.jarcommons-logging-1.1.1.jarlog4j-1.2.16.jarmybatis-3.1.1.jarslf4j-api-1.6.2.jarslf4j-log4j12-1.6.2.jarmysql驱动mysql-connector-java-5.1.7-bin.jarb. 建库+表:create database mybatis;use mybatis;CREATE TABLE users(id INT PRIMARY KEY AUTO_INCREMENT, NAMEVARCHAR(20), age INT);INSERT INTO users(NAME, age) VALUES('Tom', 12);INSERT INTO users(NAME, age) VALUES('Jack', 11);c. 在应用的src下添加Mybatis的配置文件conf.xml:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration PUBLIC "-////DTD Config 3.0//EN /dtd/mybatis-3-config.dtd"><configuration><environments default="development"><environment id="development"><transactionManager type="JDBC" /><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver" /><propert name="url value="jdbc:mysql://localhost:3306/mybatis" /><property name="username" value="root" /><property name="password" value="root" /></dataSource></environment></environments></configuration>d. 定义表所对应的实体类:public class User {private int id;private String name;private int age;}e. 定义操作users表的sql映射文件userMapper.xml:<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN""/dtd/mybatis-3-mapper.dtd"><mapper namespace="org.mybatis.example.BlogMapper"><select id="selectBlog" parameterType="int" resultType="Blog">select * from Blog where id = #{id}</select></mapper>f. 在conf.xml文件中注册userMapper.xml文件:<mappers><mapper resource="com/atguigu/day03_mybatis/test1/userMapper.xml"/> </mappers>g. 编写测试代码:执行定义的select语句:public class Test {public static void main(String[] args) throws IOException {String resource = "conf.xml";//加载mybatis的配置文件(它也加载关联的映射文件)Reader reader = Resources.getResourceAsReader(resource);//构建sqlSession的工厂SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);//创建能执行映射文件中sql的sqlSessionSqlSession session = sessionFactory.openSession();//映射sql的标识字符串String statement = "erMapper"+".selectUser";//执行查询返回一个唯一user对象的sqlUser user = session.selectOne(statement, 1);System.out.println(user);}}3. 编写基于mybatis的操作users表的CRUD操作的dao类:a. XML的实现:1. 定义sql映射xml文件:<insert id="insertUser" parameterType="er"> insert into users(name, age) values(#{name}, #{age});</insert><delete id="deleteUser" parameterType="int">delete from users where id=#{id}</delete><update id="updateUser" parameterType="er"> update users set name=#{name},age=#{age} where id=#{id}</update><select id="selectUser" parameterType="int" resultType="er">select * from users where id=#{id}</select><select id="selectAllUsers" resultType="er"> select * from users</select>2. 在config.xml中注册这个映射文件<mapper resource="net/lamp/java/ibatis/bean/userMapper.xml"/>3. 在dao中调用:public User getUserById(int id) {SqlSession session = sessionFactory.openSession();User user = session.selectOne(URI+".selectUser", id);return user;}b. 注解的实现:1. 定义sql映射的接口public interface UserMapper {@Insert("insert into users(name, age) values(#{name}, #{age})")public int insertUser(User user);@Delete("delete from users where id=#{id}")public int deleteUserById(int id);@Update("update users set name=#{name},age=#{age} where id=#{id}")public int updateUser(User user);@Select("select * from users where id=#{id}")public User getUserById(int id);@Select("select * from users")public List<User> getAllUser();}2. 在config中注册这个映射接口<mapper class="erMapper"/>3. 在dao类中调用public User getUserById(int id) {SqlSession session = sessionFactory.openSession();UserMapper mapper = session.getMapper(UserMapper.class);User user = mapper.getUserById(id);return user;}4. 几个可以优化的地方:a. 连接数据库的几个配置可以单独放在一个properties文件中db.properties:<properties resource="db.properties"/><property name="driver" value="${driver}" /><property name="url" value="${url}" /><property name="username" value="${username}" /><property name="password" value="${password}" />b. 为实体类定义别名,简化sql映射xml文件中的引用<typeAliases><typeAlias type="er" alias="_User"/> </typeAliases>c. 可以在src下加入log4j的配置文件,打印日志信息(主要是sql语句)1. log4j.propertieslog4j.properties,log4j.rootLogger=DEBUG, Console#Consolelog4j.appender.Console=org.apache.log4j.ConsoleAppenderyout=org.apache.log4j.PatternLayoutyout.ConversionPattern=%d [%t] %-5p [%c] - %m%nlog4j.logger.java.sql.ResultSet=INFO.apache=INFOlog4j.logger.java.sql.Connection=DEBUGlog4j.logger.java.sql.Statement=DEBUGlog4j.logger.java.sql.PreparedStatement=DEBUG5. 解决表的字段名与实体类的属性名不相同的冲突:a. 准备表和数据:CREATE TABLE orders(order_id INT PRIMARY KEY AUTO_INCREMENT,order_no VARCHAR(20),order_price FLOAT);INSERT INTO orders(order_no, order_price) VALUES('aaaa', 23);INSERT INTO orders(order_no, order_price) VALUES('bbbb', 33);INSERT INTO orders(order_no, order_price) VALUES('cccc', 22);b. 定义实体类:public class Order {private int id;private String orderNo;private float price;}c. 实现getOrderById(id)的查询定义<resultMap>:<select id="selectOrderResultMap" parameterType="int" resultMap="orderResultMap"> select * from orders where order_id=#{id}</select><resultMap type="_Order" id="orderResultMap"><id property="id" column="order_id"/><result property="orderNo" column="order_no"/><result property="price" column="order_price"/></resultMap>6. 实现联表查询:1). 一对一:a. 创建表和数据:CREATE TABLE teacher(t_id INT PRIMARY KEY AUTO_INCREMENT,t_name VARCHAR(20));CREATE TABLE class(c_id INT PRIMARY KEY AUTO_INCREMENT,c_name VARCHAR(20),teacher_id INT);ALTER TABLE class ADD CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id) REFERENCES teacher(t_id);INSERT INTO teacher(t_name) VALUES('LS1');INSERT INTO teacher(t_name) VALUES('LS2');INSERT INTO class(c_name, teacher_id) VALUES('bj_a', 1);INSERT INTO class(c_name, teacher_id) VALUES('bj_b', 2);b. 定义实体类:public class Teacher {private int id;private String name;}public class Classes {private int id;private String name;private Teacher teacher;}c. 定义sql映射文件ClassMapper.xml:<!-- 方式一:嵌套查询方式, 通过执行另外一个SQL映射语句来返回预期的复杂类型--><select id="getClasses" parameterType="int"resultMap="ClassesResultMap2">select * from class where c_id=#{id}</select><resultMap type="CLasses" id="ClassesResultMap2"><id column="c_id" property="id"/><result column="c_name" property="name"/><association property="teacher" javaType="Teacher" column="teacher_id" select="getTeacher"></association></resultMap><select id="getT eacher" parameterType="int" resultType="Teacher">select t_id id, t_name name from teacher where t_id=#{id}</select><!--方式二:嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集--><select id="getClasses2" parameterType="int" resultMap="ClassesResultMap"> select * from class c,teacher t where c.c_id=#{id} and c.teacher_id=t.t_id;</select><resultMap type="Classes" id="ClassesResultMap"><id column="c_id" property="id"/><result column="c_name" property="name"/><association column="teacher_id" property="teacher" javaType="Teacher"><id column="t_id" property="id"/><result column="t_name" property="name"/></association></resultMap>2) 一对多a. 创建表和数据:CREATE TABLE student(s_id INT PRIMARY KEY AUTO_INCREMENT,s_name VARCHAR(20),class_id INT);INSERT INTO student(s_name, class_id) VALUES('xs_B', 1);INSERT INTO student(s_name, class_id) VALUES('xs_D', 1);INSERT INTO student(s_name, class_id) VALUES('xs_E', 1);INSERT INTO student(s_name, class_id) VALUES('xs_A', 2);INSERT INTO student(s_name, class_id) VALUES('xs_H', 2);INSERT INTO student(s_name, class_id) VALUES('xs_J', 2);b. 定义实体类:public class Student {private int id;private String name;}public class Classes {private int id;private String name;private Teacher teacher;private List<Student> students;}c. 定义sql映射文件ClassMapper.xml:(根据classId查询对应的班级信息,包括学生)<!-- 集合的嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集--><select id="getClasses3" parameterType="int" resultMap="ClassesResultMap3"> select * from class c,teacher t, student s where c.c_id=#{id} and c.teacher_id=t.t_id and s.class_id=c.c_id</select><resultMap type="Classes" id="ClassesResultMap3"><id column="c_id" property="id"/><result column="c_name" property="name"/><association column="teacher_id" property="teacher" javaType="Teacher"><id column="t_id" property="id"/><result column="t_name" property="name"/></association><collection property="students" ofType="Student" javaType="ArrayList"><id property="id" column="s_id" /><result property="name" column="s_name"/></collection></resultMap><!-- 集合的嵌套查询方式, 通过执行另外一个SQL映射语句来返回预期的复杂类型--><select id="getClasses4" parameterType="int" resultMap="ClassesResultMap4">select * from class c where c.c_id=#{id}</select><resultMap type="CLasses" id="ClassesResultMap4"><id column="c_id" property="id"/><result column="c_name" property="name"/><association property="teacher" javaType="Teacher" column="teacher_id" select="getTeacher"></association><collection property="students" ofType="T eacher" column="c_id" select="getStudentsSelect" ></collection></resultMap><select id="getT eacher" parameterType="int" resultType="Teacher">select t_id id, t_name name from teacher where t_id=#{id}</select><select id="getStudentsSelect" parameterType="int" resultType="Student" > select s_id id, s_name name from student where class_id=#{id} </select>。