解决一对多
一对多对应的是Dept对象中的emps,因为一个Dept可以有多个的Emp属于它,因此它可以包含多个的Emp对象,因此需要一个List集合去包含它.
1:使用collection标签
这种方法和上面那种使用association根标签填充dept对象的方法差不多,也是通过多表查询把查询到的数据填充到emp属性里面
<resultMap id="getDeptAndEmpMap" type="dept"> <id property="did" column="did"></id> <result property="deptName" column="dept_name"></result> <!-- collectiojn:处理一对多的映射关系 ofType:表示该属性所对应的集合中存储数据的类型 --> <collection property="emps" ofType="Emp"> <id property="eid" column="eid"></id> <result property="empName" column="emp_name"></result> <result property="age" column="age"></result> <result property="sex" column="sex"></result> <result property="email" column="email"></result> </collection> </resultMap> <select id="getDeptAndEmp" resultMap="getDeptAndEmpMap"> select * from my_dept left join my_emp on my_dept.did = my_emp.did where my_dept.did = #{did} </select>
2:使用分布查询
一对多的发布查询和刚才的多对一的发布查询差不多 ,不多赘述
<resultMap id="getDeptAndEmpByStepOne" type="dept"> <id property="did" column="did"></id> <result property="deptName" column="dept_name"></result> <collection property="emps" select="com.learn.mybatis.mapper.EmpMapper.getDeptAndEmpByStepTwo" column="did"></collection> </resultMap> <select id="getDeptAndEmpByStepOne" resultMap="getDeptAndEmpByStepOne"> select * from my_dept where did = #{did} </select>
4:动态SQL
根据标签中的内容是否为空来判断是否需要添加判断语句
1:使用if标签
<select id="getEmptyByCondition" resultType="emp"> select * from my_emp where 1=1 <if test="empName!=null and empName!=''"> and emp_name=#{empName} </if> <if test="age!=null and age!=''"> and age=#{age} </if> <if test="sex!=null and sex!=''"> and sex=#{sex} </if> <if test="email!=null and email!=''"> and email=#{email} </if> </select>
2:使用where标签
当where标签中有内容的时候,会自动生成where关键字,并且将内容前多余的and或or去掉,当where标签中没有内容时,此时where标签没有任何效果.并且需要注意,where标签不能将其中内容后的多余and或者or去掉
<select id="getEmptyByCondition" resultType="emp"> select * from my_emp <where> <if test="empName!=null and empName!=''"> emp_name=#{empName} </if> <if test="age!=null and age!=''"> and age=#{age} </if> <if test="sex!=null and sex!=''"> and sex=#{sex} </if> <if test="email!=null and email!=''"> and email=#{email} </if> </where> </select>
3:trim标签
prefix|suffix:将trim标签中内容前面或后面添加指定内容
suffixOverrides|prefixOverrides:将trim标签中内容前面或者后面去掉指定内容
若标签中没有内容的时候,trim标签也没有任何效果
<select id="getEmptyByCondition" resultType="emp"> select * from my_emp <trim suffix="" prefix="where" suffixOverrides="and|or"> <if test="empName!=null and empName!=''"> emp_name=#{empName} and </if> <if test="age!=null and age!=''"> age=#{age} and </if> <if test="sex!=null and sex!=''"> sex=#{sex} and </if> <if test="email!=null and email!=''"> email=#{email} </if> </trim> </select>
4:choose,when,otherwise
<select id="getEmptyByChoose" resultType="emp"> select * from my_emp <where> <choose> <when test="empName!=null and empName!=''"> emp_name=#{empName} </when> <when test="age!=null and age!=''"> age=#{age} </when> <when test="sex!=null and sex!=''"> sex=#{sex} </when> <when test="email!=null and email!=''"> email=#{email} </when> <otherwise> did = 1 </otherwise> </choose> </where> </select>
5:foreach批量操作
* collection:设置需要循环的数组或集合 * item:表示数组或集合中的每一个数据 * separator:循环体之间的分割符 * open:foreach标签所循环的所有内容的开始符 * close:foreach标签所循环的所有内容的结束符
<delete id="deleteMoreByArray"> delete from my_emp where <foreach collection="eids" item="eid" separator="or"> eid = #{eid} </foreach> </delete> <insert id="insertMoreByList"> insert into my_emp values <foreach collection="emps" item="emp" separator=","> (null,#{emp.empName},#{emp.age},#{emp.sex},#{emp.email},null) </foreach> </insert>
5:mybatis的逆向工程
首先这个东西需要先导入对应的jar包,使用的是maven工程
maven工程中加入这些语句
<!-- 控制Maven在构建过程中相关配置 --> <build> <!-- 构建过程中用到的插件 --> <plugins> <!-- 具体插件,逆向工程的操作是以构建过程中插件形式出现的 --> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.0</version> <!-- 插件的依赖 --> <dependencies> <!-- 逆向工程的核心依赖 --> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.2</version> </dependency> <!-- 数据库连接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.8</version> </dependency> <!-- MySQL驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.41</version> </dependency> </dependencies> </plugin> </plugins> </build>
如果需要使用MBG需要先创建一个名字为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> <!-- targetRuntime: 执行生成的逆向工程的版本 MyBatis3Simple: 生成基本的CRUD(清新简洁版) MyBatis3: 生成带条件的CRUD(奢华尊享版) --> <context id="DB2Tables" targetRuntime="MyBatis3"> <!-- 数据库的连接信息 --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/test" userId="root" password="root"> </jdbcConnection> <!-- javaBean的生成策略--> <javaModelGenerator targetPackage="com.learn.ssm.bean" targetProject=".\src\main\java"> <property name="enableSubPackages" value="true" /> <property name="trimStrings" value="true" /> </javaModelGenerator> <!-- SQL映射文件的生成策略 --> <sqlMapGenerator targetPackage="mapper" targetProject=".\src\main\resources"> <property name="enableSubPackages" value="true" /> </sqlMapGenerator> <!-- Mapper接口的生成策略 --> <javaClientGenerator type="XMLMAPPER" targetPackage="com.learn.ssm.dao" targetProject=".\src\main\java"> <property name="enableSubPackages" value="true" /> </javaClientGenerator> <!-- 逆向分析的表 --> <!-- tableName设置为*号,可以对应所有表,此时不写domainObjectName --> <!-- domainObjectName属性指定生成出来的实体类的类名 --> <table tableName="my_emp" domainObjectName="Emp"/> <table tableName="my_dept" domainObjectName="Dept"/> </context> </generatorConfiguration>
之后双击加载MBG即可
也可以使用java来创建,如果用java来创建那么就只需要导入一个jar包而不需要写上build等语句在maven中
同时由于使用MBG生成的注释比较多,因此可以选择关闭注释
Mybatis-Plus
1:基本使用
Mybatis-Plus的使用只需要在你需要添加功能的接口上继承BaseMapper即可,同时要求接口对应的pojo实体类对象的表名要与实体类对象类名一样.