1、SpringCloud+MyBatis
MyBatis 是一款优秀的轻量级半自动持久层框架,与之相对应的还有hibernate框架。①
话不多说,接下来搭建SpringCloud+MyBatis环境:
- 第一步,在SpringCloud环境中的pom.xml中加入:
1 <!-- 引用Mybatis 和 Mysql驱动开始 --> 2 <dependency> 3 <groupId>org.mybatis.spring.boot</groupId> 4 <artifactId>mybatis-spring-boot-starter</artifactId> 5 <version>1.3.0</version> 6 </dependency> 7 <dependency> 8 <groupId>mysql</groupId> 9 <artifactId>mysql-connector-java</artifactId> 10 </dependency> 11 <!-- 引用Mybatis 和 Mysql驱动结束 -->
- 第二步,在Mysql数据库中创建User表
-- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL COMMENT '主键', `name` varchar(64) NOT NULL COMMENT '姓名', `birthday` date DEFAULT NULL COMMENT '生日', `address` varchar(256) DEFAULT NULL COMMENT '地址', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of user -- ---------------------------- INSERT INTO `user` VALUES ('1', '石露露', '1994-10-08', '卡布奇诺国际社区');
- 第三步,在SpringCloud中配置反向生成工具对User表生成相应的实体类和配置文件
在pom.xml文件的<bulid>标签②中通过maven添加插件引用
1 <plugin> 2 <groupId>org.mybatis.generator</groupId> 3 <artifactId>mybatis-generator-maven-plugin</artifactId> 4 <version>1.3.5</version> 5 <dependencies> 6 <dependency> 7 <groupId> mysql</groupId> 8 <artifactId> mysql-connector-java</artifactId> 9 <version> 5.1.39</version> 10 </dependency> 11 <dependency> 12 <groupId>org.mybatis.generator</groupId> 13 <artifactId>mybatis-generator-core</artifactId> 14 <version>1.3.5</version> 15 </dependency> 16 </dependencies> 17 <executions> 18 <execution> 19 <id>Generate MyBatis Artifacts</id> 20 <phase>package</phase> 21 <goals> 22 <goal>generate</goal> 23 </goals> 24 </execution> 25 </executions> 26 <configuration> 27 <!--允许移动生成的文件 --> 28 <verbose>true</verbose> 29 <!-- 是否覆盖 --> 30 <overwrite>true</overwrite> 31 <!-- 自动生成的配置 --> 32 <configurationFile> 33 src/main/resources/mybatis-generator.xml 34 </configurationFile> 35 </configuration> 36 </plugin>
新建配置文件generatorConfig.xml,配置文件需配置数据库jar包位置,生成的文件存放位置等信息:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE generatorConfiguration 3 PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" 4 "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> 5 <generatorConfiguration> 6 <!--mysql 连接数据库jar 这里选择自己本地位置--> 7 <classPathEntry location="F:dev-space epomysqlmysql-connector-java5.1.45mysql-connector-java-5.1.45.jar" /> 8 <context id="testTables" targetRuntime="MyBatis3"> 9 <commentGenerator> 10 <!-- 是否去除自动生成的注释 true:是 : false:否 --> 11 <property name="suppressAllComments" value="true" /> 12 </commentGenerator> 13 <!--数据库连接的信息:驱动类、连接地址、用户名、密码 --> 14 <jdbcConnection driverClass="com.mysql.jdbc.Driver" 15 connectionURL="jdbc:mysql://192.168.1.100:3306/test?serverTimezone=UTC" userId="bdgascloud" 16 password="bdgascloud"> 17 </jdbcConnection> 18 <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和 19 NUMERIC 类型解析为java.math.BigDecimal --> 20 <javaTypeResolver> 21 <property name="forceBigDecimals" value="false" /> 22 </javaTypeResolver> 23 24 <!-- targetProject:生成PO类的位置 --> 25 <javaModelGenerator targetPackage="com.didispace.web.jdbc.po" 26 targetProject="src/main/java"> 27 <!-- enableSubPackages:是否让schema作为包的后缀 --> 28 <property name="enableSubPackages" value="false" /> 29 <!-- 从数据库返回的值被清理前后的空格 --> 30 <property name="trimStrings" value="true" /> 31 </javaModelGenerator> 32 <!-- targetProject:mapper映射文件生成的位置 33 如果maven工程只是单独的一个工程,targetProject="src/main/java" 34 若果maven工程是分模块的工程,targetProject="所属模块的名称",例如: 35 targetProject="ecps-manager-mapper",下同--> 36 <sqlMapGenerator targetPackage="mapXml" 37 targetProject="src/main/resources"> 38 <!-- enableSubPackages:是否让schema作为包的后缀 --> 39 <property name="enableSubPackages" value="false" /> 40 </sqlMapGenerator> 41 <!-- targetPackage:mapper接口生成的位置 --> 42 <javaClientGenerator type="XMLMAPPER" 43 targetPackage="com.didispace.web.jdbc.mapper" 44 targetProject="src/main/java"> 45 <!-- enableSubPackages:是否让schema作为包的后缀 --> 46 <property name="enableSubPackages" value="false" /> 47 </javaClientGenerator> 48 <!-- 指定数据库表 --> 49 <table schema="" tableName="user"></table>③
50 </context> 51 </generatorConfiguration>
最好先右键项目选择maven–>update project… ④
然后再maven build….
配置运行参数:
Goals:mybatis-generator:generate -e
Profiles:generatorConfig.xml
最后点击run等待完成 ,会发现如下文件被自动生成:
- 第四步,在application.properties中添加
spring.datasource.url=jdbc:mysql://192.168.1.100:3306/test?serverTimezone=UTC #springboot会直接在容器中构建一个dataSource供我们使用。
spring.datasource.username=bdgascloud
spring.datasource.password=bdgascloud
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
mybatis.typeAliasesPackage=com.didispace.web.jdbc.po ⑤
mybatis.mapperLocations=classpath:mapXml/UserMapper.xml
- 第五步,在主application类中添加
3 @MapperScan("com.didispace.web.jdbc.mapper")⑥ 4 @SpringBootApplication 5 //@SpringBootApplication(exclude={DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class}) 6 public class HelloApplication { 7 8 public static void main(String[] args) { 9 SpringApplication.run(HelloApplication.class, args); 10 } 11 }
最后在controller中执行方法,页面展示效果
1 @RestController 2 public class HelloController { 3 @Autowired 4 private UserMapper userMapper; 5 6 @RequestMapping("/hello") 7 public String index() { 8
9 User user = userMapper.selectByPrimaryKey(1); 10
11 return "Hello SpringBoot"+user.getName(); 12 13 } 14 15 }
至此SpringCloud+MyBatis搭建成功!
注释一:Mybatis和Hibernate框架的区别
- 说起Hibernate和MyBatis最大的区别,用很宽泛的话讲就是hibernate是自动的,mybatis是半自动的。自动指的是hibernate因为有良好的映射机制,针对高级查询,也可以不必手动编写sql,开发者可以更关注于业务逻辑而不用担心sql的生成和结果映射。mybatis半自动指的是它在做高级查询时,必须手动写sql以及resultMap。所以说,mybatis比hibernate开发工作量大。
- 第二点就是在sql优化方面,hibernate默认是会把表中所有的列都查出来的,而mybatis是自己指定要查哪些列。当然,hibernate允许自己指定查什么,但是就会破坏hibernate开发的简洁性。所以mybatis在sql优化上还是比hibernate灵活的。
- 第三点hibernate自带日志统计,而mybatis需要依靠log4j来实现
- 第四点hibernate强大的数据库无关性,只需在xml文件中配置驱动和方言,就可以实现和不同数据库的交互。而mybatis的所有sql和所使用的数据库有直接关系,一旦变更数据库,那么你的sql语句基本就是要修改了。
- 第五点随便提一句,mybatis比hibernate更加适合开发复杂查询的项目,且更容易上手,从第一点就可以看出来。
注释二:Maven中构建插件的标签
注释三:生成 po 和 mapper,都会生成 Example 类和其对应的 CURD方法(用于辅助查询等)如果不需要在 table 标签里将要生成的方法给关掉即可,代码如下:
enableCountByExample="false"
enableUpdateByExample="false"
enableDeleteByExample="false"
enableSelectByExample="false"
selectByExampleQueryId="false">
</table>
注释四:update project本身是更新项目的意思。当Maven工程被做了一些改变后(主要是结构上的改变),必须让maven重新生成或修改相关文件。否则eclipse将不知道变化。这时候需要运行“update project”来更新相对应的“eclipse的.classpath”文件,来更新它,让eclipse知道这个包是buildpath。
注释五:当没有设置该属性时,*.Mapper.xml文件里parameterType必须为类的全路径 <insert id="insertSelective" parameterType="com.didispace.web.jdbc.po.User">,加上后为 <insert id="insertSelective" parameterType="User">即可。
注释六:之前是直接在Mapper类上面添加注解@Mapper,这种方式要求每一个mapper类都需要添加此注解,麻烦,通过使用@MapperScan可以指定要扫描的Mapper类的包的路径(支持多路径)。