004 整合spring,springMVC,mybatis(重构)

004 整合spring,springMVC,mybatis(重构)

视频发布在youtube上面了
https://youtu.be/CzaJsOGVOLI
优酷上面的链接
http://v.youku.com/v_show/id_XMjc4NzU5ODU3Ng==.html?f=49760672

传说中的SSM框架,这里数据库使用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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值