注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

Java开发之六SpringMVC+MyBatis+mysql5.7  

2016-10-19 14:40:16|  分类: JAVA |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Java开发之六SpringMVC+MyBatis+mysql5.7

在学会了在SpringMVC使用Hibernate后,一鼓作气,把MyBatis也弄好。于是从同事那里要了一个网址:http://blog.csdn.net/gallenzhang/article/details/51932152

照着人家的方式来开发,基本上和用Maven来开发Hibernate的方式差不多。但是工程在创建完成后,有以下几处略微不同。

1、  增加了几个处理的属性文件log4j.properties 和 jdbc.properties。

这两个文件以前也接触过,是用来处理日志异常和数据连接的配置文件,里面的东西挺简单,但也很有味道:

driverClasss=com.mysql.jdbc.Driver空格

jdbcUrl=jdbc:mysql://localhost:3306/db_ssm?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull空格

username=root

password=123456

#定义初始连接数

initialSize=0


#定义最大连接数

maxActive=20

#定义最大空闲

maxIdle=20

#定义最小空闲

minIdle=1

#定义最长等待时间

maxWait=60000

注意上面的红色的两个空格,今天就在这上面栽了跟头。把相关的包的名字改正后编译通过启动可以正常起来,但是发现进入指定的开发页面会报下面的异常:

org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.mysql.jdbc.Driver '

上网也是找啊找啊找啊找资料,“爱情不是我想象”,直到在这里发现了这个网页,

http://tim-fly.iteye.com/blog/2090906,上面说是空格的原因。

结果就把上面的第一个空格给去除,编译,又发现这个异常:

HTTP Status 500 - Request processing failed; nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (The connection property 'zeroDateTimeBehavior' only accepts values of the form: 'exception', 'round' or 'convertToNull'. The value 'convertToNull ' is not in this set.)

再查,说是可能连接字符串有问题,到最后忽然想起,是不是还是因为空格的是,回头去查,果然jdbc.proterties中,有个'convertToNull',后面有空格。去除,再编译,就OK了,数据也出来了。

当然,一定要注意把相关的数据库名字和表的名字以及相关的用户名和密码保持与自己的数据库一致。

2、  增加了spring-mybatis.xml文件。内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"

       xsi:schemaLocation="http://www.springframework.org/schema/beans

                        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd

                        http://www.springframework.org/schema/context

                        http://www.springframework.org/schema/context/spring-context-3.1.xsd

                        http://www.springframework.org/schema/tx

                        http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- 自动扫描 -->

    <context:component-scan base-package="com.fjf.ssm"/>

    <!-- 第一种方式:加载一个properties文件 -->

    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

        <property name="location" value="classpath:jdbc.properties"/>

    </bean>

    <!-- 配置数据源 -->

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"

          destroy-method="close">

        <property name="driverClassName" value="${driverClasss}"/>

        <property name="url" value="${jdbcUrl}"/>

        <property name="username" value="${username}"/>

        <property name="password" value="${password}"/>

        <!-- 初始化连接大小 -->

        <property name="initialSize" value="${initialSize}"></property>

        <!-- 连接池最大数量 -->

        <property name="maxActive" value="${maxActive}"></property>

        <!-- 连接池最大空闲 -->

        <property name="maxIdle" value="${maxIdle}"></property>

        <!-- 连接池最小空闲 -->

        <property name="minIdle" value="${minIdle}"></property>

        <!-- 获取连接最大等待时间 -->

        <property name="maxWait" value="${maxWait}"></property>

    </bean>


    <!-- mybatis和spring完美整合,不需要mybatis的配置映射文件 -->

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

        <property name="dataSource" ref="dataSource"/>

        <!-- 自动扫描mapping.xml文件 -->

        <property name="mapperLocations" value="classpath:mapping/*.xml"></property>

    </bean>


    <!-- DAO接口所在包名,Spring会自动查找其下的类 -->

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

        <property name="basePackage" value="com.fjf.ssm.dao"/>

        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>

    </bean>


    <!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

        <property name="dataSource" ref="dataSource"/>

    </bean>

    <!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->

    <tx:annotation-driven transaction-manager="transactionManager"/>

</beans>


一定要按照MyBatis的要求来干,这个还需要继续学习。

3、  要写一个(自动或者手动)数据库的映射文件,比如这里叫做UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >

<mapper namespace="com.fjf.ssm.dao.UserDao">

    <resultMap id="UserBaseMap" type="com.fjf.ssm.model.User">

        <id column="id" property="id" jdbcType="BIGINT"/>

        <result column="user_name" property="userName" jdbcType="VARCHAR"/>

        <result column="user_phone" property="userPhone" jdbcType="VARCHAR"/>

        <result column="user_email" property="userEmail" jdbcType="VARCHAR"/>

        <result column="user_pwd" property="userPwd" jdbcType="VARCHAR"/>

        <result column="pwd_salt" property="pwdSalt" jdbcType="VARCHAR"/>

        <result column="create_time" property="createTime" jdbcType="DATE"/>

        <result column="modify_time" property="modifyTime" jdbcType="DATE"/>

        <result column="is_delete" property="isDelete" jdbcType="SMALLINT"></result>

    </resultMap>


    <select id="selectUserById" parameterType="java.lang.Long" resultMap="UserBaseMap">

        SELECT * FROM t_user

        WHERE id = #{userId}

    </select>

    <select id="selectUserByPhoneOrEmail" resultMap="UserBaseMap">

        SELECT * FROM t_user

        WHERE user_email = #{emailOrPhone} OR user_phone = #{emailOrPhone}

        AND user_state = #{state}

    </select>

    <select id="selectAllUser" resultMap="UserBaseMap">

        SELECT * FROM t_user

    </select>

</mapper>

这个东西必然是自动生成,要不十来张表还可以忍受,一想到刚刚参加工作的数据库上千张表,估计直接跳楼得了。

4、  需要提醒的是,这些个文件都是建立在Resource文件夹下,一定不要弄错,否则配置文件里会变红提示错误。包括3中的那个数据库的映射文件,ORM必备的,也是在这个文件夹下的mapping文件夹内。

5、  更多的细节可以看一下那个参考的网页,同时把其代码下载下来,对比着做,就可以了,学新东西肯定是比较难受。坚持下来就好了。特别是类似于有空格这种东西,拷贝别人的数据时,难免会有这种情况。这种错误还非常不好找。

另外需要说明的是IDEA的maven项目中,默认源代码目录下的xml等资源文件并不会在编译的时候一块打包进classes文件夹,而是直接舍弃掉。


    项目中可能包含一些静态资源如:mapping/*.xml,又或者一些spring的配置文件:spring.xml、spring-mvc.xml等等。这些静态资源都要配置到target目录下才能保证项目运行,否则会报找不到运行所需的这些文件。

配置的方法是需要在Project选项中设置输出选项到classes中去。然后在pom.xml配置:

类似于:

<resources>

    <!-- 该配置很重要,用于将directory下的资源复制到classpath下面。即target/classes下面-->

    <resource>

        <targetPath>whu/edu/irlab/mapping/</targetPath>

        <directory>src/main/java/whu/edu/irlab/mapping/</directory>

        <includes>

            <include>*.xml</include>

        </includes>

    </resource>

    <resource>

        <directory>src/main/resources</directory>

    </resource>

</resources>

不过需要说明的是,在开发的过程中,是不是需要这个的。当然配置了也不会错。

就这样吧,暂时就这样吧,借《庄子.人间世》一句话:

其作始也简,其将毕也必巨。

  评论这张
 
阅读(91)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017