MyBatis
是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
MyBatis Generator简介
MyBatis生成器(MBG)是MyBatis MyBatis 和iBATIS的代码生成器。它将为MyBatis的所有版本以及版本2.2.0之后的iBATIS生成代码。它将对一个(或多个)数据库表进行内部检查,并将生成可用于访问表的工件。这减轻了设置对象和配置文件以与数据库表进行交互的麻烦。MBG试图对简单CRUD(创建,检索,更新,删除)的大部分数据库操作产生重大影响。您仍将需要手工编写SQL和对象代码以进行联接查询或存储过程。
MyBatis Generator将生成:
与表结构匹配的Java POJO。这可能包括:
- 一个与表的主键匹配的类(如果有主键)
- 一个与表的非主键字段匹配的类(BLOB字段除外)
- 一个包含表的BLOB字段的类(如果表具有BLOB字段)
- 一个启用动态选择,更新和删除的类
这些类之间有适当的继承关系。请注意,可以将生成器配置为生成不同类型的POJO层次结构-例如,如果您愿意,可以选择为每个表生成单个域对象。
MyBatis / iBATIS兼容的SQL Map XML文件。MBG为配置中的每个表上的简单CRUD函数生成SQL。生成的SQL语句包括:
- insert
- update by primary key
- update by example (using a dynamic where clause)
- delete by primary key
- delete by example (using a dynamic where clause)
- select by primary key
- select by example (using a dynamic where clause)
- count by example
开始走代码
- MyBatis 逆向工程核心配置文件 :
mybatis-generator.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>
<!--mybatis-generator.xml
targetRuntime 可以设置生成的版本
MyBatis3Simple 标配版 只有 CRUD
MyBatis3 豪华版 除了 CRUD 还有很多有用的查询方法
-->
<context id="DB2Tables" targetRuntime="MyBatis3Simple">
<!-- 去掉全部的注释 -->
<commentGenerator>
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!-- 修改数据库的连接属性 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mybatis_mbg"
userId="root"
password="root">
</jdbcConnection>
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!--
配置生成的 Javabean
targetPackage : Javabean 的包名
targetProject : 生成在哪个项目目录下
-->
<javaModelGenerator targetPackage="com.mybatis.pojo" targetProject=".\mybatis-mbg\src">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!--
配置生成的 : Mapper.xml
targetPackage : Javabean 的包名
targetProject : 生成在哪个项目目录下
-->
<sqlMapGenerator targetPackage="com.mybatis.mapper" targetProject=".\mybatis-mbg\src">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!--
配置生成的 : Mapper 接口
targetPackage : Mapper 接口的包名
targetProject : 生成在哪个项目目录下
-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.mybatis.mapper" targetProject=".\mybatis-mbg\src">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!--
配置对应的数据库表 table
tableName : 表名
domainObjectName : 设置生成的类名
-->
<table tableName="t_book" domainObjectName="Book" />
<table tableName="t_user" domainObjectName="User" />
</context>
</generatorConfiguration>
- 执行 MyBatis 逆向工程 代码
MbgRunner.java
public class MbgRunner {
public static void main(String[] args) throws InvalidConfigurationException, IOException, XMLParserException, SQLException, InterruptedException {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
// mybatis-generator.xml 配置文件的路径
File configFile = new File("mybatis-mbg/mybatis-generator.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);
}
}
-
注意
: 以上操作不会生成 Javabean 中的 toString() 及 有参 和 无参构造方法.需要手动生成
测试一下是否可用
- 先准备好 MyBatis 的核心配置文件 mybatis-config.xml
<?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>
<!--
通过配置包名的方式配置所有JavaBean的别名
-->
<typeAliases>
<package name="com.mybatis.pojo"/>
</typeAliases>
<!-- 配置数据库连接数据库连接属性 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis_mbg"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 使用包名配置 [更简单] -->
<mappers>
<package name="com.mybatis.mapper"/>
</mappers>
</configuration>
- 生成的 BookMapper.java接口 [ 简单的CRUD ]
/**
* 标配版 只有 CRUD
*/
public interface BookMapper {
int deleteByPrimaryKey(Integer id);
int insert(Book record);
Book selectByPrimaryKey(Integer id);
List<Book> selectAll();
int updateByPrimaryKey(Book record);
}
- 生成的 BookMapper.java接口 大部分的条件查询都有 [ 豪华版 ]
- 其中每个 Javabean 都会对应有一个查询条件类,类似于像User 会对应
UserExample
这个条件类, 其中对每个字段都进行了条件的封装 : 具体使用方法见 : 文档
int countByExample(BookExample example);
int deleteByExample(BookExample example);
int deleteByPrimaryKey(Integer id);
int insert(Book record);
int insertSelective(Book record);
List<Book> selectByExample(BookExample example);
Book selectByPrimaryKey(Integer id);
int updateByExampleSelective(@Param("record") Book record, @Param("example") BookExample example);
int updateByExample(@Param("record") Book record, @Param("example") BookExample example);
int updateByPrimaryKeySelective(Book record);
int updateByPrimaryKey(Book record);
- 测试类 BookMapperTest.java
public class BookMapperTest {
static SqlSessionFactory sqlSessionFactory;
@BeforeClass
public static void init() throws IOException {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
}
@Test
public void deleteByPrimaryKey() {
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
BookMapper mapper = sqlSession.getMapper(BookMapper.class);
mapper.deleteByPrimaryKey(1);
sqlSession.commit();
}finally {
sqlSession.close();
}
}
@Test
public void insert() {
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
BookMapper mapper = sqlSession.getMapper(BookMapper.class);
mapper.insert(new Book(null, "乔布斯传", "乔布斯", new BigDecimal(98), 1000, 100));
sqlSession.commit();
}finally {
sqlSession.close();
}
}
@Test
public void selectByPrimaryKey() {
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
BookMapper mapper = sqlSession.getMapper(BookMapper.class);
System.out.println(mapper.selectByPrimaryKey(8));
}finally {
sqlSession.close();
}
}
@Test
public void selectAll() {
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
BookMapper mapper = sqlSession.getMapper(BookMapper.class);
mapper.selectAll().forEach(System.out::println);
}finally {
sqlSession.close();
}
}
@Test
public void updateByPrimaryKey() {
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
BookMapper mapper = sqlSession.getMapper(BookMapper.class);
mapper.updateByPrimaryKey(new Book(8 , "滚雪球", "周某", new BigDecimal(68), 100, 80));
sqlSession.commit();
}finally {
sqlSession.close();
}
}
}
如果文章对你有帮助记得点赞+关注哦!
QQ交流群:1101584918,欢迎大家加入。