模糊分页级联查询与逆向生成
一、模糊分页级联查询
级联查询为多表查询操作,主表关联从表的形式,一共有两种情况,①、一对多的情况,以“一”为主表,需在主表的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, 为添加的分页和级联功能,有了这两个依赖和这个配置,可实现逆向生成文件的级联和分页操作。