MyBatis——(六)逆向工程

2018-11-30 19:57:00     

介绍

MyBatis的一个主要的特点就是需要程序员自己编写sql,那么如果表太多的话,难免会很麻烦,所以mybatis官方提供了一个逆向工程,可以针对单表自动生成mybatis执行所需要的代码(mapper.xml、mapper.java、pojo...)。一般在开发中,通过数据库中的单表,自动生成java代码,这样能够大大减少我们平时开发的工作量

新建工程

新建一张老师表(teacher),插入三条数据

在【src/config】目录下新建逆向工程(generatorConfig.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:生成一组对象的环境 -->
	<context id="DB2Tables" targetRuntime="MyBatis3">
		<commentGenerator>
			<property name="suppressDate" value="true" />
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
			<property name="suppressAllComments" value="false" />
		</commentGenerator>
		<!--数据库链接地址账号密码 -->
		<jdbcConnection driverClass="com.mysql.jdbc.Driver"
			connectionURL="jdbc:mysql://localhost/transaction" userId="root"
			password="123456">
		</jdbcConnection>
		<!-- java类型处理器,用于处理DB中的类型到Java中的类型
		默认会先尝试使用Integer,Long,Short等来对应DECIMAL和 NUMERIC数据类型-->
		<javaTypeResolver>
			<property name="forceBigDecimals" value="false" />
		</javaTypeResolver>
		<!--java模型创建器,是必须要的元素,生成Model类存放位置 -->
		<javaModelGenerator targetPackage="model"
			targetProject="src">
			<!-- enableSubPackages:是否让targetPackage作为包的后缀 -->
			<property name="enableSubPackages" value="true" />
			<!-- 从数据库返回的值被清理前后的空格 -->
			<property name="trimStrings" value="true" />
		</javaModelGenerator>
		<!--生成SQL mapper的XML文件以及文件存放位置 -->
		<sqlMapGenerator targetPackage="xmlmapper" targetProject="src">
			<property name="enableSubPackages" value="true" />
		</sqlMapGenerator>
		<!--生成Mapper接口以及存放位置 -->
		<javaClientGenerator type="XMLMAPPER"
			targetPackage="mapper" targetProject="src">
			<property name="enableSubPackages" value="true" />
		</javaClientGenerator>
		<!--生成对应表及类名 可以有一个或多个table,必须要有table元素-->
		<table tableName="teacher" domainObjectName="Teacher"
			enableCountByExample="false" enableUpdateByExample="false"
			enableDeleteByExample="false" enableSelectByExample="true"
			selectByExampleQueryId="false">
			<property name="my.isgen.usekeys" value="true" />
			<!-- generatedKey用于生成生成主键的方法 -->
			<generatedKey column="id" sqlStatement="JDBC" />
		</table>
	</context>
</generatorConfiguration>

在【src/test】目录下新建TestMybatis测试类,用于自动生成mybatis执行所需要的代码(mapper.xml、mapper.java、pojo...)

package test;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.junit.Test;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;

public class TestMybatis {

	@Test
	public void testZero() throws Exception {
		List<String> warnings = new ArrayList<String>();
		boolean overwrite = true;
		InputStream is = TestMybatis.class.getClassLoader().getResource("config/generatorConfig.xml").openStream();
		ConfigurationParser cp = new ConfigurationParser(warnings);
		Configuration config = cp.parseConfiguration(is);
		is.close();
		DefaultShellCallback callback = new DefaultShellCallback(overwrite);
		MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
		myBatisGenerator.generate(null);
		System.out.println("生成代码成功,刷新项目,查看文件,然后执行testOne()方法");
	}
}

运行测试类后,刷新该项目,就可以看到最新生成的代码TeacherMapper.java、Teacher.java、TeacherExample.java、TeacherMapper.xml


创建Mybatis本身的配置文件mybatis-config.xml,映射TeacherMapper.xml加载sql语句

<?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>
	<!--和Spring整合后 environments 配置将废除 -->
	<environments default="development">
		<environment id="development">
			<!-- 使用JDBC事务管理 -->
			<transactionManager type="JDBC" />
			<!--数据库连接池 -->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/transaction" />
				<property name="username" value="root" />
				<property name="password" value="123456" />
			</dataSource>
		</environment>
	</environments>
	<!-- 映射TeacherMapper.xml加载sql语句 -->
	<mappers>
		<mapper resource="xmlmapper/TeacherMapper.xml" />
	</mappers>
</configuration>

在TestMybatis测试类下新增testOne()测试方法

@Test
public void testOne() throws IOException {
	// 获取配置文件
	String resource = "config/mybatis-config.xml";
	// 利用一个叫Resources的类的getResourceAsStream方法从配置文件xml中获取里面的内容资源
	InputStream is = Resources.getResourceAsStream(resource);
	// 然后用SqlSessionFactoryBuilder工厂构建者把获取的资源传进去就构建出了我们需要使用的工厂
	SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
	// 工厂生产产品
	SqlSession session = sessionFactory.openSession();
	TeacherExample teacherExample = new TeacherExample();
	//模糊查询(TeacherExample提供了很多的方式,这里选择andNameLike模糊查询)
	teacherExample.createCriteria().andNameLike("%" + "语" + "%");
	TeacherMapper teacherMapper = session.getMapper(TeacherMapper.class);
	List<Teacher> list = teacherMapper.selectByExample(teacherExample);
	for (Teacher t : list) {
		System.out.println(t.getName());
	}
	session.commit();
	// 使用session执行完SQL之后需要关闭session
	session.close();
}

执行结果:

17:31:14.826 [main] DEBUG mapper.TeacherMapper.selectByExample - ==>  Preparing: select 'false' as QUERYID, id, name from teacher WHERE ( name like ? ) 
17:31:14.842 [main] DEBUG mapper.TeacherMapper.selectByExample - ==> Parameters: %语%(String)
17:31:14.851 [main] DEBUG mapper.TeacherMapper.selectByExample - <==      Total: 2
2,,,语文老师
3,,,英语老师

TeacherExample拓展

打开TeacherExample,这个类是专门用来对这个单表操作的类,xxxxByExample通过自定义限制条件进行增删改查操作(CRUD),xxxxByPrimaryKey通过主键进行增删改查操作(CRUD)。里边有三个成员变量:

public class TeacherExample {

    protected String orderByClause;

    protected boolean distinct;

    protected List<Criteria> oredCriteria;
  • orderByClause字段用于指定ORDER BY条件,这个条件没有构造方法,直接通过传递字符串值指定
  • distinct字段用于指定DISTINCT查询
  • oredCriteria字段用于自定义查询条件
ps:本篇博客源码下载链接:https://pan.baidu.com/s/1WEKl_xth0kC1oyX67wtQtw密码:stqf
MyBatis——(四)分页 c3p0连接池

PageHelper是一款犀利的Mybatis分页插件,使用了这个插件之后,分页开发起来更加简单容易。C3P0连接池会根据你的配置来初始化N个数据库连接,空闲时间后连接过期又会自动新建K个连接使得连接池总有空闲的数据库连接等待被取用。我们只需通过dataSourse.getConnection() 即可从线程池中取用一个已经连接好的空闲连接,执行数据库操作。然后“断开”(放回)这个连接,把这个连接的使用权放回连接池。

MyBatis——(五)缓存

正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存:基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空 二级缓存:与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache

 发表评论