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包名字已经写在上边了。