学习Java springMVC的系列文章,在这里整合spring,springMVC,mybatis,就是传说中的SSM框架。
视频发布在youtube上面了https://youtu.be/CzaJsOGVOLI 优酷上面的链接http://v.youku.com/v_show/id_XMjc4NzU5ODU3Ng==.html?f=49760672
004 整合spring,springMVC,mybatis(重构) 这里数据库使用MySql版本是5.6.36
接着003的项目操作。
先启动一下MySql,看看要连接的数据库,名字test。 这里提供一下创建表和数据的脚本user.sql可以直接导入
/* Navicat Premium Data Transfer Source Server : mysql Source Server Type : MySQL Source Server Version : 50636 Source Host : localhost Source Database : test Target Server Type : MySQL Target Server Version : 50636 File Encoding : utf-8 Date: 05/22/2017 21:45:38 PM */ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for `user` -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` bigint(20) NOT NULL DEFAULT '0' COMMENT '主键id', `name` varchar(40) NOT NULL DEFAULT '' COMMENT '名称', `age` smallint(6) NOT NULL DEFAULT '0' COMMENT '年龄', `email` varchar(20) DEFAULT NULL, `creatTime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `loginTime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '登录时间', `teacherId` bigint(20) DEFAULT '1' COMMENT '教师外键', `gender` varchar(10) CHARACTER SET utf8 NOT NULL DEFAULT '' COMMENT '性别', PRIMARY KEY (`id`), KEY `teacherIdx` (`teacherId`), CONSTRAINT `teacherExt` FOREIGN KEY (`teacherId`) REFERENCES `teacher` (`id`) ON DELETE SET NULL ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='学生表'; -- ---------------------------- -- Records of `user` -- ---------------------------- BEGIN; INSERT INTO `user` VALUES ('1', 'student1', '11', 'student1@126.com', '2017-05-20 10:40:34', '2017-05-21 15:40:34', '1', 'Male'), ('2', 'student2', '22', 'student2@126.com', '2017-05-12 18:43:32', '2017-05-21 15:40:34', '2', 'Female'), ('3', 'student3', '33', 'student3@126.com', '2017-05-21 08:40:34', '2017-05-21 15:40:34', '1', 'Male'); COMMIT; SET FOREIGN_KEY_CHECKS = 1;
这个网址可以很方便的用来查找maven依赖包的相关信息https://mvnrepository.com/ 添加spring-test依赖
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> <scope>test</scope> </dependency>
需要添加一个依赖包,否则会报错
java.lang.NoClassDefFoundError: org/springframework/dao/support/DaoSupport
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency>
使用mybatis有几种方式,在这里我尝试了安装eclipse插件,发现不知道为什么生成映射的时候有时找不到属性文件,所以不用插件生成,使用maven来生成映射文件,插件也是有用的可以用来生成配置文件。
在Eclipse marketplace里面安装MyBatis Generator插件目前版本是1.3.5
现在使用maven的方式来使用mybatis,官方说明网址如下:http://www.mybatis.org/generator/running/runningWithMaven.html
添加spring,MyBatis和MySql相关依赖包
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <!-- mybatis数据库相关依赖 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.4</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency> <!-- mysql依赖 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.39</version> </dependency> <!-- 数据源 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.29</version> </dependency>
创建generatorConfig.xml文件, 在src/main/resources路径下File-New-Other 如果安装了插件搜索mybatis会看到MyBatis Generator Configuration File默认文件名是generatorConfig.xml
参考下面官方链接http://www.mybatis.org/generator/configreference/xmlconfig.html 这里使用了变量,相关定义信息在jdbc.properties中
<?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" /> <!-- 指定数据连接驱动jar地址 --> <classPathEntry location="${classPath}" /> <context id="context1" targetRuntime="MyBatis3"> <jdbcConnection connectionURL="${jdbc_url}" driverClass="${jdbc_driver}" password="${jdbc_password}" userId="${jdbc_user}" /> <javaTypeResolver> <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <javaModelGenerator targetPackage="${package.model}" targetProject="${targetProject}"> <property name="enableSubPackages" value="true" /> <property name="trimStrings" value="true" /> </javaModelGenerator> <sqlMapGenerator targetPackage="${package.mapping}" targetProject="${targetProject}"> <property name="enableSubPackages" value="true" /> </sqlMapGenerator> <javaClientGenerator targetPackage="${package.dao}" targetProject="${targetProject}" type="XMLMAPPER"> <property name="enableSubPackages" value="true" /> </javaClientGenerator> <!-- schema是数据库名 domainObjectName要生成的实体类名 --> <table schema="${dbName}" tableName="teacher" domainObjectName="Teacher" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"> <!-- 这里使用表字段实际的名称生成属性字段 --> <property name="useActualColumnNames" value="true" /> </table> <table schema="${dbName}" tableName="user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"> <property name="useActualColumnNames" value="true" /> </table> <!-- 解决MySql无符号数值类型的字段 --> <!-- <columnOverride column="???" property="???" /> --> <!-- </table> --> </context> </generatorConfiguration>
除了使用和表字段一致的设置外,还有一种方式就是表字段使用下划线分割单词,那么生成的属性字段就是驼峰表示了比如:teacher_id 属性字段是teacherId
jdbc.properties
#Mybatis Generator configuration project=test dbName=test targetProject=src/main/java package.dao=com.study.dao package.model=com.study.model package.mapping=com.study.mapping classPath=/Users/zhengjun/Documents/java_library/mysql-connector-java-5.1.39.jar jdbc_driver=com.mysql.jdbc.Driver jdbc_url=jdbc:mysql://127.0.0.1:3306/${dbName}?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=UTC jdbc_user=root jdbc_password=
正常情况应该在generatorConfig.xml文件上面右键单击选择Run As>Run MyBatis Generator会自动生成相应的文件。但是不知道为什么会有找不到jdbc.properties的情况。 这里使用maven,先要配置插件在POM.xml里面添加
<!-- 这里要添加mybatis插件 --> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.5</version> <configuration> <verbose>true</verbose> <overwrite>false</overwrite> </configuration> </plugin>
然后使用maven创建一个配置,然后run as就会自动生成映射文件 Goals:mybatis-generator:generate -e
注意:默认不会覆盖已有的同名文件,mapper除外,每次都会自动更新。
MySql 使用注意事项 无符号类型 MySql支持有符号,无符号,数字类型字段。这些不是JDBC类型,因此MyBatis 生成器不能自动转换这种类型的字段。JAVA数据类型都是有符号的, 当使用无符号类型时这就会导致缺失精度。可以使用 解决MySql无符号数值类型的字段。下面是一个如何处理无符号bigint字段类型例子:
<table tableName="ALLTYPES" > <columnOverride column="UNSIGNED_BIGINT_FIELD" javaType="java.lang.Object" jdbcType="LONG" /> </table>
您还必须自己强制将返回值转换为适当的类型(在上面这种情况下,需要转换为 java.math.BigInteger)。
要连接数据库,还需要编辑springmvc.xml添加数据源等信息, 这里用到变量参数,所以还要引入属性文件
<!-- 引入属性文件 --> <context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 数据源 org.apache.commons.dbcp.BasicDataSource com.alibaba.druid.pool.DruidDataSource --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="driverClassName" value="${jdbc_driver}" /> <property name="url" value="${jdbc_url}" /> <property name="username" value="${jdbc_user}" /> <property name="password" value="${jdbc_password}" /> <!-- 初始化连接大小 --> <property name="initialSize" value="0" /> <!-- 连接池最大使用连接数量 --> <property name="maxActive" value="20" /> <!-- 连接池最小空闲 --> <property name="minIdle" value="0" /> <!-- 获取连接最大等待时间 --> <property name="maxWait" value="60000" /> <property name="validationQuery"> <value>SELECT 1</value> </property> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" /> <property name="testWhileIdle" value="true" /> <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="25200000" /> <!-- 打开removeAbandoned功能 --> <property name="removeAbandoned" value="true" /> <!-- 1800秒,也就是30分钟 --> <property name="removeAbandonedTimeout" value="1800" /> <!-- 关闭abanded连接时输出错误日志 --> <property name="logAbandoned" value="true" /> <!-- 监控数据库 --> <!-- <property name="filters" value="stat" /> --> <property name="filters" value="mergeStat" /> </bean> <!-- 配置druid监控spring jdbc --> <bean id="druid-stat-interceptor" class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor"> </bean> <bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut" scope="prototype"> <property name="patterns"> <list> <value>com.study.service.*</value> </list> </property> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="mapperLocations" value="classpath:com/study/mapping/*.xml"></property> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.study.dao"></property> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> </bean> <!-- 事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 支持事务注解 @Transactional --> <tx:annotation-driven/>
这里不添加annotation-driven会造成事务不生效org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession
编写测试文件,测试数据库操作
新建一个service包 com.study.mybatis.service 然后新建一个接口IUserService
public interface IUserService { public User getUserById(String id); }
在新建一个实现类IUserServiceImpl,声明为service,支持事务
@Service("userService") @Transactional public class IUserServiceImpl implements IUserService { @Autowired UserMapper userMapper; @Override public User getUserById(String id) { return userMapper.selectByPrimaryKey(Long.parseLong(id)); } }
写完注解之后,还需要在springMVC.xml里面配置到自动扫描的里面,否则会提示找不到bean
<!-- 配置自动扫描的包 --> <context:component-scan base-package="com.study.controller, com.study.service"></context:component-scan>
然后写UserTest里面的测试代码 现在类上面写上注解。使用spring-test,指定配置文件路径
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:springmvc.xml") public class TestUser { @Autowired IUserService userService; @Test public void TestGetUser() { User user = userService.getUserById("1"); assertTrue(user.getName().equals("student1")); System.out.println(user.getName()); } }
在TestGetUser上面右键单击Run as-JUnit Test,正常应该可以看到控制台输出用户的名字
把template项目做个模板,版本0.0.3,这里在执行mvn install之前,修改下面路径的pom文件即可。 在这里还可以把打包方式从jar改成war,这样从模板生成的项目就是war包形式了
/template/target/generated-sources/archetype/target/classes/archetype-resources/pom.xml <finalName>${artifactId}</finalName>: 发布前执行时,生成${artifactId}.war文件。
如果有需要交流的,或者有更好的实现方法的同学,欢迎通过电子邮件或者留言来互通有无,共同进步。 ascomtohom@126.com