java学习笔记——mybatis 之 两个关于mybatis知识的补充(MBG-逆向工程 与 分页插件pageHelper)

                                              MBG-逆向工程

 

MBG:MyBatis Generator:代码生成器;

MyBatis官方提供的代码生成器;帮我们逆向生成;

正向:

table----javaBean---BookDao---dao.xml---xxx

逆向工程:

(table表需要我们自己创建)根据数据表table,逆向分析数据表,自动生成javaBean---BookDao---dao.xml---xxx

 

1、导包:mbg的核心包

mybatis-generator-core-1.3.2.jar

2、编写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>

    <!--
    MyBatis3Simple:基础班CRUD
    MyBatis3:复杂版CRUD
     -->
    <context id="DB2Tables" targetRuntime="MyBatis3">
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <!-- jdbcConnection:指导连接到哪个数据库 -->
        <jdbcConnection

            driverClass="com.mysql.jdbc.Driver"
            connectionURL="jdbc:mysql://localhost:3306/mybatis_0325"

            userId="root"

            password="123456">
        </jdbcConnection>

        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <!-- javaModelGenerator:生成pojo

        targetPackage:生成的pojo放在哪个包
        targetProject:放在哪个工程下
        -->
        <javaModelGenerator targetPackage="com.atguigu.bean"
            targetProject=".\src">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>

        <!--sqlMapGenerator:sql映射文件生成器;指定xml生成的地方  -->
        <sqlMapGenerator targetPackage="com.atguigu.dao"
            targetProject=".\conf">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>

        <!-- javaClientGenerator:dao接口生成的地方 -->
        <javaClientGenerator type="XMLMAPPER"
            targetPackage="com.atguigu.dao"

            targetProject=".\src">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>

        <!-- table:指定要逆向生成哪个数据表
        tableName="t_cat":表名
        domainObjectName="":这个表对应的对象名
         -->
        <table tableName="t_cat" domainObjectName="Cat"></table>
        <table tableName="t_employee" domainObjectName="Employee"></table>
        <table tableName="t_teacher" domainObjectName="Teacher"></table>

    </context>
</generatorConfiguration>

3、运行代码生成

package com.atguigu.test;

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

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

public class MBGTest {

    public static void main(String[] args) 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);
        System.out.println("生成ok了!");
    }

}

自动生成的bean文件  dao文件 和 xml文件 以及配置文件的位置和需要的jar包

4、测试复杂查询

package com.atguigu.test;

import static org.junit.Assert.*;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import com.atguigu.bean.Teacher;
import com.atguigu.bean.TeacherExample;
import com.atguigu.bean.TeacherExample.Criteria;
import com.atguigu.dao.TeacherMapper;



public class MyBatisTest {

    // 工厂一个
    SqlSessionFactory sqlSessionFactory;


    @Test
    public void test02(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //1、测试
        TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
        List<Teacher> teachers = new ArrayList<Teacher>();
        for (int i = 0; i < 1000; i++) {
            Teacher teacher = new Teacher();
            teacher.setTeachername(UUID.randomUUID().toString().substring(0, 5));
            teacher.setClassName(UUID.randomUUID().toString().substring(0, 5));
            teachers.add(teacher);
        }
        System.out.println("批量保存.....");
        mapper.insertBatch(teachers);
        sqlSession.commit();
        sqlSession.close();


    }

    /**
     * 测试代码生成器
     * @throws IOException
     */
    @Test
    public void test01(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //1、测试
        TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
        //2、测试查询所有teacher
        List<Teacher> list = mapper.selectByExample(null);
        for (Teacher teacher : list) {
            System.out.println(teacher);
        }

        //3、带复杂条件的查询
        //select * from t_teacher id=? and teacherName like ?
        //封装查询条件的
        TeacherExample example = new TeacherExample();
        example.setOrderByClause("id DESC");
        //1、使用example创建一个Criteria(查询准则)
        Criteria criteria = example.createCriteria();
        criteria.andIdEqualTo(1);
        criteria.andTeachernameLike("%a%");

        System.out.println("======================");
        List<Teacher> list2 = mapper.selectByExample(example);
        for (Teacher teacher : list2) {
                System.out.println(teacher);
        }

        /**
         * 多个复杂条件
         * select * from t_teacher where  (id=? and teacherName like ?) or (address like ? and birth bet)
         */
        TeacherExample example2 = new TeacherExample();


        //一个Criteria能封装一整个条件
        Criteria criteria2 = example2.createCriteria();
        criteria2.andIdGreaterThan(1);
        criteria2.andTeachernameLike("%a%");

        //创建第二个查询条件
        Criteria criteria3 = example2.createCriteria();
        criteria3.andAddressLike("%%");
        criteria3.andBirthDateBetween(new Date(), new Date());

        example2.or(criteria3);
        System.out.println("=======-=-=-=-=-=-=-");
        mapper.selectByExample(example2);

    }

