原文地址:http://www.yiidian.com/mybatis/mybatis-generator.htmlhtml
官网:http://mybatis.org/generator/java
MyBatis的开发须要程序员本身编写sql语句,MyBatis官方提供逆向工程,能够针对单表自动生成MyBatis执行所须要的代码(Dao接口、Mapper.xml、Pojo等元素),可让程序员将更多的精力放在繁杂的业务逻辑上。mysql
之因此强调单表两个字,是由于Mybatis逆向工程生成的Mapper所进行的操做都是针对单表的,也许你可能会以为那这就有点鸡肋了,可是在大型项目中,不多有复杂的多表关联查询,因此做用仍是很大的。程序员
<dependencies> <!--mysql驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency> <!-- mybatis依赖--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.3</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.7</version> </dependency> </dependencies>
在resources创建jdbc.properties,内容以下:sql
jdbc.path=D:\\reponsitory_boot\\mysql\\mysql-connector-java\\5.1.46\\mysql-connector-java-5.1.46.jar jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis jdbc.username=root jdbc.password=root
注意:jdbc.path是mysql驱动包的路径,待会MyBatis逆向工程配置用到数据库
在resources配置mybatis-generator-config.xml(名称是默认的,不要修改),内容以下:api
<?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> <!--导入属性配置--> <properties resource="jdbc.properties"></properties> <!--指定特定数据库的jdbc驱动jar包的位置--> <classPathEntry location="${jdbc.path}"/> <context id="context" targetRuntime="MyBatis3"> <!-- 是否去除自动生成的注释 true:是 : false:否 --> <commentGenerator> <property name="suppressAllComments" value="true"/> <property name="suppressDate" value="true"/> </commentGenerator> <!--数据库链接的信息:驱动类、链接地址、用户名、密码 --> <jdbcConnection driverClass="${jdbc.driver}" connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/> <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal --> <javaTypeResolver> <property name="forceBigDecimals" value="false"/> </javaTypeResolver> <!--指定包名生成实体类 以及生成的地址 (能够自定义地址,若是路径不存在会自动建立) --> <javaModelGenerator targetPackage="com.yiidian.domain" targetProject="D:\idea_workspace\yiidian\mybatis\ch02_06_mybatis_generator\src\main\java"> <!-- enableSubPackages:是否让schema做为包的后缀 --> <property name="enableSubPackages" value="false"/> <!-- 从数据库返回的值被清理先后的空格 --> <property name="trimStrings" value="true"/> </javaModelGenerator> <!--Mapper映射文件生成所在的目录 为每个数据库的表生成对应的mapper文件 --> <sqlMapGenerator targetPackage="com.yiidian.dao" targetProject="D:\idea_workspace\yiidian\mybatis\ch02_06_mybatis_generator\src\main\resources"> <!-- enableSubPackages:是否让schema做为包的后缀 --> <property name="enableSubPackages" value="false"/> </sqlMapGenerator> <!-- 客户端代码,生成易于使用的针对Model对象和XML配置文件 的代码 type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象 type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象 type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口 --> <javaClientGenerator targetPackage="com.yiidian.dao" targetProject="D:\idea_workspace\yiidian\mybatis\ch02_06_mybatis_generator\src\main\java" type="XMLMAPPER"> <!-- enableSubPackages:是否让schema做为包的后缀 --> <property name="enableSubPackages" value="false"/> </javaClientGenerator> <!-- 指定数据库表 --> <table schema="mybatis" tableName="t_customer" domainObjectName="Customer" mapperName="CustomerDao" enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="true" enableUpdateByExample="false"/> </context> </generatorConfiguration>
在test目录创建执行类,用于读取逆向工程配置,生成代码mybatis
package com.yiidian.mybatis; 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; import java.io.InputStream; import java.util.ArrayList; import java.util.List; /** * myBatis逆向工程 * 一点教程网 - www.yiidian.com */ public class MyBatisGeneratorTest { public void generator() throws Exception{ List<String> warnings = new ArrayList<String>(); boolean overwrite = true; //指定 逆向工程配置文件 InputStream in = MyBatisGeneratorTest.class.getClassLoader().getResourceAsStream("mybatis-generator-config.xml"); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = cp.parseConfiguration(in); DefaultShellCallback callback = new DefaultShellCallback(overwrite); MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); myBatisGenerator.generate(null); in.close(); } public static void main(String[] args) throws Exception { try { MyBatisGeneratorTest generatorSqlmap = new MyBatisGeneratorTest(); generatorSqlmap.generator(); } catch (Exception e) { e.printStackTrace(); } } }
package com.yiidian.dao; import com.yiidian.domain.Customer; import com.yiidian.domain.CustomerExample; import java.util.List; /** * 一点教程网 - www.yiidian.com */ public interface CustomerDao { int deleteByPrimaryKey(Integer id); int insert(Customer record); int insertSelective(Customer record); List<Customer> selectByExample(CustomerExample example); Customer selectByPrimaryKey(Integer id); int updateByPrimaryKeySelective(Customer record); int updateByPrimaryKey(Customer record); }
1)测试方法app
/** * 测试insert方法 * 一点教程网 - www.yiidian.com */ @Test public void testInsert(){ SqlSession sqlSession = MyBatisUtils.getSession(); CustomerDao customerDao = sqlSession.getMapper(CustomerDao.class); Customer cust = new Customer(); cust.setName("小明"); customerDao.insert(cust); sqlSession.commit(); sqlSession.close(); }
2)执行效果dom
能够看到,insert方法会所有字段都插入数据,若是该属性没有赋值,则插入NULL。
1)测试方法
/** * 测试insertSelective方法 * 一点教程网 - www.yiidian.com */ @Test public void testInsertSelective(){ SqlSession sqlSession = MyBatisUtils.getSession(); CustomerDao customerDao = sqlSession.getMapper(CustomerDao.class); Customer cust = new Customer(); cust.setName("小明"); customerDao.insertSelective(cust); sqlSession.commit(); sqlSession.close(); }
2)执行效果
相对insert方法,insertSelective方法更加灵活些。它能根据属性赋值状况来判断是否插入该字段,这种动态插入方式在项目中更推荐使用。
1)测试方法
/** * 测试UpdateByPrimaryKey方法 * 一点教程网 - www.yiidian.com */ @Test public void testUpdateByPrimaryKey(){ SqlSession sqlSession = MyBatisUtils.getSession(); CustomerDao customerDao = sqlSession.getMapper(CustomerDao.class); Customer cust = new Customer(); cust.setId(3); cust.setName("小明"); customerDao.updateByPrimaryKey(cust); sqlSession.commit(); sqlSession.close(); }
2)执行效果
update方法和insert相似,无论该属性有没有赋值,有会更新该字段,叫全字段更新。
1)测试方法
/** * 测试updateByPrimaryKeySelective方法 * 一点教程网 - www.yiidian.com */ @Test public void testUpdateByPrimaryKeySelective(){ SqlSession sqlSession = MyBatisUtils.getSession(); CustomerDao customerDao = sqlSession.getMapper(CustomerDao.class); Customer cust = new Customer(); cust.setId(3); cust.setName("小明"); customerDao.updateByPrimaryKeySelective(cust); sqlSession.commit(); sqlSession.close(); }
2)执行效果
能够看到,updateByPrimaryKeySelective方法和insertSeletive方法相似,是一种动态更新效果。
/** * 测试SelectByExample方法 * 一点教程网 - www.yiidian.com */ @Test public void testSelectByExample(){ SqlSession sqlSession = MyBatisUtils.getSession(); CustomerDao customerDao = sqlSession.getMapper(CustomerDao.class); //1.建立Example对象,Example是MyBatis逆向工程生成的封装了全部查询条件的对象 CustomerExample customerExample = new CustomerExample(); //2.添加查询条件 CustomerExample.Criteria criteria = customerExample.createCriteria(); //需求:根据name模糊查询 //criteria.andNameLike("%小%"); //需求:根据gender查询 //criteria.andGenderEqualTo("女"); List<Customer> list = customerDao.selectByExample(customerExample); System.out.println(list); sqlSession.close(); }
Criteria对象能够设置条件很是多,根据表的结构的不一样会有不一样的可限制条件:
源码下载:https://pan.baidu.com/s/1PIhaTRc1qAj-BsLON4qj6w
欢迎关注个人公众号::一点教程。得到独家整理的学习资源和平常干货推送。 若是您对个人系列教程感兴趣,也能够关注个人网站:yiidian.com