模糊分页级联查询与逆向生成

博客介绍了模糊分页级联查询与逆向生成。级联查询分一对多和多对一两种情况,在接口、映射文件定义方法和语句,还给出测试类。逆向生成需新建maven项目,配置依赖、构建模板,修改五处配置,创建启动方法。此外,添加特定依赖和配置可实现逆向生成的级联和分页。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模糊分页级联查询与逆向生成

一、模糊分页级联查询

级联查询为多表查询操作,主表关联从表的形式,一共有两种情况,①、一对多的情况,以“一”为主表,需在主表的JavaBean中关联从表,这里以emp和dept两张表为例,需封装一个private List emps;②、多对一的情况,以“多”为主表,在主表的JavaBean中关联从表,如:private Dept dept;

在接口中定义方法,代码如下:


    //模糊分页级联查询--N-1
    List<Emp> selectLikePageEmps(Map map);

    //级联查询--1-N
    Dept selectDept(int deptId);

在映射文件中,数据库查询语句两个表用内外连接都可以,此处引入resultMap标签,该标签有id和result子标签,id为主表的id属性,property属性对应JavaBean封装的属性,column属性对应数据库列名,大小写需一致。多对一的情况从表用association标签连接,property属性为emp中关联从表dept后的属性名,JavaType为包扫描的别名。一对多的情况下,从表用collection标签连接,property属性为javaBean中关联的从表的属性名,ofType为包扫描的别名。代码如下:

<!--模糊分页级联查询-->
    <resultMap id="emps_dept" type="emp">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="age" column="age"/>
        <result property="sex" column="sex"/>
        <result property="salary" column="salary"/>
        <result property="bonus" column="bonus"/>
        <result property="birth" column="birth"/>
        <result property="hiredate" column="hiredate"/>
        <result property="leader" column="leader"/>
        <result property="deptId" column="deptId"/>
       <association property="dept" javaType="dept">
           <id property="deptid" column="deptid"/>
           <result property="dep" column="dep"/>
       </association>
    </resultMap>
    <select id="selectLikePageEmps" parameterType="map" resultMap="emps_dept">
select * from emp e inner join dept d on e.deptId=d.deptid
<where>
    <if test="name!=null">
        name like concat("%",#{name},"%")
    </if>
</where>
limit #{start},#{size}
    </select>

    <!--级联查询  1—N-->
    <resultMap id="dept_emps" type="dept">
        <id property="deptid" column="deptid"/>
        <result property="pet" column="pet"/>
        <collection property="emps" ofType="Emp">
            <id property="id" column="id"/>
            <result property="name" column="name"/>
            <result property="age" column="age"/>
            <result property="sex" column="sex"/>
            <result property="salary" column="salary"/>
            <result property="bonus" column="bonus"/>
            <result property="birth" column="birth"/>
            <result property="hiredate" column="hiredate"/>
            <result property="leader" column="leader"/>
            <result property="deptId" column="deptId"/>
        </collection>
    </resultMap>
    <select id="selectDept" parameterType="int" resultMap="dept_emps">
        select * from dept d inner join emp e on d.deptid=e.deptId where d.deptid=#{deptid}
    </select>

测试类:

  private SqlSession sqlSession;
    @Before
    public void init(){
        try {

            //读取核心配置文件
            InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");
            //找一个建筑者盖工厂
            SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
            //构建工厂
            SqlSessionFactory factory = builder.build(is);
            //工厂生产SQLSession对象
            sqlSession = factory.openSession();
            //SQLSession对象代理增删改查

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
  //模糊分页级联查询
    @Test
    public void selectLikePageEmps(){
        HashMap map = new HashMap();
        map.put("start",0);
        map.put("size",4);
        List<Emp> emps = sqlSession.getMapper(IPetDao.class).selectLikePageEmps(map);
        System.out.println(emps);
    }


    //级联查询--1—N
    @Test
    public  void selectDept(){
        Dept dept = sqlSession.getMapper(IPetDao.class).selectDept(5);
        System.out.println(dept);
    }
    @After
    public void destroy(){
        try{
            sqlSession.commit();//提交
        }catch (Exception e){
            sqlSession.rollback();//回滚
        }finally {
            sqlSession.close();//关闭
        }
    }

二、逆向生成文件

为防止破坏原项目包结构,故需新建一个maven项目,在main包下创建java和resources两个包,分表Mark成数据文件夹和resources文件夹,配置myBatis、org.myBatis.generator 1.3.5以及mysql5.1.38依赖,构建mbg.xml模板,修改模板中的五处配置,分别为:1、连接数据库信息 2、pojo类的生成配置 3、sql映射文件生成的位置 4、mapper接口的配置 5、数据库表和实体类映射,创建自动生成的启动方法。然后在resources文件中创建sqlMapConfig.xml文件,在properties文件夹中创建db.properties文件,在测试类中启动,代码如下:

mbg.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="DB2Tables" targetRuntime="MyBatis3">
        <!--分页插件-->
        <plugin type="com.itfsw.mybatis.generator.plugins.LimitPlugin"/>

        <commentGenerator>
            <!-- 是否去除注释,true表示是,false否 -->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <!-- 1.连接数据库信息 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/k9503?characterEncoding=UTF-8"
                        userId="root"
                        password="123456">
        </jdbcConnection>
        <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
            NUMERIC 类型解析为java.math.BigDecimal -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>
        <!-- 2.pojo类的生成配置  targetPackage表示目标文件夹
		targetProject表示当前目标文件夹所放置的目标地址
	 -->
        <javaModelGenerator targetPackage="com.pojo" targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!-- 3.sql映射文件生成配置 -->
        <sqlMapGenerator targetPackage="mapper" targetProject=".\src\main\resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
        <!-- 4.mapper接口配置 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.mapper" targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>
        <!-- 5.数据库表和实体类映射 -->
        <table tableName="emp" domainObjectName="Emp">
        </table>
        <table tableName="dept" domainObjectName="Dept">
        </table>
    </context>
</generatorConfiguration>

pom.xml中的依赖配置

 <dependency>
            <groupId>com.itfsw</groupId>
            <artifactId>mybatis-generator-plugin</artifactId>
            <version>1.0.5</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-nop</artifactId>
            <version>1.7.25</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>
        <dependency>
            <groupId>serverRepository.org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.5</version>
        </dependency>

测试类中的启动方法:


@Test
    public void create() throws Exception {
        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        File configFile = new File("mbg.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(configFile);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);
    }

测试类中的测试方法:

private SqlSession sqlSession;
    @Before
public void init() throws Exception {
    InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
    sqlSession = factory.openSession();
}
@Test
    public void test1(){
    EmpExample ex = new EmpExample();
    EmpExample.Criteria c = ex.createCriteria();

    Emp emp = sqlSession.getMapper(EmpMapper.class).selectByPrimaryKey(1);
    System.out.println(emp);
}
@After
    public void dectroy(){
    if(sqlSession!=null){
        try{
            sqlSession.commit();
        }catch (Exception e){
            sqlSession.rollback();
        }finally {
            sqlSession.close();
        }
    }
}

扩展:

逆向生成不支持级联和分页,但现在有办法实现级联和分页,上方pom配置文件中的mybatis-generator-plugin,org.slf4j, 为添加的分页和级联功能,有了这两个依赖和这个配置,可实现逆向生成文件的级联和分页操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

甜甜圈的小饼干

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值