朋友玩qq游戏手游初始化失败败

&img src=&/v2-de663b0de_b.jpg& data-rawwidth=&700& data-rawheight=&474& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&/v2-de663b0de_r.jpg&&应&a href=&/people/0ee2faf56fe69f5781f3f& data-hash=&0ee2faf56fe69f5781f3f& class=&member_mention& data-editable=&true& data-title=&@祝顾笙& data-hovercard=&p$b$0ee2faf56fe69f5781f3f&&@祝顾笙&/a&同学的要求,分享16级同学实现的口袋妖怪游戏demo。实现了经典游戏口袋妖怪的简化版,包括简单的剧情和对战系统,可以存档、自由刷怪升级。&img src=&/v2-4d0b587cbccc82_b.jpg& data-rawwidth=&320& data-rawheight=&240& data-thumbnail=&/v2-4d0b587cbccc82_b.jpg& class=&content_image& width=&320&&&br&&p&以下为大概的实现过程:&/p&&p&1. 实现人物在地图上的自由移动。通过input变量改变地图的截取位置实现地图的移动;&/p&&p&&img src=&/v2-562ee62e85f1fef97fb1042799dbe94e_b.png& data-rawwidth=&761& data-rawheight=&283& class=&origin_image zh-lightbox-thumb& width=&761& data-original=&/v2-562ee62e85f1fef97fb1042799dbe94e_r.png&&2 加入了战斗函数和界面切换函数,这时只作为一个单独的函数,并没有衔接起来;&br&&/p&&p&3 定义了初始的精灵结构体和属性,在头文件里增加了技能函数,通过结构体将一个精灵的所有属性联系起来;&/p&&p&4 给地图设置障碍判断以及精灵相遇判断,通过给数组赋值来判断是否为障碍,当人物的坐标与精灵坐标小于一定距离时进入战斗函数;&/p&&img src=&/v2-3203dce31d3f4b5be516b83aa4b64509_b.png& data-rawwidth=&1244& data-rawheight=&607& class=&origin_image zh-lightbox-thumb& width=&1244& data-original=&/v2-3203dce31d3f4b5be516b83aa4b64509_r.png&&&p&5 给精灵设定时间属性,一定时间后才能再次相遇;&br&&/p&&p&6 完善了战斗画面,能根据精灵编号显示出不同的图片和释放不同技能;&br&&/p&&p&7 整合全部函数,加入剧情,使函数良好衔接。首先整合所有函数,然后再向地图对应位置加入进入剧情函数的判断;&/p&&img src=&/v2-536dd34c5fca_b.png& data-rawwidth=&1314& data-rawheight=&621& class=&origin_image zh-lightbox-thumb& width=&1314& data-original=&/v2-536dd34c5fca_r.png&&&img src=&/v2-fe1dd52ae_b.png& data-rawwidth=&1489& data-rawheight=&283& class=&origin_image zh-lightbox-thumb& width=&1489& data-original=&/v2-fe1dd52ae_r.png&&&p&8 加入存档读档功能;&br&&/p&&p&9 加入操作界面和音乐函数。&/p&&br&&p&实现效果:&/p&&img src=&/v2-6fe8bfe35bef0b8553863b_b.png& data-rawwidth=&769& data-rawheight=&624& class=&origin_image zh-lightbox-thumb& width=&769& data-original=&/v2-6fe8bfe35bef0b8553863b_r.png&&&p&分步骤代码下载地址:&a href=&/?target=http%3A///s/1gfIaEbD& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/s/1gfIaEb&/span&&span class=&invisible&&D&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&
应同学的要求,分享16级同学实现的口袋妖怪游戏demo。实现了经典游戏口袋妖怪的简化版,包括简单的剧情和对战系统,可以存档、自由刷怪升级。 以下为大概的实现过程:1. 实现人物在地图上的自由移动。通过input变量改变地图的截取位置实现地图的移动…
&img src=&/v2-82a0a686ccc_b.png& data-rawwidth=&1920& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&/v2-82a0a686ccc_r.png&&现在终于可以开始web.xml的配置了。在配置web.xml之前,我们还得先了解一下web.xml每个节点究竟起哪些作用。&h2&一、web.xml配置&/h2&&p&web.xml 是网络程序中的一个很重要的配置文件。在启动一个WEB项目的时候,WEB容器(比如tomcat)会去读取它的配置文件web.xml,读取到不同的节点时,WEB容器就会创建相应的过滤器、监听器等为这个web项目服务。&/p&&p&IDEA初始化以后自动生成的web.xml文件是这样的:&/p&&div class=&highlight&&&pre&&code class=&language-xml&&&span&&/span&&span class=&cp&&&!DOCTYPE web-app PUBLIC&/span&
&span class=&cp&& &-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN&&/span&
&span class=&cp&& &/dtd/web-app_2_3.dtd& &&/span&
&span class=&nt&&&web-app&&/span&
&span class=&nt&&&display-name&&/span&Archetype Created Web Application&span class=&nt&&&/display-name&&/span&
&span class=&nt&&&/web-app&&/span&
&/code&&/pre&&/div&&p&然后,我们稍微更改一下web.xml:&/p&&div class=&highlight&&&pre&&code class=&language-xml&&&span&&/span&&span class=&cp&&&?xml version=&1.0& encoding=&UTF-8&?&&/span&
&span class=&nt&&&web-app&/span& &span class=&na&&version=&/span&&span class=&s&&&2.5&&/span& &span class=&na&&xmlns=&/span&&span class=&s&&&/xml/ns/javaee&&/span&
&span class=&na&&xmlns:xsi=&/span&&span class=&s&&&http://www.w3.org/2001/XMLSchema-instance&&/span&
&span class=&na&&xsi:schemaLocation=&/span&&span class=&s&&&/xml/ns/javaee&/span&
&span class=&s&&
/xml/ns/javaee/web-app_2_5.xsd&&/span&&span class=&nt&&&&/span&
&span class=&nt&&&error-page&&/span&
&span class=&nt&&&error-code&&/span&404&span class=&nt&&&/error-code&&/span&
&span class=&nt&&&location&&/span&/errorPage.jsp&span class=&nt&&&/location&&/span&
&span class=&nt&&&/error-page&&/span&
&span class=&c&&&!--配置监听器--&&/span&
&span class=&nt&&&listener&&/span&
&span class=&nt&&&listener-class&&/span&org.springframework.web.context.ContextLoaderListener&span class=&nt&&&/listener-class&&/span&
&span class=&nt&&&/listener&&/span&
&span class=&nt&&&context-param&&/span&
&span class=&nt&&&param-name&&/span&contextConfigLocation&span class=&nt&&&/param-name&&/span&
&span class=&nt&&&param-value&&/span&classpath:applicationContext.xml&span class=&nt&&&/param-value&&/span&
&span class=&nt&&&/context-param&&/span&
&span class=&c&&&!--配置servlet--&&/span&
&span class=&nt&&&servlet&&/span&
&span class=&nt&&&servlet-name&&/span&dispatcher&span class=&nt&&&/servlet-name&&/span&
&span class=&nt&&&servlet-class&&/span&org.springframework.web.servlet.DispatcherServlet&span class=&nt&&&/servlet-class&&/span&
&span class=&nt&&&init-param&&/span&
&span class=&nt&&&param-name&&/span&contextConfigLocation&span class=&nt&&&/param-name&&/span&
&span class=&c&&&!--其中&param-value&**.xml&/param-value& 这里可以使用多种写法--&&/span&
&span class=&c&&&!--1、不写,使用默认值:/WEB-INF/&servlet-name&-servlet.xml--&&/span&
&span class=&c&&&!--2、&param-value&/WEB-INF/classes/dispatcher-servlet.xml&/param-value&--&&/span&
&span class=&c&&&!--3、&param-value&classpath*:dispatcher-servlet.xml&/param-value&--&&/span&
&span class=&c&&&!--4、多个值用逗号分隔--&&/span&
&span class=&nt&&&param-value&&/span&classpath:dispatcher-servlet.xml&span class=&nt&&&/param-value&&/span&
&span class=&nt&&&/init-param&&/span&
&span class=&nt&&&load-on-startup&&/span&1&span class=&nt&&&/load-on-startup&&/span&
&span class=&nt&&&/servlet&&/span&
&span class=&nt&&&servlet-mapping&&/span&
&span class=&nt&&&servlet-name&&/span&dispatcher&span class=&nt&&&/servlet-name&&/span&
&span class=&nt&&&url-pattern&&/span&/&span class=&nt&&&/url-pattern&&/span&
&span class=&nt&&&/servlet-mapping&&/span&
&span class=&c&&&!-- 编码过滤器--&&/span&
&span class=&nt&&&filter&&/span&
&span class=&nt&&&filter-name&&/span&encodingFilter&span class=&nt&&&/filter-name&&/span&
&span class=&nt&&&filter-class&&/span&org.springframework.web.filter.CharacterEncodingFilter&span class=&nt&&&/filter-class&&/span&
&span class=&nt&&&init-param&&/span&
&span class=&nt&&&param-name&&/span&encoding&span class=&nt&&&/param-name&&/span&
&span class=&nt&&&param-value&&/span&UTF-8&span class=&nt&&&/param-value&&/span&
&span class=&nt&&&/init-param&&/span&
&span class=&nt&&&/filter&&/span&
&span class=&nt&&&filter-mapping&&/span&
&span class=&nt&&&filter-name&&/span&encodingFilter&span class=&nt&&&/filter-name&&/span&
&span class=&nt&&&url-pattern&&/span&/*&span class=&nt&&&/url-pattern&&/span&
&span class=&nt&&&/filter-mapping&&/span&
&span class=&nt&&&/web-app&&/span&
&/code&&/pre&&/div&&p&注意,这个xml配置文件里配置了这么几项:&/p&&p&1、error-page:在容器内的域名访问出错时,会返回特定HTTP状态代码并且自动跳转到指定的errorPage。比如知乎的“没有知识的荒漠”就是一个errorPage。&/p&&p&2、 listener:监听器,能捕捉到服务器的启动和停止,在启动和停止触发里面的方法做相应的操作。必须在web.xml 中配置才能使用,是配置监听类的。&/p&&br&&p&3、contenxt-param:该节点用来声明应用范围(整个WEB项目)内的上下文初始化参数。param-name 设定上下文的参数名称。必须是唯一名称,而param-value 是设定参数名称的值。&/p&&p&4、servlet:这是个比较重要的节点。该servlet用于拦截请求(url-pattern为 / ,说明拦截所有请求。如果想拦截.do后缀文件的请求,就改为*.do),并交由Spring MVC的后台控制器来处理。这一项配置是必须的。load-on-startup节点用于标记容器是否在启动的时候就加载这个servlet。当值为0或者大于0时,表示容器在应用启动时就加载这个servlet;当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。正数的值越小,启动该servlet的优先级越高。&/p&&p&5、filter:过滤器。为了能够处理中文的post请求,post上传的编码统统改为utf-8。&/p&&p&至此,web.xml配置完毕。&strong&web.xml的加载过程是:context-param -& listener
-& fileter
-& servlet。&/strong&&/p&&p&然后,我们在resources目录下添加applicationContext.xml和dispatcher-servlet.xml,并将其加入容器的识别路径。如图。&/p&&p&&img src=&/v2-bd1b20c21560fbc81aa052a933a95672_b.png& data-rawwidth=&1282& data-rawheight=&1068& class=&origin_image zh-lightbox-thumb& width=&1282& data-original=&/v2-bd1b20c21560fbc81aa052a933a95672_r.png&&暂时不急着编写这两个文件。我们现在先配置数据库。&/p&&h2&二、数据库配置&/h2&&p&找到右侧database。添加MySQL数据源:&/p&&img src=&/v2-93ba4b9fe14398dd0affda2_b.png& data-rawwidth=&1920& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&/v2-93ba4b9fe14398dd0affda2_r.png&&&p&配置数据源:&br&&img src=&/v2-fb0e86846_b.png& data-rawwidth=&1078& data-rawheight=&903& class=&origin_image zh-lightbox-thumb& width=&1078& data-original=&/v2-fb0e86846_r.png&&然后,更改项目目录:&img src=&/v2-0fc573ec462f84ac37cfdce4f153018c_b.png& data-rawwidth=&402& data-rawheight=&601& class=&content_image& width=&402&&&/p&&br&
在java目录下区分出model、dao、service、controller这四个目录。后几篇文章中我会解释这么划分目录的目的。&br&&p&这时候,我们可以开始编写applicationContext.xml配置文件了。这个文件配置完毕后,每个对象都联系着Spring,并且能通过Spring注入到其他对象。这就是“依赖注入”的思想。怎么解释呢?还是从代码来入手:&/p&&p&首先在resources目录下添加jdbc.properties配置文件:&/p&&div class=&highlight&&&pre&&code class=&language-properties&&&span&&/span&&span class=&na&&jdbc.driver&/span&&span class=&o&&=&/span&&span class=&s&&com.mysql.jdbc.Driver&/span&
&span class=&na&&jdbc.url&/span&&span class=&o&&=&/span&&span class=&s&&jdbc:mysql://localhost:3306/webDemo?useUnicode=true&characterEncoding=UTF-8&/span&
&span class=&na&&jdbc.username&/span&&span class=&o&&=&/span&&span class=&s&&root&/span&
&span class=&na&&jdbc.password&/span&&span class=&o&&=&/span&&span class=&s&&1234&/span&
&span class=&na&&initialPoolSize&/span&&span class=&o&&=&/span&&span class=&s&&3&/span&
&span class=&na&&minPoolSize&/span&&span class=&o&&=&/span&&span class=&s&&3&/span&
&span class=&na&&maxPoolSize&/span&&span class=&o&&=&/span&&span class=&s&&15&/span&
&span class=&na&&acquireIncrement&/span&&span class=&o&&=&/span&&span class=&s&&3&/span&
&span class=&na&&maxStatements&/span&&span class=&o&&=&/span&&span class=&s&&8&/span&
&span class=&na&&maxStatementsPerConnection&/span&&span class=&o&&=&/span&&span class=&s&&10&/span&
&span class=&na&&maxIdleTime&/span&&span class=&o&&=&/span&&span class=&s&&1800&/span&
&span class=&na&&hibernate.show_sql&/span&&span class=&o&&=&/span&&span class=&s&&true&/span&
&span class=&na&&hibernate.use_sql_comments&/span&&span class=&o&&=&/span&&span class=&s&&true&/span&
&span class=&na&&hibernate.dialect&/span&&span class=&o&&=&/span&&span class=&s&&org.hibernate.dialect.MySQLDialect&/span&
&span class=&na&&hibernate.jdbc.fetch_size&/span&&span class=&o&&=&/span&&span class=&s&&50&/span&
&span class=&na&&hibernate.jdbc.batch_size&/span&&span class=&o&&=&/span&&span class=&s&&30&/span&
&span class=&na&&hibernate.use_outer_join&/span&&span class=&o&&=&/span&&span class=&s&&true&/span&
&span class=&na&&hibernate.cache.use_query_cache&/span&&span class=&o&&=&/span&&span class=&s&&true&/span&
&span class=&na&&hibernate.query.factory_class&/span&&span class=&o&&=&/span&&span class=&s&&org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory&/span&
&/code&&/pre&&/div&&p&然后是appicationContext.xml:&/p&&div class=&highlight&&&pre&&code class=&language-xml&&&span&&/span&&span class=&cp&&&?xml version=&1.0& encoding=&UTF-8&?&&/span&
&span class=&nt&&&beans&/span& &span class=&na&&xmlns=&/span&&span class=&s&&&http://www.springframework.org/schema/beans&&/span&
&span class=&na&&xmlns:xsi=&/span&&span class=&s&&&http://www.w3.org/2001/XMLSchema-instance&&/span&
&span class=&na&&xmlns:context=&/span&&span class=&s&&&http://www.springframework.org/schema/context&&/span&
&span class=&na&&xsi:schemaLocation=&/span&&span class=&s&&&http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd&&/span&&span class=&nt&&&&/span&
&span class=&c&&&!-- 自动扫描与装配bean --&&/span&
&span class=&nt&&&context:component-scan&/span& &span class=&na&&base-package=&/span&&span class=&s&&&org.caihaolun&&/span&&span class=&nt&&/&&/span&
&span class=&c&&&!-- 导入外部的properties文件--&&/span&
&span class=&nt&&&context:property-placeholder&/span& &span class=&na&&location=&/span&&span class=&s&&&classpath:jdbc.properties&&/span&&span class=&nt&&/&&/span&
&span class=&nt&&&bean&/span& &span class=&na&&name=&/span&&span class=&s&&&DataSource&&/span& &span class=&na&&class=&/span&&span class=&s&&&com.mchange.boPooledDataSource&&/span& &span class=&na&&destroy-method=&/span&&span class=&s&&&close&&/span&&span class=&nt&&&&/span&
&span class=&c&&&!-- 数据连接信息 --&&/span&
&span class=&nt&&&property&/span& &span class=&na&&name=&/span&&span class=&s&&&jdbcUrl&&/span& &span class=&na&&value=&/span&&span class=&s&&&${jdbc.url}&&/span&&span class=&nt&&/&&/span&
&span class=&nt&&&property&/span& &span class=&na&&name=&/span&&span class=&s&&&driverClass&&/span& &span class=&na&&value=&/span&&span class=&s&&&${jdbc.driver}&&/span&&span class=&nt&&/&&/span&
&span class=&nt&&&property&/span& &span class=&na&&name=&/span&&span class=&s&&&user&&/span& &span class=&na&&value=&/span&&span class=&s&&&${jdbc.username}&&/span&&span class=&nt&&/&&/span&
&span class=&nt&&&property&/span& &span class=&na&&name=&/span&&span class=&s&&&password&&/span& &span class=&na&&value=&/span&&span class=&s&&&${jdbc.password}&&/span&&span class=&nt&&/&&/span&
&span class=&c&&&!-- 其他配置 --&&/span&
&span class=&c&&&!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 --&&/span&
&span class=&nt&&&property&/span& &span class=&na&&name=&/span&&span class=&s&&&initialPoolSize&&/span& &span class=&na&&value=&/span&&span class=&s&&&${initialPoolSize}&&/span&&span class=&nt&&/&&/span&
&span class=&c&&&!--连接池中保留的最小连接数。Default: 3 --&&/span&
&span class=&nt&&&property&/span& &span class=&na&&name=&/span&&span class=&s&&&minPoolSize&&/span& &span class=&na&&value=&/span&&span class=&s&&&${minPoolSize}&&/span&&span class=&nt&&/&&/span&
&span class=&c&&&!--连接池中保留的最大连接数。Default: 15 --&&/span&
&span class=&nt&&&property&/span& &span class=&na&&name=&/span&&span class=&s&&&maxPoolSize&&/span& &span class=&na&&value=&/span&&span class=&s&&&${maxPoolSize}&&/span&&span class=&nt&&/&&/span&
&span class=&c&&&!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --&&/span&
&span class=&nt&&&property&/span& &span class=&na&&name=&/span&&span class=&s&&&acquireIncrement&&/span& &span class=&na&&value=&/span&&span class=&s&&&${acquireIncrement}&&/span&&span class=&nt&&/&&/span&
&span class=&c&&&!-- 控制数据源内加载的PreparedStatements数量。如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0 --&&/span&
&span class=&nt&&&property&/span& &span class=&na&&name=&/span&&span class=&s&&&maxStatements&&/span& &span class=&na&&value=&/span&&span class=&s&&&${maxStatements}&&/span&&span class=&nt&&/&&/span&
&span class=&c&&&!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 --&&/span&
&span class=&nt&&&property&/span& &span class=&na&&name=&/span&&span class=&s&&&maxStatementsPerConnection&&/span& &span class=&na&&value=&/span&&span class=&s&&&${maxStatementsPerConnection}&&/span&&span class=&nt&&/&&/span&
&span class=&c&&&!--最大空闲时间,1800秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 --&&/span&
&span class=&nt&&&property&/span& &span class=&na&&name=&/span&&span class=&s&&&maxIdleTime&&/span& &span class=&na&&value=&/span&&span class=&s&&&${maxIdleTime}&&/span&&span class=&nt&&/&&/span&
&span class=&nt&&&/bean&&/span&
&span class=&c&&&!-- 配置SessionFactory --&&/span&
&span class=&nt&&&bean&/span& &span class=&na&&id=&/span&&span class=&s&&&sessionFactory&&/span& &span class=&na&&class=&/span&&span class=&s&&&org.springframework.orm.hibernate4.LocalSessionFactoryBean&&/span&&span class=&nt&&&&/span&
&span class=&c&&&!-- 配置c3p0数据库连接池 --&&/span&
&span class=&nt&&&property&/span& &span class=&na&&name=&/span&&span class=&s&&&dataSource&&/span& &span class=&na&&ref=&/span&&span class=&s&&&DataSource&&/span&&span class=&nt&&/&&/span&
&span class=&nt&&&property&/span& &span class=&na&&name=&/span&&span class=&s&&&hibernateProperties&&/span&&span class=&nt&&&&/span&
&span class=&nt&&&props&&/span&
&span class=&nt&&&prop&/span& &span class=&na&&key=&/span&&span class=&s&&&hibernate.show_sql&&/span&&span class=&nt&&&&/span&
${hibernate.show_sql}
&span class=&nt&&&/prop&&/span&
&span class=&nt&&&prop&/span& &span class=&na&&key=&/span&&span class=&s&&&hibernate.use_sql_comments&&/span&&span class=&nt&&&&/span&
${hibernate.use_sql_comments}
&span class=&nt&&&/prop&&/span&
&span class=&c&&&!--&prop key=&hibernate.hbm2ddl.auto&&create&/prop&--&&/span&
&span class=&nt&&&prop&/span& &span class=&na&&key=&/span&&span class=&s&&&hibernate.dialect&&/span&&span class=&nt&&&&/span&
${hibernate.dialect}
&span class=&nt&&&/prop&&/span&
&span class=&nt&&&prop&/span& &span class=&na&&key=&/span&&span class=&s&&&hibernate.jdbc.fetch_size&&/span&&span class=&nt&&&&/span&
${hibernate.jdbc.fetch_size}
&span class=&nt&&&/prop&&/span&
&span class=&nt&&&prop&/span& &span class=&na&&key=&/span&&span class=&s&&&hibernate.jdbc.batch_size&&/span&&span class=&nt&&&&/span&
${hibernate.jdbc.batch_size}
&span class=&nt&&&/prop&&/span&
&span class=&nt&&&prop&/span& &span class=&na&&key=&/span&&span class=&s&&&hibernate.use_outer_join&&/span&&span class=&nt&&&&/span&
${hibernate.use_outer_join}
&span class=&nt&&&/prop&&/span&
&span class=&nt&&&prop&/span& &span class=&na&&key=&/span&&span class=&s&&&cache.use_query_cache&&/span&&span class=&nt&&&&/span&${hibernate.cache.use_query_cache}&span class=&nt&&&/prop&&/span&
&span class=&nt&&&prop&/span& &span class=&na&&key=&/span&&span class=&s&&&hibernate.query.factory_class&&/span&&span class=&nt&&&&/span&${hibernate.query.factory_class}&span class=&nt&&&/prop&&/span&
&span class=&nt&&&/props&&/span&
&span class=&nt&&&/property&&/span&
&span class=&c&&&!-- 自动扫描注解方式配置的hibernate类文件 --&&/span&
&span class=&nt&&&property&/span& &span class=&na&&name=&/span&&span class=&s&&&packagesToScan&&/span& &span class=&na&&value=&/span&&span class=&s&&&org.caihaolun.model&&/span&&span class=&nt&&/&&/span&
&span class=&nt&&&/bean&&/span&
&span class=&c&&&!--&tx:annotation-driven transaction-manager=&txManager&/&--&&/span&
&span class=&nt&&&bean&/span& &span class=&na&&id=&/span&&span class=&s&&&txManager&&/span& &span class=&na&&class=&/span&&span class=&s&&&org.springframework.orm.hibernate4.HibernateTransactionManager&&/span&&span class=&nt&&&&/span&
&span class=&nt&&&property&/span& &span class=&na&&name=&/span&&span class=&s&&&sessionFactory&&/span& &span class=&na&&ref=&/span&&span class=&s&&&sessionFactory&&/span&&span class=&nt&&/&&/span&
&span class=&nt&&&/bean&&/span&
&span class=&c&&&!-- 配置事务事务属性 --&&!--&tx:annotation-driven transaction-manager=&txManager&/&--&&/span&
&span class=&nt&&&tx:advice&/span& &span class=&na&&id=&/span&&span class=&s&&&txAdvice&&/span& &span class=&na&&transaction-manager=&/span&&span class=&s&&&txManager&&/span&&span class=&nt&&&&/span&
&span class=&nt&&&tx:attributes&&/span&
&span class=&nt&&&tx:method&/span& &span class=&na&&name=&/span&&span class=&s&&&save*&&/span& &span class=&na&&read-only=&/span&&span class=&s&&&false&&/span& &span class=&na&&propagation=&/span&&span class=&s&&&REQUIRED&&/span&&span class=&nt&&/&&/span&
&span class=&nt&&&tx:method&/span& &span class=&na&&name=&/span&&span class=&s&&&find*&&/span& &span class=&na&&read-only=&/span&&span class=&s&&&true&&/span& &span class=&na&&propagation=&/span&&span class=&s&&&REQUIRED&&/span&&span class=&nt&&/&&/span&
&span class=&nt&&&tx:method&/span& &span class=&na&&name=&/span&&span class=&s&&&delete*&&/span& &span class=&na&&propagation=&/span&&span class=&s&&&REQUIRED&&/span&&span class=&nt&&/&&/span&
&span class=&nt&&&tx:method&/span& &span class=&na&&name=&/span&&span class=&s&&&*&&/span&&span class=&nt&&/&&/span&
&span class=&nt&&&/tx:attributes&&/span&
&span class=&nt&&&/tx:advice&&/span&
&span class=&c&&&!--&context:annotation-config/&--&&/span&
&span class=&nt&&&aop:config&&/span&
&span class=&nt&&&aop:pointcut&/span& &span class=&na&&id=&/span&&span class=&s&&&txServices&&/span& &span class=&na&&expression=&/span&&span class=&s&&&execution(* org.caihaolun.dao.*.*(..))&&/span&&span class=&nt&&/&&/span&
&span class=&nt&&&aop:advisor&/span& &span class=&na&&advice-ref=&/span&&span class=&s&&&txAdvice&&/span& &span class=&na&&pointcut-ref=&/span&&span class=&s&&&txServices&&/span&&span class=&nt&&/&&/span&
&span class=&nt&&&/aop:config&&/span&
&span class=&nt&&&/beans&&/span&
&/code&&/pre&&/div&&p&现在好好解释一下:&/p&&p&1、context:component-scan:自动扫描并且装配base-package下的类。也就是说,base-package下的类只要加上@Component或其他的注解,就可以被自动扫描装配。这样就不必一个个写bean节点注入了。&/p&&p&2、DataSource的bean:使用c3p0连接池,逐个配置数据连接信息和连接池信息,重要的参数都保存在jdbc.properties里,直接通过${}引用。&/p&&p&3、sessionFactory:配置c3p0连接池和hibernate的配置信息,最后自动扫描model包下以注解方式配置的hibernate类文件 。&/p&&p&4、tx:事务。&/p&&p&5、aop:面向切面编程。这两个讲起来太繁琐了。我留到下一讲再详细阐述。&/p&&p&这时候注意:界面的左下角有个Persistence,点击后选择Generate Persistence Mapping-&By Database Schema:&/p&&img src=&/v2-e8d34464ac_b.png& data-rawwidth=&1920& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&/v2-e8d34464ac_r.png&&&p&然后出现这个页面:&/p&&p&&img src=&/v2-be4192af66_b.png& data-rawwidth=&1021& data-rawheight=&1072& class=&origin_image zh-lightbox-thumb& width=&1021& data-original=&/v2-be4192af66_r.png&&由于已经在spring中配置好了sessionFactory,因此可以自动将Schema加入sessionFactory中。&/p&&p&然后,model层就自动生成POJO类了。&img src=&/v2-fbe92b8ecc19d_b.png& data-rawwidth=&1920& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&/v2-fbe92b8ecc19d_r.png&&&/p&&p&接下来编写DAO层的代码:&/p&&p&UserDAO:&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&kn&&package&/span& &span class=&nn&&org.caihaolun.dao&/span&&span class=&o&&;&/span&
&span class=&kn&&import&/span& &span class=&nn&&org.caihaolun.model.User&/span&&span class=&o&&;&/span&
&span class=&kn&&import&/span& &span class=&nn&&org.hibernate.SessionFactory&/span&&span class=&o&&;&/span&
&span class=&kn&&import&/span& &span class=&nn&&org.springframework.orm.hibernate4.support.HibernateDaoSupport&/span&&span class=&o&&;&/span&
&span class=&kn&&import&/span& &span class=&nn&&org.springframework.stereotype.Repository&/span&&span class=&o&&;&/span&
&span class=&kn&&import&/span& &span class=&nn&&javax.annotation.Resource&/span&&span class=&o&&;&/span&
&span class=&kn&&import&/span& &span class=&nn&&java.util.List&/span&&span class=&o&&;&/span&
&span class=&cm&&/**&/span&
&span class=&cm&& * Created by Administrator on .&/span&
&span class=&cm&& * UserDAO&/span&
&span class=&cm&& */&/span&
&span class=&nd&&@Transactional&/span&
&span class=&nd&&@Repository&/span&
&span class=&kd&&public&/span& &span class=&kd&&class&/span& &span class=&nc&&UserDAO&/span& &span class=&kd&&extends&/span& &span class=&n&&HibernateDaoSupport&/span& &span class=&o&&{&/span&
&span class=&nd&&@Resource&/span&
&span class=&kd&&public&/span& &span class=&kt&&void&/span& &span class=&nf&&setHibernateTemplate&/span&&span class=&o&&(&/span&&span class=&n&&SessionFactory&/span& &span class=&n&&sessionFactory&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&kd&&super&/span&&span class=&o&&.&/span&&span class=&na&&setSessionFactory&/span&&span class=&o&&(&/span&&span class=&n&&sessionFactory&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span&
&span class=&kd&&public&/span& &span class=&kt&&void&/span& &span class=&nf&&save&/span&&span class=&o&&(&/span&&span class=&n&&User&/span& &span class=&n&&value&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&getHibernateTemplate&/span&&span class=&o&&().&/span&&span class=&na&&saveOrUpdate&/span&&span class=&o&&(&/span&&span class=&n&&value&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span&
&span class=&kd&&public&/span& &span class=&kt&&void&/span& &span class=&nf&&delete&/span&&span class=&o&&(&/span&&span class=&n&&User&/span& &span class=&n&&value&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&getHibernateTemplate&/span&&span class=&o&&().&/span&&span class=&na&&delete&/span&&span class=&o&&(&/span&&span class=&n&&value&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span&
&span class=&kd&&public&/span& &span class=&n&&User&/span& &span class=&nf&&findByID&/span&&span class=&o&&(&/span&&span class=&n&&String&/span& &span class=&n&&key&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&k&&return&/span& &span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&getHibernateTemplate&/span&&span class=&o&&().&/span&&span class=&na&&get&/span&&span class=&o&&(&/span&&span class=&n&&User&/span&&span class=&o&&.&/span&&span class=&na&&class&/span&&span class=&o&&,&/span& &span class=&n&&key&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span&
&span class=&kd&&public&/span& &span class=&n&&List&/span&&span class=&o&&&&/span&&span class=&n&&User&/span&&span class=&o&&&&/span& &span class=&nf&&findAll&/span&&span class=&o&&()&/span& &span class=&o&&{&/span&
&span class=&k&&return&/span& &span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&getHibernateTemplate&/span&&span class=&o&&().&/span&&span class=&na&&loadAll&/span&&span class=&o&&(&/span&&span class=&n&&User&/span&&span class=&o&&.&/span&&span class=&na&&class&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&p&BlogDAO:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&package org.caihaolun.
import org.caihaolun.model.B
import org.hibernate.SessionF
import org.springframework.orm.hibernate4.support.HibernateDaoS
import org.springframework.stereotype.R
import javax.annotation.R
import java.util.L
* Created by Administrator on .
@Transactional
@Repository
public class BlogDAO extends HibernateDaoSupport {
public void setHibernateTemplate(SessionFactory sessionFactory) {
super.setSessionFactory(sessionFactory);
public void save(Blog value) {
this.getHibernateTemplate().saveOrUpdate(value);
public void delete(Blog value) {
this.getHibernateTemplate().delete(value);
public Blog findByID(String key) {
return this.getHibernateTemplate().get(Blog.class, key);
public List&Blog& findAll() {
return this.getHibernateTemplate().loadAll(Blog.class);
&/code&&/pre&&/div&&p&至于为什么不写IDAO接口,理由很简单:编写接口的目的是为了维护和拓展性,在DAO层就是为了跨不同数据库访问数据。然而我这小项目并没有这个需求,所以本着奥卡姆剃刀原则,就不增加这个接口类了。&/p&&p&最后也是最重要的一步:编写Junit测试类。单元测试也是开发中很重要的一步。&/p&&p&新建一个包test,在其下建一个TestUser.java类:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&package org.caihaolun.
import org.caihaolun.dao.UserDAO;
import org.caihaolun.model.U
import org.junit.T
import org.junit.runner.RunW
import org.springframework.test.context.ContextC
import org.springframework.test.context.junit4.SpringJUnit4ClassR
import javax.annotation.R
* Created by Administrator on .
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {&classpath:applicationContext.xml&})
public class TestUser {
private UserDAO userDAO;
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
//测试save
public void testSave() throws Exception {
User user = new User();
user.setUid(1);
user.setUsername(&123&);
user.setPassword(&456&);
userDAO.save(user);
&/code&&/pre&&/div&&p&测试结果:&/p&&p&&img src=&/v2-82a0a686ccc_b.png& data-rawwidth=&1920& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&/v2-82a0a686ccc_r.png&&至此,数据层访问代码的编写工作就到此为止了。本来半个小时能写完的代码,为了写这篇文章还有提供截图,足足花费了3个小时的时间,各位大佬还不给个赞吗T_T~&/p&
现在终于可以开始web.xml的配置了。在配置web.xml之前,我们还得先了解一下web.xml每个节点究竟起哪些作用。一、web.xml配置web.xml 是网络程序中的一个很重要的配置文件。在启动一个WEB项目的时候,WEB容器(比如tomcat)会去读取它的配置文件web.xml,读…
新年第一篇 Springboot 技术文诞生。泥瓦匠准备写写 Springboot 相关最佳实践。一方面总结下一些 Springboot 相关,一方面和大家交流交流 Springboot 框架。&br&现在业界互联网流行的数据操作层框架 Mybatis,下面详解下 Springboot 如何整合 Mybatis ,这边没有使用 Mybatis Annotation 这种,是使用 xml 配置 SQL。因为我觉得 SQL 和业务代码应该隔离,方便和 DBA 校对 SQL。二者 XML 对较长的 SQL 比较清晰。&br&&br&&h3&&b&一、运行 springboot-mybatis 工程&/b&&/h3&git clone 下载工程 &a href=&/?target=https%3A///JeffLi1993/springboot-learning-example& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&springboot-learning-example&i class=&icon-external&&&/i&&/a& ,项目地址见 &a href=&/?target=http%3A//-%25C2%25A0https///JeffLi1993/springboot-learning-example& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub&i class=&icon-external&&&/i&&/a&。下面开始运行工程步骤(Quick Start):&br&&strong&1.数据库准备&/strong&&br&&br&a.创建数据库 springbootdb:&br&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&n&&CREATE&/span& &span class=&n&&DATABASE&/span& &span class=&n&&springbootdb&/span&&span class=&o&&;&/span&
&/code&&/pre&&/div&b.创建表 city :(因为我喜欢徒步)&br&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&n&&DROP&/span& &span class=&n&&TABLE&/span& &span class=&n&&IF&/span& &span class=&n&&EXISTS&/span&
&span class=&err&&`&/span&&span class=&n&&city&/span&&span class=&err&&`&/span&&span class=&o&&;&/span&
&span class=&n&&CREATE&/span& &span class=&n&&TABLE&/span& &span class=&err&&`&/span&&span class=&n&&city&/span&&span class=&err&&`&/span& &span class=&o&&(&/span&
&span class=&err&&`&/span&&span class=&n&&id&/span&&span class=&err&&`&/span& &span class=&kt&&int&/span&&span class=&o&&(&/span&&span class=&mi&&10&/span&&span class=&o&&)&/span& &span class=&n&&unsigned&/span& &span class=&n&&NOT&/span& &span class=&n&&NULL&/span& &span class=&n&&AUTO_INCREMENT&/span& &span class=&n&&COMMENT&/span& &span class=&err&&'&/span&&span class=&n&&城市编号&/span&&span class=&err&&'&/span&&span class=&o&&,&/span&
&span class=&err&&`&/span&&span class=&n&&province_id&/span&&span class=&err&&`&/span& &span class=&kt&&int&/span&&span class=&o&&(&/span&&span class=&mi&&10&/span&&span class=&o&&)&/span& &span class=&n&&unsigned&/span&
&span class=&n&&NOT&/span& &span class=&n&&NULL&/span& &span class=&n&&COMMENT&/span& &span class=&err&&'&/span&&span class=&n&&省份编号&/span&&span class=&err&&'&/span&&span class=&o&&,&/span&
&span class=&err&&`&/span&&span class=&n&&city_name&/span&&span class=&err&&`&/span& &span class=&n&&varchar&/span&&span class=&o&&(&/span&&span class=&mi&&25&/span&&span class=&o&&)&/span& &span class=&n&&DEFAULT&/span& &span class=&n&&NULL&/span& &span class=&n&&COMMENT&/span& &span class=&err&&'&/span&&span class=&n&&城市名称&/span&&span class=&err&&'&/span&&span class=&o&&,&/span&
&span class=&err&&`&/span&&span class=&n&&description&/span&&span class=&err&&`&/span& &span class=&n&&varchar&/span&&span class=&o&&(&/span&&span class=&mi&&25&/span&&span class=&o&&)&/span& &span class=&n&&DEFAULT&/span& &span class=&n&&NULL&/span& &span class=&n&&COMMENT&/span& &span class=&err&&'&/span&&span class=&n&&描述&/span&&span class=&err&&'&/span&&span class=&o&&,&/span&
&span class=&n&&PRIMARY&/span& &span class=&nf&&KEY&/span& &span class=&o&&(&/span&&span class=&err&&`&/span&&span class=&n&&id&/span&&span class=&err&&`&/span&&span class=&o&&)&/span&
&span class=&o&&)&/span& &span class=&n&&ENGINE&/span&&span class=&o&&=&/span&&span class=&n&&InnoDB&/span& &span class=&n&&AUTO_INCREMENT&/span&&span class=&o&&=&/span&&span class=&mi&&1&/span& &span class=&n&&DEFAULT&/span& &span class=&n&&CHARSET&/span&&span class=&o&&=&/span&&span class=&n&&utf8&/span&&span class=&o&&;&/span&
&/code&&/pre&&/div&c.插入数据&br&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&n&&INSERT&/span& &span class=&n&&city&/span& &span class=&nf&&VALUES&/span& &span class=&o&&(&/span&&span class=&mi&&1&/span& &span class=&o&&,&/span&&span class=&mi&&1&/span&&span class=&o&&,&/span&&span class=&err&&'&/span&&span class=&n&&温岭市&/span&&span class=&sc&&','&/span&&span class=&n&&BYSocket&/span& &span class=&n&&的家在温岭&/span&&span class=&err&&。'&/span&&span class=&o&&);&/span&
&/code&&/pre&&/div&&br&&strong&2. 项目结构介绍&/strong&&br&项目结构如下图所示:&img src=&/v2-e12f529faa1c83c62d89f327f2364f1c_b.png& data-rawwidth=&862& data-rawheight=&1250& class=&origin_image zh-lightbox-thumb& width=&862& data-original=&/v2-e12f529faa1c83c62d89f327f2364f1c_r.png&&&blockquote&org.spring.springboot.controller – Controller 层 &br&org.spring.springboot.dao – 数据操作层 DAO &br&org.spring.springboot.domain – 实体类 &br&org.spring.springboot.service – 业务逻辑层 &br&Application – 应用启动类 &br&application.properties – 应用配置文件,应用启动会自动读取配置&/blockquote&&br&&strong&3.改数据库配置&/strong&&br&打开 application.properties 文件, 修改相应的数据源配置,比如数据源地址、账号、密码等。(如果不是用 MySQL,自行添加连接驱动 pom,然后修改驱动名配置。)&br&&br&&strong&4.编译工程&/strong&&br&在项目根目录 springboot-learning-example,运行 maven 指令:&br&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&n&&mvn&/span& &span class=&n&&clean&/span& &span class=&n&&install&/span&
&/code&&/pre&&/div&&br&&b&5.运行工程&/b&&br&右键运行 Application 应用启动类的 main 函数,然后在浏览器访问:&div class=&highlight&&&pre&&code class=&language-js&&&span&&/span&&span class=&nx&&http&/span&&span class=&o&&:&/span&&span class=&c1&&//localhost:8080/api/city?cityName=温岭市&/span&
&/code&&/pre&&/div&&p&可以看到返回的 JSON 结果:&br&&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&o&&{&/span&
&span class=&s&&&id&&/span&&span class=&o&&:&/span& &span class=&mi&&1&/span&&span class=&o&&,&/span&
&span class=&s&&&provinceId&&/span&&span class=&o&&:&/span& &span class=&mi&&1&/span&&span class=&o&&,&/span&
&span class=&s&&&cityName&&/span&&span class=&o&&:&/span& &span class=&s&&&温岭市&&/span&&span class=&o&&,&/span&
&span class=&s&&&description&&/span&&span class=&o&&:&/span& &span class=&s&&&我的家在温岭。&&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&p&如图:&br&&/p&&img src=&/v2-b6cdc82291abc928c32d2_b.png& data-rawwidth=&972& data-rawheight=&482& class=&origin_image zh-lightbox-thumb& width=&972& data-original=&/v2-b6cdc82291abc928c32d2_r.png&&&h3&&b&二、springboot-mybatis 工程配置详解&/b&&/h3&&p&&strong&1.pom 添加 Mybatis 依赖&/strong&&br&&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&o&&&!--&/span& &span class=&n&&Spring&/span& &span class=&n&&Boot&/span& &span class=&n&&Mybatis&/span& &span class=&n&&依赖&/span& &span class=&o&&--&&/span&
&span class=&o&&&&/span&&span class=&n&&dependency&/span&&span class=&o&&&&/span&
&span class=&o&&&&/span&&span class=&n&&groupId&/span&&span class=&o&&&&/span&&span class=&n&&org&/span&&span class=&o&&.&/span&&span class=&na&&mybatis&/span&&span class=&o&&.&/span&&span class=&na&&spring&/span&&span class=&o&&.&/span&&span class=&na&&boot&/span&&span class=&o&&&/&/span&&span class=&n&&groupId&/span&&span class=&o&&&&/span&
&span class=&o&&&&/span&&span class=&n&&artifactId&/span&&span class=&o&&&&/span&&span class=&n&&mybatis&/span&&span class=&o&&-&/span&&span class=&n&&spring&/span&&span class=&o&&-&/span&&span class=&n&&boot&/span&&span class=&o&&-&/span&&span class=&n&&starter&/span&&span class=&o&&&/&/span&&span class=&n&&artifactId&/span&&span class=&o&&&&/span&
&span class=&o&&&&/span&&span class=&n&&version&/span&&span class=&o&&&&/span&&span class=&n&&$&/span&&span class=&o&&{&/span&&span class=&n&&mybatis&/span&&span class=&o&&-&/span&&span class=&n&&spring&/span&&span class=&o&&-&/span&&span class=&n&&boot&/span&&span class=&o&&}&/&/span&&span class=&n&&version&/span&&span class=&o&&&&/span&
&span class=&o&&&/&/span&&span class=&n&&dependency&/span&&span class=&o&&&&/span&
&/code&&/pre&&/div&&p&mybatis-spring-boot-starter 工程依赖如图:&br&&/p&&p&&img src=&/v2-ae97f6f3c27be1978c33dcfb_b.png& data-rawwidth=&1024& data-rawheight=&240& class=&origin_image zh-lightbox-thumb& width=&1024& data-original=&/v2-ae97f6f3c27be1978c33dcfb_r.png&&整个工程的 pom.xml:&br&&/p&&div class=&highlight&&&pre&&code class=&language-xml&&&span&&/span&&span class=&cp&&&?xml version=&1.0& encoding=&UTF-8&?&&/span&
&span class=&nt&&&project&/span& &span class=&na&&xmlns=&/span&&span class=&s&&&http://maven.apache.org/POM/4.0.0&&/span& &span class=&na&&xmlns:xsi=&/span&&span class=&s&&&http://www.w3.org/2001/XMLSchema-instance&&/span&
&span class=&na&&xsi:schemaLocation=&/span&&span class=&s&&&http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&&/span&&span class=&nt&&&&/span&
&span class=&nt&&&modelVersion&&/span&4.0.0&span class=&nt&&&/modelVersion&&/span&
&span class=&nt&&&groupId&&/span&springboot&span class=&nt&&&/groupId&&/span&
&span class=&nt&&&artifactId&&/span&springboot-mybatis&span class=&nt&&&/artifactId&&/span&
&span class=&nt&&&version&&/span&0.0.1-SNAPSHOT&span class=&nt&&&/version&&/span&
&span class=&nt&&&name&&/span&springboot-mybatis :: 整合 Mybatis Demo&span class=&nt&&&/name&&/span&
&span class=&c&&&!-- Spring Boot 启动父依赖 --&&/span&
&span class=&nt&&&parent&&/span&
&span class=&nt&&&groupId&&/span&org.springframework.boot&span class=&nt&&&/groupId&&/span&
&span class=&nt&&&artifactId&&/span&spring-boot-starter-parent&span class=&nt&&&/artifactId&&/span&
&span class=&nt&&&version&&/span&1.5.1.RELEASE&span class=&nt&&&/version&&/span&
&span class=&nt&&&/parent&&/span&
&span class=&nt&&&properties&&/span&
&span class=&nt&&&mybatis-spring-boot&&/span&1.2.0&span class=&nt&&&/mybatis-spring-boot&&/span&
&span class=&nt&&&mysql-connector&&/span&5.1.39&span class=&nt&&&/mysql-connector&&/span&
&span class=&nt&&&/properties&&/span&
&span class=&nt&&&dependencies&&/span&
&span class=&c&&&!-- Spring Boot Web 依赖 --&&/span&
&span class=&nt&&&dependency&&/span&
&span class=&nt&&&groupId&&/span&org.springframework.boot&span class=&nt&&&/groupId&&/span&
&span class=&nt&&&artifactId&&/span&spring-boot-starter-web&span class=&nt&&&/artifactId&&/span&
&span class=&nt&&&/dependency&&/span&
&span class=&c&&&!-- Spring Boot Test 依赖 --&&/span&
&span class=&nt&&&dependency&&/span&
&span class=&nt&&&groupId&&/span&org.springframework.boot&span class=&nt&&&/groupId&&/span&
&span class=&nt&&&artifactId&&/span&spring-boot-starter-test&span class=&nt&&&/artifactId&&/span&
&span class=&nt&&&scope&&/span&test&span class=&nt&&&/scope&&/span&
&span class=&nt&&&/dependency&&/span&
&span class=&c&&&!-- Spring Boot Mybatis 依赖 --&&/span&
&span class=&nt&&&dependency&&/span&
&span class=&nt&&&groupId&&/span&org.mybatis.spring.boot&span class=&nt&&&/groupId&&/span&
&span class=&nt&&&artifactId&&/span&mybatis-spring-boot-starter&span class=&nt&&&/artifactId&&/span&
&span class=&nt&&&version&&/span&${mybatis-spring-boot}&span class=&nt&&&/version&&/span&
&span class=&nt&&&/dependency&&/span&
&span class=&c&&&!-- MySQL 连接驱动依赖 --&&/span&
&span class=&nt&&&dependency&&/span&
&span class=&nt&&&groupId&&/span&mysql&span class=&nt&&&/groupId&&/span&
&span class=&nt&&&artifactId&&/span&mysql-connector-java&span class=&nt&&&/artifactId&&/span&
&span class=&nt&&&version&&/span&${mysql-connector}&span class=&nt&&&/version&&/span&
&span class=&nt&&&/dependency&&/span&
&span class=&c&&&!-- Junit --&&/span&
&span class=&nt&&&dependency&&/span&
&span class=&nt&&&groupId&&/span&junit&span class=&nt&&&/groupId&&/span&
&span class=&nt&&&artifactId&&/span&junit&span class=&nt&&&/artifactId&&/span&
&span class=&nt&&&version&&/span&4.12&span class=&nt&&&/version&&/span&
&span class=&nt&&&/dependency&&/span&
&span class=&nt&&&/dependencies&&/span&
&span class=&nt&&&/project&&/span&
&/code&&/pre&&/div&&p&&strong&2.在 application.properties 应用配置文件,增加 Mybatis 相关配置&/strong&&br&&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&err&&##&/span& &span class=&n&&Mybatis&/span& &span class=&n&&配置&/span&
&span class=&n&&mybatis&/span&&span class=&o&&.&/span&&span class=&na&&typeAliasesPackage&/span&&span class=&o&&=&/span&&span class=&n&&org&/span&&span class=&o&&.&/span&&span class=&na&&spring&/span&&span class=&o&&.&/span&&span class=&na&&springboot&/span&&span class=&o&&.&/span&&span class=&na&&domain&/span&
&span class=&n&&mybatis&/span&&span class=&o&&.&/span&&span class=&na&&mapperLocations&/span&&span class=&o&&=&/span&&span class=&n&&classpath&/span&&span class=&o&&:&/span&&span class=&n&&mapper&/span&&span class=&o&&/*.&/span&&span class=&na&&xml&/span&
&/code&&/pre&&/div&mybatis.typeAliasesPackage 配置为 org.spring.springboot.domain, 指向实体类包路径。mybatis.mapperLocations 配置为classpath 路径下mapper 包下,* 代表会扫描所有xml文件。&br&mybatis 其他配置相关详解如下:&br&&blockquote&&i&mybatis.config = mybatis 配置文件名称&/i&&br&&i&mybatis.mapperLocations = mapper xml 文件地址&/i&&br&&br&&br&&i&mybatis.typeAliasesPackage = 实体类包路径&/i&&br&&i&mybatis.typeHandlersPackage = type handlers 处理器包路径&/i&&br&&i&mybatis.check-config-location = 检查 mybatis 配置是否存在,一般命名为 mybatis-config.xml&/i&&br&&i&mybatis.executorType = 执行模式。默认是 SIMPLE&br&&/i&&/blockquote&&br&&p&&strong&3.在 Application 应用启动类添加注解 MapperScan&/strong&&br&&/p&&p&Application.java 代码如下:&br&&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&cm&&/**&/span&
&span class=&cm&& * Spring Boot 应用启动类&/span&
&span class=&cm&& *&/span&
&span class=&cm&& * Created by bysocket on 16/4/26.&/span&
&span class=&cm&& */&/span&
&span class=&c1&&// Spring Boot 应用的标识&/span&
&span class=&nd&&@SpringBootApplication&/span&
&span class=&c1&&// mapper 接口类扫描包配置&/span&
&span class=&nd&&@MapperScan&/span&&span class=&o&&(&/span&&span class=&s&&&org.spring.springboot.dao&&/span&&span class=&o&&)&/span&
&span class=&kd&&public&/span& &span class=&kd&&class&/span& &span class=&nc&&Application&/span& &span class=&o&&{&/span&
&span class=&kd&&public&/span& &span class=&kd&&static&/span& &span class=&kt&&void&/span& &span class=&nf&&main&/span&&span class=&o&&(&/span&&span class=&n&&String&/span&&span class=&o&&[]&/span& &span class=&n&&args&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&c1&&// 程序启动入口&/span&
&span class=&c1&&// 启动嵌入式的 Tomcat 并初始化 Spring 环境及其各 Spring 组件&/span&
&span class=&n&&SpringApplication&/span&&span class=&o&&.&/span&&span class=&na&&run&/span&&span class=&o&&(&/span&&span class=&n&&Application&/span&&span class=&o&&.&/span&&span class=&na&&class&/span&&span class=&o&&,&/span&&span class=&n&&args&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&mapper 接口类扫描包配置注解 MapperScan用这个注解可以注册Mybatis mapper接口类。&br&&br&&strong&4.添加相应的 City domain类、CityDao mapper接口类&/strong&&br&&p&City.java:&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&cm&&/**&/span&
&span class=&cm&& * 城市实体类&/span&
&span class=&cm&& *&/span&
&span class=&cm&& * Created by bysocket on 07/02/2017.&/span&
&span class=&cm&& */&/span&
&span class=&kd&&public&/span& &span class=&kd&&class&/span& &span class=&nc&&City&/span& &span class=&o&&{&/span&
&span class=&cm&&/**&/span&
&span class=&cm&&
* 城市编号&/span&
&span class=&cm&&
&span class=&kd&&private&/span& &span class=&n&&Long&/span& &span class=&n&&id&/span&&span class=&o&&;&/span&
&span class=&cm&&/**&/span&
&span class=&cm&&
* 省份编号&/span&
&span class=&cm&&
&span class=&kd&&private&/span& &span class=&n&&Long&/span& &span class=&n&&provinceId&/span&&span class=&o&&;&/span&
&span class=&cm&&/**&/span&
&span class=&cm&&
* 城市名称&/span&
&span class=&cm&&
&span class=&kd&&private&/span& &span class=&n&&String&/span& &span class=&n&&cityName&/span&&span class=&o&&;&/span&
&span class=&cm&&/**&/span&
&span class=&cm&&
* 描述&/span&
&span class=&cm&&
&span class=&kd&&private&/span& &span class=&n&&String&/span& &span class=&n&&description&/span&&span class=&o&&;&/span&
&span class=&kd&&public&/span& &span class=&n&&Long&/span& &span class=&nf&&getId&/span&&span class=&o&&()&/span& &span class=&o&&{&/span&
&span class=&k&&return&/span& &span class=&n&&id&/span&&span class=&o&&;&/span&
&span class=&o&&}&/span&
&span class=&kd&&public&/span& &span class=&kt&&void&/span& &span class=&nf&&setId&/span&&span class=&o&&(&/span&&span class=&n&&Long&/span& &span class=&n&&id&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&id&/span& &span class=&o&&=&/span& &span class=&n&&id&/span&&span class=&o&&;&/span&
&span class=&o&&}&/span&
&span class=&kd&&public&/span& &span class=&n&&Long&/span& &span class=&nf&&getProvinceId&/span&&span class=&o&&()&/span& &span class=&o&&{&/span&
&span class=&k&&return&/span& &span class=&n&&provinceId&/span&&span class=&o&&;&/span&
&span class=&o&&}&/span&
&span class=&kd&&public&/span& &span class=&kt&&void&/span& &span class=&nf&&setProvinceId&/span&&span class=&o&&(&/span&&span class=&n&&Long&/span& &span class=&n&&provinceId&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&provinceId&/span& &span class=&o&&=&/span& &span class=&n&&provinceId&/span&&span class=&o&&;&/span&
&span class=&o&&}&/span&
&span class=&kd&&public&/span& &span class=&n&&String&/span& &span class=&nf&&getCityName&/span&&span class=&o&&()&/span& &span class=&o&&{&/span&
&span class=&k&&return&/span& &span class=&n&&cityName&/span&&span class=&o&&;&/span&
&span class=&o&&}&/span&
&span class=&kd&&public&/span& &span class=&kt&&void&/span& &span class=&nf&&setCityName&/span&&span class=&o&&(&/span&&span class=&n&&String&/span& &span class=&n&&cityName&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&cityName&/span& &span class=&o&&=&/span& &span class=&n&&cityName&/span&&span class=&o&&;&/span&
&span class=&o&&}&/span&
&span class=&kd&&public&/span& &span class=&n&&String&/span& &span class=&nf&&getDescription&/span&&span class=&o&&()&/span& &span class=&o&&{&/span&
&span class=&k&&return&/span& &span class=&n&&description&/span&&span class=&o&&;&/span&
&span class=&o&&}&/span&
&span class=&kd&&public&/span& &span class=&kt&&void&/span& &span class=&nf&&setDescription&/span&&span class=&o&&(&/span&&span class=&n&&String&/span& &span class=&n&&description&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&description&/span& &span class=&o&&=&/span& &span class=&n&&description&/span&&span class=&o&&;&/span&
&span class=&o&&}&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&p&CityDao.java:&br&&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&cm&&/**&/span&
&span class=&cm&& * 城市 DAO 接口类&/span&
&span class=&cm&& *&/span&
&span class=&cm&& * Created by bysocket on 07/02/2017.&/span&
&span class=&cm&& */&/span&
&span class=&kd&&public&/span& &span class=&kd&&interface&/span& &span class=&nc&&CityDao&/span& &span class=&o&&{&/span&
&span class=&cm&&/**&/span&
&span class=&cm&&
* 根据城市名称,查询城市信息&/span&
&span class=&cm&&
&span class=&cm&&
* @param cityName 城市名&/span&
&span class=&cm&&
&span class=&n&&City&/span& &span class=&nf&&findByName&/span&&span class=&o&&(&/span&&span class=&nd&&@Param&/span&&span class=&o&&(&/span&&span class=&s&&&cityName&&/span&&span class=&o&&)&/span& &span class=&n&&String&/span& &span class=&n&&cityName&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&p&其他不明白的,可以 git clone 下载工程 &a href=&/?target=https%3A///JeffLi1993/springboot-learning-example& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&springboot-learning-example&i class=&icon-external&&&/i&&/a& ,工程代码注解很详细。 &a href=&/?target=https%3A///JeffLi1993/springboot-learning-example& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&JeffLi1993/springboot-learning-example&i class=&icon-external&&&/i&&/a&。&br&&/p&&br&&br&&h3&&b&三、其他&/b&&/h3&利用 Mybatis-generator自动生成代码&a href=&/?target=http%3A///yjmyzz/p/4210554.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&利用mybatis-generator自动生成代码 - 菩提树下的杨过 - 博客园&i class=&icon-external&&&/i&&/a&&br&Mybatis 通用 Mapper3 &a href=&/?target=https%3A///abel533/Mapper& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&abel533/Mapper&i class=&icon-external&&&/i&&/a&&br&Mybatis 分页插件 PageHelper &a href=&/?target=https%3A///pagehelper/Mybatis-PageHelper& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&pagehelper/Mybatis-PageHelper&i class=&icon-external&&&/i&&/a&&br&最后,推荐阅读:《 &a href=&/?target=http%3A///%3Fp%3D1124& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Spring Boot 之 HelloWorld 详解&i class=&icon-external&&&/i&&/a&》&br&&br&&br&&br&&br&&br&作者:泥瓦匠&br&链接:&a href=&/?target=http%3A///%3Fp%3D1610& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Springboot 整合 Mybatis 的完整 Web 案例&i class=&icon-external&&&/i&&/a&&br&&b&版权归作者所有,转载请注明出处&/b&
新年第一篇 Springboot 技术文诞生。泥瓦匠准备写写 Springboot 相关最佳实践。一方面总结下一些 Springboot 相关,一方面和大家交流交流 Springboot 框架。 现在业界互联网流行的数据操作层框架 Mybatis,下面详解下 Springboot 如何整合 Mybatis ,这边没…
经典问题。题主是在Windows上装了Oracle/Sun JDK(过程中还同意安装了Public JRE),然后没有修改过PATH环境变量的配置对不对?&br&&br&那么您在命令行里运行的java.exe来自Public JRE,具体来说在C:\Windows\System32\java.exe。它会找到您系统上现在装着的那个Public JRE的具体路径去运行Java程序。&br&而javac.exe不是JRE的一部分,而是JDK的。JDK的安装程序不会自动将自己的bin目录配置到PATH环境变量上,所以在命令行里也看不到它。&br&&br&要解决这个问题要么自己手动把JDK安装目录的bin目录配置到PATH环境变量里,要么在命令行用JDK的全路径去访问javac.exe。
经典问题。题主是在Windows上装了Oracle/Sun JDK(过程中还同意安装了Public JRE),然后没有修改过PATH环境变量的配置对不对? 那么您在命令行里运行的java.exe来自Public JRE,具体来说在C:\Windows\System32\java.exe。它会找到您系统上现在装着的那个Pu…
&p&关于深度学习,网上的资料很多,不过貌似大部分都不太适合初学者。
这里有几个原因:
1.深度学习确实需要一定的数学基础。如果不用深入浅出地方法讲,有些读者就会有畏难的情绪,因而容易过早地放弃。
2.中国人或美国人写的书籍或文章,普遍比较难一些。我不太清楚为什么,不过确实是这样子的。&/p&&p&深度学习,确实需要一定的数学基础,但真的那么难么?这个,还真没有。不信?听我来给你侃侃。看完,你也会觉得没那么难了。&/p&&p&本文是针对初学者,高手可以无视,有不对的地方,还请多多批评指正。&/p&&p&这里,先推荐一篇非常不错的文章:
《1天搞懂深度学习》,300多页的ppt,台湾李宏毅教授写的,非常棒。
不夸张地说,是我看过最系统,也最通俗易懂的,关于深度学习的文章。&/p&&p&这是slideshare的链接:
&a href=&///?target=http%3A//www.slideshare.net/tw_dsconf/ss-Fqid%3D108adce3-2c3d-d0a57e46bc%26v%3D%26b%3D%26from_search%3D3& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&http://www.slideshare.net/tw_dsconf/ss-?qid=108adce3-2c3d-d0a57e46bc&v=&b=&from_search=3&i class=&icon-external&&&/i&&/a&&/p&&p&没梯子的同学,可以从我的网盘下:
链接:&a href=&///?target=http%3A///s/1nv54p9R& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/s/1nv54p9&/span&&span class=&invisible&&R&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a& 密码:3mty&/p&&p&要说先准备什么,私以为,其实只需要知道导数和相关的函数概念就可以了。高等数学也没学过?很好,我就是想让文科生也能看懂,您只需要学过初中数学就可以了。&/p&&p&其实不必有畏难的情绪,个人很推崇李书福的精神,在一次电视采访中,李书福说:谁说中国人不能造汽车?造汽车有啥难的,不就是四个轮子加两排沙发嘛。当然,他这个结论有失偏颇,不过精神可嘉。&/p&&p&导数是什么,无非就是变化率呗,王小二今年卖了100头猪,去年卖了90头,前年卖了80头。。。变化率或者增长率是什么?每年增长10头猪,多简单。这里需要注意有个时间变量---年。王小二卖猪的增长率是10头/年,也就是说,导数是10.
函数y=f(x)=10x+30,这里我们假设王小二第一年卖了30头,以后每年增长10头,x代表时间(年),y代表猪的头数。
当然,这是增长率固定的情形,现实生活中,很多时候,变化量也不是固定的,也就是说增长率也不是恒定的。比如,函数可能是这样: y=f(x)=5x?+30,这里x和y依然代表的是时间和头数,不过增长率变了,怎么算这个增长率,我们回头再讲。或者你干脆记住几个求导的公式也可以。&/p&&p&深度学习还有一个重要的数学概念:偏导数,偏导数的偏怎么理解?偏头疼的偏,还是我不让你导,你偏要导?都不是,我们还以王小二卖猪为例,刚才我们讲到,x变量是时间(年),可是卖出去的猪,不光跟时间有关啊,随着业务的增长,王小二不仅扩大了养猪场,还雇了很多员工一起养猪。所以方程式又变了:y=f(x)=5x??+8x? + 35x? +30
这里x?代表面积,x?代表员工数,当然x?还是时间。
上面我们讲了,导数其实就是变化率,那么偏导数是什么?偏导数无非就是多个变量的时候,针对某个变量的变化率呗。在上面的公式里,如果针对x?求偏导数,也就是说,员工对于猪的增长率贡献有多大,或者说,随着(每个)员工的增长,猪增加了多少,这里等于35---每增加一个员工,就多卖出去35头猪. 计算偏导数的时候,其他变量都可以看成常量,这点很重要,常量的变化率为0,所以导数为0,所以就剩对35x? 求导数,等于35. 对于x?求偏导,也是类似的。
求偏导我们用一个符号 表示:比如 y/ x? 就表示y对 x?求偏导。&/p&&p&废话半天,这些跟深度学习到底有啥关系?有关系,我们知道,深度学习是采用神经网络,用于解决线性不可分的问题。关于这一点,我们回头再讨论,大家也可以网上搜一下相关的文章。我这里主要讲讲数学与深度学习的关系。先给大家看几张图:&/p&&img src=&/v2-cbe0cdfd0af76d328ebe_b.png& data-rawwidth=&631& data-rawheight=&488& class=&origin_image zh-lightbox-thumb& width=&631& data-original=&/v2-cbe0cdfd0af76d328ebe_r.png&&&p& 图1. 所谓深度学习,就是具有很多个隐层的神经网络。&/p&&img src=&/v2-0d5accd6d800be9f933b_b.jpg& data-rawwidth=&432& data-rawheight=&576& class=&origin_image zh-lightbox-thumb& width=&432& data-original=&/v2-0d5accd6d800be9f933b_r.jpg&&&br&&p&图2.单输出的时候,怎么求偏导数&/p&&img src=&/v2-c52b1fcdd42c3ace40a8619_b.jpg& data-rawwidth=&432& data-rawheight=&576& class=&origin_image zh-lightbox-thumb& width=&432& data-original=&/v2-c52b1fcdd42c3ace40a8619_r.jpg&&&p&图3.多输出的时候,怎么求偏导数。后面两张图是日语的,这是日本人写的关于深度学习的书。感觉写的不错,把图盗来用一下。所谓入力层,出力层,中间层,分别对应于中文的:输入层,输出层,和隐层。&/p&&p&大家不要被这几张图吓着,其实很简单的。干脆再举一个例子,就以撩妹为例。男女恋爱我们大致可以分为三个阶段:
1.初恋期。相当于深度学习的输入层。别人吸引你,肯定是有很多因素,比如:身高,身材,脸蛋,学历,性格等等,这些都是输入层的参数,对每个人来说权重可能都不一样。
2.热恋期。我们就让它对应于隐层吧。这个期间,双方各种磨合,柴米油盐酱醋茶。
3.稳定期。对应于输出层,是否合适,就看磨合得咋样了。&/p&&p&大家都知道,磨合很重要,怎么磨合呢?就是不断学习训练和修正的过程嘛!比如女朋友喜欢草莓蛋糕,你买了蓝莓的,她的反馈是negative,你下次就别买了蓝莓,改草莓了。
------------------------------------------------------------------------------------------------
看完这个,有些小伙可能要开始对自己女友调参了。有点不放心,所以补充一下。
撩妹和深度学习一样,既要防止欠拟合,也要防止过拟合。所谓欠拟合,对深度学习而言,就是训练得不够,数据不足,就好比,你撩妹经验不足,需要多学着点,送花当然是最基本的了,还需要提高其他方面,比如,提高自身说话的幽默感等,因为本文重点并不是撩妹,所以就不展开讲了。这里需要提一点,欠拟合固然不好,但过拟合就更不合适了。过拟合跟欠拟合相反,一方面,如果过拟合,她会觉得你有陈冠希老师的潜质,更重要的是,每个人情况不一样,就像深度学习一样,训练集效果很好,但测试集不行!就撩妹而言,她会觉得你受前任(训练集)影响很大,这是大忌!如果给她这个映象,你以后有的烦了,切记切记!
------------------------------------------------------------------------------------------------&/p&&p&深度学习也是一个不断磨合的过程,刚开始定义一个标准参数(这些是经验值。就好比情人节和生日必须送花一样),然后不断地修正,得出图1每个节点间的权重。为什么要这样磨合?试想一下,我们假设深度学习是一个小孩,我们怎么教他看图识字?肯定得先把图片给他看,并且告诉他正确的答案,需要很多图片,不断地教他,训练他,这个训练的过程,其实就类似于求解神经网络权重的过程。以后测试的时候,你只要给他图片,他就知道图里面有什么了。&/p&&p&所以训练集,其实就是给小孩看的,带有正确答案的图片,对于深度学习而言,训练集就是用来求解神经网络的权重的,最后形成模型;而测试集,就是用来验证模型的准确度的。&/p&&p&对于已经训练好的模型,如下图所示,权重(w1,w2...)都已知。&/p&&img src=&/v2-9e08dbbab5aa63b6527bd4_b.png& data-rawwidth=&940& data-rawheight=&736& class=&origin_image zh-lightbox-thumb& width=&940& data-original=&/v2-9e08dbbab5aa63b6527bd4_r.png&&&p&
图4&/p&&img src=&/v2-ef5ad0d06a316f762ff43_b.png& data-rawwidth=&776& data-rawheight=&174& class=&origin_image zh-lightbox-thumb& width=&776& data-original=&/v2-ef5ad0d06a316f762ff43_r.png&&&p&
图5&/p&&p&我们知道,像上面这样,从左至右容易算出来。但反过来呢,我们上面讲到,测试集有图片,也有预期的正确答案,要反过来求w1,w2......,怎么办?&/p&&p&绕了半天,终于该求偏导出场了。目前的情况是:&/p&&p&1.我们假定一个神经网络已经定义好,比如有多少层,都什么类型,每层有多少个节点,激活函数(后面讲)用什么等。这个没办法,刚开始得有一个初始设置(大部分框架都需要define-and-run,也有部分是define-by-run)。你喜欢一个美女,她也不是刚从娘胎里出来的,也是带有各种默认设置的。至于怎么调教,那就得求偏导。&/p&&p&2.我们已知正确答案,比如图2和3里的r,训练的时候,是从左至右计算,得出的结果为y,r与y一般来说是不一样的。那么他们之间的差距,就是图2和3里的E。这个差距怎么算?当然,直接相减是一个办法,尤其是对于只有一个输出的情况,比如图2; 但很多时候,其实像图3里的那样,那么这个差距,一般可以这样算,当然,还可以有其他的评估办法,只是函数不同而已,作用是类似的:&/p&&img src=&/v2-e5ddd26d65aa04ed82f2a51fc8212427_b.png& data-rawwidth=&484& data-rawheight=&102& class=&origin_image zh-lightbox-thumb& width=&484& data-original=&/v2-e5ddd26d65aa04ed82f2a51fc8212427_r.png&&&p&不得不说,理想跟现实还是有差距的,我们当然是希望差距越小越好,怎么才能让差距越来越小呢?得调整参数呗,因为输入(图像)确定的情况下,只有调整参数才能改变输出的值。怎么调整,怎么磨合?刚才我们讲到,每个参数都有一个默认值,我们就对每个参数加上一定的数值?,然后看看结果如何?如果参数调大,差距也变大,你懂的,那就得减小?,因为我们的目标是要让差距变小;反之亦然。所以为了把参数调整到最佳,我们需要了解误差对每个参数的变化率,这不就是求误差对于该参数的偏导数嘛。&/p&&p&关键是怎么求偏导。图2和图3分别给了推导的方法,其实很简单,从右至左挨个求偏导就可以。相邻层的求偏导其实很简单,因为是线性的,所以偏导数其实就是参数本身嘛,就跟求解x?的偏导类似。然后把各个偏导相乘就可以了。&/p&&p&这里有两个点:&/p&&p&这里有两个点:一个是激活函数,这主要是为了让整个网络具有非线性特征,因为我们前面也提到了,很多情况下,线性函数没办法对输入进行适当的分类(很多情况下识别主要是做分类),那么就要让网络学出来一个非线性函数,这里就需要激活函数,因为它本身就是非线性的,所以让整个网络也具有非线性特征。另外,激活函数也让每个节点的输出值在一个可控的范围内,这样计算也方便。&/p&&p&貌似这样解释还是很不通俗,其实还可以用撩妹来打比方;女生都不喜欢白开水一样的日子,因为这是线性的,生活中当然需要一些浪漫情怀了,这个激活函数嘛,我感觉类似于生活中的小浪漫,小惊喜,是不是?相处的每个阶段,需要时不时激活一下,制造点小浪漫,小惊喜,比如;一般女生见了可爱的小杯子,瓷器之类都迈不开步子,那就在她生日的时候送一个特别样式,要让她感动得想哭。前面讲到男人要幽默,这是为了让她笑;适当的时候还要让她激动得哭。一哭一笑,多整几个回合,她就离不开你了。因为你的非线性特征太强了。&/p&&p&当然,过犹不及,小惊喜也不是越多越好,但完全没有就成白开水了。就好比每个layer都可以加激活函数,当然,不见得每层都要加激活函数,但完全没有,那是不行的。&/p&&p&由于激活函数的存在,所以在求偏导的时候,也要把它算进去,激活函数,一般用sigmoid,也可以用Relu等。激活函数的求导其实也非常简单:&/p&&img src=&/v2-aaedc22cee9ed_b.jpg& data-rawwidth=&257& data-rawheight=&159& class=&content_image& width=&257&&&p&求导: f'(x)=f(x)*[1-f(x)]
这个方面,有时间可以翻看一下高数,没时间,直接记住就行了。
至于Relu,那就更简单了,就是f(x) 当x&0的时候y等于0,其他时候,y等于x。
当然,你也可以定义你自己的Relu函数,比如x大于等于0的时候,y等于0.01x,也可以。&/p&&p&另一个是学习系数,为什么叫学习系数?刚才我们上面讲到?增量,到底每次增加多少合适?是不是等同于偏导数(变化率)?经验告诉我们,需要乘以一个百分比,这个就是学习系数,而且,随着训练的深入,这个系数是可以变的。&/p&&p&当然,还有一些很重要的基本知识,比如SGD(随机梯度下降),mini batch 和 epoch(用于训练集的选择),限于篇幅,以后再侃吧。其实参考李宏毅的那篇文章就可以了。&/p&&p&这篇拙文,算是对我另一个回答的补充吧:
&a href=&/question//answer/?from=profile_answer_card& class=&internal&&深度学习入门必看的书和论文?有哪些必备的技能需学习? - jacky yang 的回答&/a&&/p&&p&其实上面描述的,主要是关于怎么调整参数,属于初级阶段。上面其实也提到,在调参之前,都有默认的网络模型和参数,如何定义最初始的模型和参数?就需要进一步深入了解。
不过对于一般做工程而言,只需要在默认的网络上调参就可以了,相当于用算法;
对于学者和科学家而言,他们会发明算法,难度还是不小的。向他们致敬!&/p&&p&写得很辛苦,觉得好就给我点个赞吧:)&/p&&p&------------------------------------------------------------------------------------------------&/p&&p&关于求偏导的推导过程,我尽快抽时间,把数学公式用通俗易懂的语言详细描述一下,前一段时间比较忙,抱歉:)&/p&&p&------------------------------------------------------------------------------------------------&/p&
关于深度学习,网上的资料很多,不过貌似大部分都不太适合初学者。
这里有几个原因:
1.深度学习确实需要一定的数学基础。如果不用深入浅出地方法讲,有些读者就会有畏难的情绪,因而容易过早地放弃。
2.中国人或美国人写的书籍或文章,普遍比较难一些。我…
&img src=&/v2-24defb50af3116206bfc993a61617b52_b.jpg& data-rawwidth=&800& data-rawheight=&600& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/v2-24defb50af3116206bfc993a61617b52_r.jpg&&&h2&&strong&取证工具&/strong&&/h2&&ul&&li&&a href=&/?target=https%3A///yvesalexandre/bandicoot& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&bandicoot&i class=&icon-external&&&/i&&/a& - 一个Python工具箱,用于分析手机元数据。它提供了一个完整,易于使用的环境,数据科学家分析手机元数据。只需几行代码,加载数据集,可视化数据,执行分析和导出结果。&/li&&li&&a href=&/?target=https%3A///CyberHatcoil/ACF& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android Connections Forensics&i class=&icon-external&&&/i&&/a&- 使法庭调查员能够连接到其原始进程&/li&&li&&a href=&/?target=https%3A///viaforensics/android-forensics& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android Forensics&i class=&icon-external&&&/i&&/a&- 开源Android Forensics应用程序和框架&/li&&li&&a href=&/?target=https%3A///mspreitz/ADEL& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android Data Extractor Lite&i class=&icon-external&&&/i&&/a&&/li&&li&&a href=&/?target=http%3A//www.bitpim.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&BitPim&i class=&icon-external&&&/i&&/a& - 一个程序,允许您查看和操纵数据在LG,三星,三洋和其他制造商的许多CDMA手机。&/li&&li&&a href=&/?target=https%3A///Nightbringer21/fridump& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&fridump&i class=&icon-external&&&/i&&/a&- 一个开源内存转储工具,主要针对渗透测试人员和开发人员。&/li&&li&&a href=&/?target=https%3A///504ensicsLabs/LiME& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&LiME&i class=&icon-external&&&/i&&/a&- (以前称为DMD)是一个可加载内核模块(LKM),它允许从Linux和基于Linux的设备(如Android提供的设备)中获取易失性内存。&/li&&li&&a href=&/?target=http%3A//www.osaf-community.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Open Source Android Forensics&i class=&icon-external&&&/i&&/a&&/li&&li&&a href=&/?target=https%3A///ProjectRetroScope/RetroScope& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Project RetroScope&i class=&icon-external&&&/i&&/a&&/li&&li&&a href=&/?target=https%3A///kosborn/p2p-adb/& class=& wrap external& target=&_

我要回帖

更多关于 4399手游通初始化 的文章

 

随机推荐