MyBatis逆向工程,简称MBG。是一个专门为MyBatis框架使用者定制的代码生成器。可以快速的根据表生成对应的映射文件,接口,以及Bean类对象。
在Mybatis中,有一个可以自动对单表生成的增,删,改,查代码的插件。
叫 mybatis-generator-core-1.3.2。
它可以帮我们对比数据库表之后,生成大量的这个基础代码。
这些基础代码有:
1、数据库表对应的javaBean对象
2、这些javaBean对象对应的Mapper接口
3、这些Mapper接口对应的配置文件
16.1、准备数据库表
create database mbg; use mbg; create table t_user( `id` int primary key auto_increment, `username` varchar(30) not null unique, `password` varchar(40) not null, `email` varchar(50) ); insert into t_user(`username`,`password`,`email`) values('admin','admin','admin@atguigu.com'); insert into t_user(`username`,`password`,`email`) values('wzg168','123456','admin@atguigu.com'); insert into t_user(`username`,`password`,`email`) values('admin168','123456','admin@atguigu.com'); insert into t_user(`username`,`password`,`email`) values('lisi','123456','admin@atguigu.com'); insert into t_user(`username`,`password`,`email`) values('wangwu','123456','admin@atguigu.com'); create table t_book( `id` int primary key auto_increment, `name` varchar(50), `author` varchar(50), `price` decimal(11,2), `sales` int, `stock` int, `img_path` varchar(100) ); ## 插入初始化测试数据 insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`) values(null , 'java从入门到放弃' , '国哥' , 80 , 9999 , 9 , 'static/img/default.jpg'); insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`) values(null , '数据结构与算法' , '严敏君' , 78.5 , 6 , 13 , 'static/img/default.jpg'); insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`) values(null , '怎样拐跑别人的媳妇' , '龙伍' , 68, 99999 , 52 , 'static/img/default.jpg'); insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`) values(null , '木虚肉盖饭' , '小胖' , 16, 1000 , 50 , 'static/img/default.jpg'); insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`) values(null , 'C++编程思想' , '刚哥' , 45.5 , 14 , 95 , 'static/img/default.jpg'); insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`) values(null , '蛋炒饭' , '周星星' , 9.9, 12 , 53 , 'static/img/default.jpg'); insert into t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`) values(null , '赌神' , '龙伍' , 66.5, 125 , 535 , 'static/img/default.jpg'); select * from t_user; select * from t_book;
16.2、生成一个java工程
导入下面的包:
log4j-1.2.17.jar
mybatis-3.2.8.jar
mybatis-generator-core-1.3.2.jar
mysql-connector-java-5.1.7-bin.jar
在src目录下准备log4j.properties配置文件
# Global logging configuration log4j.rootLogger=DEBUG, stdout # MyBatis logging configuration... #log4j.logger.org.mybatis.example.BlogMapper=TRACE # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
16.3、准备 mybatis-generator-core 的配置文件
<?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 表示带有单表的简单的增,删,改,查 MyBatis3 表示带有单表的增,删,改,查,之外,还有类似Hiberante 的 QBC复杂查询 --> <context id="DB2Tables" targetRuntime="MyBatis3"> <!-- 去掉全部的注释 --> <commentGenerator> <property name="suppressAllComments" value="true" /> </commentGenerator> <!-- jdbcConnection 为数据库连接的四要素信息。 请修改成为你自己的内容 --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/mbg" userId="root" password="root"> </jdbcConnection> <javaTypeResolver > <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <!-- javaModelGenerator 生成表对应的javaBean targetPackage 属性设置生成的类的包名 targetProject 属性设置生成的工程的路径 一般生成为当前工程。写为 .\ --> <javaModelGenerator targetPackage="com.bean" targetProject=".\src"> <property name="enableSubPackages" value="true" /> <property name="trimStrings" value="true" /> </javaModelGenerator> <!-- sqlMapGenerator 生成表对应的sql的xml配置文件 targetPackage 属性设置生成的sql配置文件的包名 targetProject 属性设置生成的工程的路径 一般生成为当前工程。写为 .\ --> <sqlMapGenerator targetPackage="com.mapper" targetProject=".\src"> <property name="enableSubPackages" value="true" /> </sqlMapGenerator> <!-- javaClientGenerator 生成mybatis客户端的代码 ===dao或mapper之类 targetPackage 属性设置生成的mybatis的调用代码,比如mapper之类的接口 targetProject 属性设置生成的工程的路径 一般生成为当前工程。写为 .\ --> <javaClientGenerator type="XMLMAPPER" targetPackage="com.mapper" targetProject=".\src"> <property name="enableSubPackages" value="true" /> </javaClientGenerator> <!-- table 配置哪些表需要我们映射生成java代码 tableName 是表名 domainObjectName 是javaBean名 --> <table tableName="t_user" domainObjectName="User"></table> <table tableName="t_book" domainObjectName="Book"></table> </context> </generatorConfiguration>
16.4、用于生成的java代码
public static void main(String[] args) throws Exception, Exception { List<String> warnings = new ArrayList<String>(); boolean overwrite = true; // 配置文件的名称 mbg_config.xml File configFile = new File("mbg_config.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); }
17、mybatis插件的开发
17.1、mybatis的源码分析
mybatis框架中有四大对象:
Executor 负责update, query, flushStatements, commit, rollback, getTransaction, close, isClosed
ParameterHandler 负责getParameterObject, setParameters
ResultSetHandler 负责handleResultSets, handleOutputParameters
StatementHandler 负责prepare, parameterize, batch, update, query
过滤器相关:
InterceptorChain 过滤器链 管理管理和调用全部的过滤器执行
Interceptor 过滤器 负责拦截Executor、ParameterHandler、ResultsetHandler、StatementHandler
17.3、mybatis的分页插件pageHelper使用
1、先导入mybatis-pageHelper的jar包。
2、到mybatis-config.xml核心配置文件中配置 分页的拼接器。
<plugins> <!-- com.github.pagehelper为PageHelper类所在包名 --> <plugin interceptor="com.github.pagehelper.PageInterceptor"> </plugin> </plugins>
3、使用mybatis-pageHelper示例代码:
@Test public void testQueryUsers() { SqlSession session = sqlSessionFactory.openSession(); try { Page<User> page = PageHelper.startPage(1, 5); UserMapper userMapper = session.getMapper(UserMapper.class); List<User> list = userMapper.queryUsers(); System.out.println("当前页:" + page.getPageNum()); System.out.println("总页数:" + page.getPages()); System.out.println("每页显示数量:" + page.getPageSize()); System.out.println("总记录数:" + page.getTotal()); System.out.println("当前页数据:" + page.getResult()); System.out.println(page); for (User user : list) { System.out.println(user); } } finally { session.close(); } }
4、测试结果:
17.4、PageInfo类的使用。
PageInfo 类是专门给分页使用的一个类。可以方便的帮我们计算出需要显示的页码。使用起来也很简单。
使用示例:
@Test public void testQueryUsers() { SqlSession session = sqlSessionFactory.openSession(); try { UserMapper userMapper = session.getMapper(UserMapper.class); PageHelper.startPage(5, 2); List<User> list = userMapper.queryUsers(); PageInfo<User> pageInfo = new PageInfo<>(list, 5); System.out.println("当前页:" + pageInfo.getPageNum()); System.out.println("总页数:" + pageInfo.getPages()); System.out.println("每页显示数量:" + pageInfo.getPageSize()); System.out.println("总记录数:" + pageInfo.getTotal()); // 遍历当前页数据 for (User user : list) { System.out.println(user); } // 遍历分页条页码 System.out.print("分页条,页码是:"); for (int i : pageInfo.getNavigatepageNums() ) { System.out.print( i + "\t" ); } System.out.println(); } finally { session.close(); } }
测试的结果
运行方法:在eclipse 中,选择pom.xml文件,击右键先择Run AS——>Maven Build… ——>在Goals框中输入:mybatis-generator:generate