    @Before
    public void initSqlSessionFactory() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }

}

该工程下载地址:https://download.csdn.net/download/qq_25106373/10941786

 

 

                                plugin插件-pageHelper使用

mybatis中是可以添加插件的,这里我们使用分页插件pageHelper作为添加对象,pageHelper这个插件还是很好用的,使用起来也很简单方便。

1,导入jar包(两个):

jsqlparser-0.9.5.jar

pagehelper-5.0.3.jar

2,这里需要配置mybatis的全局配置文件:

添加plugins属性,添加时注意,全局配置文件中的属性配置顺序是有要求的,如果属性不对会报错的!!!

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

	<settings>
		<setting name="lazyLoadingEnabled" value="true"/>
		<setting name="aggressiveLazyLoading" value="false"/>
		<setting name="cacheEnabled" value="true"/>
	</settings>
	<plugins>
		<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
	</plugins>
	
</configuration>

3,直接使用PageHelper类就可以编写测试代码,列如:

PageHelper.startPage(pn, 5); pn为取得分页后的第pn页,5为每页有5条数据;PageHelper.startPage(pn, 5)方法必须要在查询语句之前使用,PageHelper.startPage(pn, 5);
        List<Teacher> list = teacherService.getAll();这样list的结果就是分页后总数据中第pn页的数据;

PageInfo通常与PageHelper配合使用,他封装了非常多的信息,列如:

PageInfo<Teacher> info = new PageInfo<>(list, 6);将上面取得的第pn页的数据封装成PageInfo,并且设置连续分页数为6,连续分页就是页面选择最多可以显示的个数,列如这样:

这样我们在使用int[] nums = info.getNavigatepageNums()方法的时候,所取得的页数数组就是包括当前页在内的,并且连续的,6个数的数组,在web中的应用可以这样使用:

TeacherController.java

package com.atguigu.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.atguigu.bean.Teacher;
import com.atguigu.service.TeacherService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

@Controller
public class TeacherController {
	
	@Autowired
	TeacherService teacherService;
	
	@RequestMapping("/getTea")
	public String getTeacher(@RequestParam(value="id",defaultValue="1")Integer id,Model model){
		Teacher t = teacherService.getTeacher(id);
		model.addAttribute("teacher", t );
		return "success";
	}
	
	@RequestMapping("/getall")
	public String getAll(@RequestParam(value="pn",defaultValue="1")Integer pn,Model model){
		//紧跟他的查询就是一个分页查询
		PageHelper.startPage(pn, 5);
		List<Teacher> list = teacherService.getAll();
		
		//我们可以将查询的结果使用;将查询的结果放在pageinfo中这个pageInfo就有非常多能够用的
		//第二份传入连续要显示的页码
		PageInfo<Teacher> info = new PageInfo<>(list, 6);
		System.out.println("当前页码:"+info.getPageNum());
		System.out.println("总页码:"+info.getPages());
		System.out.println("总记录数:"+info.getTotal());
		System.out.println("当前页有几条记录:"+info.getSize());
		System.out.println("当前页的pageSize:"+info.getPageSize());
		System.out.println("前一页:"+info.getPrePage());
		System.out.println("结果:"+info.getList());//查询结果
		int[] nums = info.getNavigatepageNums();
		
		model.addAttribute("info", info);
		return "success";
	}

}

 

success.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>成功!</h1>
	<table cellpadding="5" cellspacing="0" border="1">
		<tr>
			<th>id</th>
			<th>name</th>
			<th>course</th>
			<th>address</th>
		</tr>
		<c:forEach items="${info.list}" var="tea">
			<tr>
				<td>${tea.id }</td>
				<td>${tea.name }</td>
				<td>${tea.course }</td>
				<td>宝安区</td>
			</tr>
		</c:forEach>
		<tr>
			<td colspan="4">
				<a href="getall?pn=1">首页</a><a href="getall?pn=${info.prePage }">上一页</a> 
				
				<c:forEach items="${info.navigatepageNums}" var="num">
					<c:if test="${num == info.pageNum }">
							【${num }】
					</c:if>
					<c:if test="${num != info.pageNum }">
							<a href="getall?pn=${num }">${num }</a>
					</c:if>
				</c:forEach>
				
				<a href="getall?pn=${info.nextPage }">下一页</a><a href="getall?pn=${info.pages }">末页</a>
			
			</td>
		</tr>
	</table>
	
</body>
</html>

 是不是很方便!!!

工程下载地址:https://download.csdn.net/download/qq_25106373/10934483

该工程是ssm整个的一个demo,里边包括分页插件pageHelper的使用和需要的jar包,jar包名字已经写在上边了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值