1.运行过程html
WishList(Domain)-->WishListMapper(DAO)-->WishListService(Service)-->WishListController(Controller)
以上是从原型定义到mybatis的Mapper文件定义,再到提供服务,而后提供接口和结果的过程。前端
2.@Param参数java
在定义mybatis的mapper文件或者定义基于注解的sql语句时候,使用@Param注解,以下:mysql
@Select("SELECT id, user_id, item_id, add_price, add_time, created, updated FROM" +"user_collection_info WHERE user_id= #{userId} AND item_id= #{itemId, jdbcType=BIGINT}") List<WishList> getWishListItemByItemId(@Param("userId") long userId, @Param("itemId") long itemId);
@Param后的字段和#{}之中的内容对应,select选择的是数据库之中的字段,后面的#{itemId}能够自由命名,只要在@Param之中对应起来就行。linux
3.IDEA的几个缩写git
psvm=补全main函数
fori =for循环
sout =System.out.println();
程序员
4.接口,参数,请求等之间的关系web
接口的请求:接口分为通常接口和分布式接口(如Dubbo接口),通常的随便调用,Dubbo接口主要是为了在分布式环境下提供服务,能够在不一样的机器之间调用(RPC);返回的数据格式:调用了接口以后,返回的数据通常是json格式的,可是其中的具体内容,还须要和前端商讨,返回的数据究竟是什么格式;参数的传递:在Http的Get请求下,所须要的数据能够经过URL上经过http://localhost:8080/wishlist/getMarkList?userId=2&pageSize=10&pageStart=0
?参数1=值1&参数2=值2&...
这种方式为参数赋值,咱们能够经过url给controller中调用的方法的参数赋值,此时controller方法参数的名字和url之中的参数的名字要相同,不然取不到值。而对于Http的Post请求,咱们是无法看到对应的页面的,传递参数的方式是同样的,须要借助工具实现,如postman来发送post请求。一个“悖论”是,咱们须要的参数经过url传递,可是应该也有其余方式传递,好比我提交了注册按钮,而后,通常而言不会跳转到一个新的页面,应该是直接取到后台返回的结果,而后在本页刷新便可,也就是说,url在取得参数数据以后(这种状况是Post请求的状况,而Get请求是相对应起来的),这种状况是针对于Post请求的,能够把Post请求理解为在后端进行,不须要对应的页面便可。字段的对应关系:还有在contorller, service, mapper, url和数据库之中字段的对应关系,mappr和数据库对应,url和controller对应,其余地方没有明确的要求,定义统一和方便本身查找便可,对于时间的处理,通常不写在函数的参数请求之中,而直接在SQL中操做。ajax
5.微服务redis
不能我去查找别人的,我没有权限的数据库字段,不是个人模块,对我而言,我是看不到的,我须要的数据我没法直接获取的时候,我须要调用别人提供给个人接口,通常而言,我只须要在这些数据之中找到我要的部分,而后将其组装,就能够了。简言之:不是个人,我没法直接操做底层(数据库),只能经过调用别人的提供的接口,来获取我须要的内容。
6.几个常见的术语
关键词 | 名称 | 术语 |
---|---|---|
api接口 | Service接口 | service |
Model 接口 | model | |
实现类 | Mapper 接口 | dao |
Model POJO类 | domain/model | |
Service/Serviceimpl Service实现类 | service | |
Controller 调用类 | controller |
7.异常处理和日志
异常处理通常在service层处理,须要处理的时候处理,返回相应的result(通常是Json格式),日志的话通常是使用logback,常量常数的话通常不是直接使用1,0这种表示,而是将其定义为常量,这样更有含义,明确。
8.数据来源
我本身管理的数据库表,只有一部分我须要的数据,可是其余的部分在别人的数据库表之中,我怎么拿到所有我想要的数据呢?通常的思路是这样的:在分布式的系统和微服务的架构下,我没法直接操道别人的数据库,没法直接经过操道别人数据库的方式来得到数据,因此只能经过别人提供的服务接口来得到数据,而后经过和我本身的一部分数据,经过必定的条件查询,拼装组合出我想要的数据。通常而言,在mybatis之中,须要定义好一个组装成的数据的Model,而后直接将数据填充到Model的对象之中去。
9.IDEA调试快捷键
键 | 模式 | 做用 |
---|---|---|
F7 | Debug | 进入断点方法之中 |
F8 | Debug | 不进入断点,越过断点直接给出结果 |
F9 | Debug | 恢复程序运行 |
Alt + F8 | Debug | 弹出可输入表达式的计算框 |
Ctrl + F8 | Debug / Common | 设置/清除断点 |
Shift + F7 | Debug | 智能步入,会让你选择一个进入的方法 |
Shift + F8 | Debug | 跳出,恢复程序运行,=F9 |
Ctrl + Shift + F8 | Debug | 设置断点的进入条件 |
Alt + Shift + F7 | Debug | 进入嵌套的方法之中 |
10.IDEA的Debug使用
① 以下图 Gif 所示,查看所选对象的方法经常使用有三种方式:
Alt + F8
。Watches
。Ctrl + F1
,查看对象具体内容。② 以下图 Gif 所示,在弹出表达式输入框中 IntelliJ IDEA 也是能帮咱们智能提示。
③ 以下图 Gif 所示,当咱们须要过掉后面的全部断点的时候,咱们不须要去掉这些断点,只须要点击左下角那个小圆点,点击小圆点以后,全部断点变成灰色,而后咱们再在按快捷键 F9 便可过掉当前和后面全部的断点。
④ 以下图 Gif 所示,咱们能够给断点设置进入的条件,由于变量 temp3 不等于 200 因此该断点没有被进入直接跳过。
⑤ 如 下图Gif 演示,有时候当咱们步入方法体以后,还想回退到方法体外,断点进入 addNum 方法后,点击 Drop Frame 按钮以后,断点从新回到方法体以外。
11.mybatis 到底要不要写一对多、一对一关联?
方法1在效率上貌似有优点,但写 resultMap 和语句真是不开心
方法2对程序员比较友好,但效率不如方法一,并且 service 层会比较臃肿
12.日志的配置,以及其含义
1.Log4j的配置, 2.log4j的使用--IDEA建立maven项目
13.gitflow简单的操做
14.Spring MVC之中出现:No mapping found for HTTP request with URI
A:关于No mapping found for HTTP request with URI..., DID NOT FIND HANDLER METHOD FOR SPRINGMVC资源文件扫描不到---关于SPRING的那些坑
15.springmvc能够对前台返回json数据,也能够从前台获取JSON格式的数据, 固然,JSON格式只是最经常使用的一种格式,还有不少其余的格式,后台给前端返回json数据相对简单,而前台给后台发送JSON格式数据的时候,就须要注意,咱们要使用AJAX来帮助(jquey的ajax)便可.此时,必定要搞清楚方向的问题,是前端发送json数据到后台,因此这个发送时从前端发给后台,就是从前端浏览器之中发起请求,在web服务器如tomcat运行的时候,后台会接收到这个请求,得到参数,而后才去相应的措施.
1.springmvc 接收json对象的两种方式, 2.Java运用JSON实现后台与前端分工合做(代码实例), 3. SpringMVC——对Ajax的处理(包含 JSON 类型), 4.SpringMVC @RequestBody 处理ajax请求, 5. ajax请求,fastjson报出错误:syntax error, expect {, actual error, pos 0, 6.springmvc与fastjson的整合,注解@RequestBody的使用
16.表单form简介
基本语法
<FORM ACTION="URL" METHOD="GET|POST" ENCTYPE="MIME" TARGET="..."> ... ... </FORM>
基本功能
表单在网页中主要负责的是数据采集功能,一个表单基本由三部分组成
两个参数
17.前端和后端的感悟
A:form之中的action,对应的不是一个获取到的地址, 而是将数据传送, 而后让其处理问题的地址, 即push! form之中的表单信息提交给Spring MVC之中RequestMapping之中的url进行处理,是的! 可是,为何此处没有得到那边传过来的数据呢??? 其实,意思就是,应该是后端的数据绑定到了前端, 仍是说前端的数据传递到了后端?---> 我想,确定是前端的数据,传到了后端,而传值得方式,是经过前端和后端都有,可是在后端定义的数据模型,id,来完成的. 就是说,在后端定义了一个模型, key在后端定义好了, 可是value须要前端传过来, 给后端, 通过后端处理, 而后显示出来.
18.关于form标签的path和commandName
form标签之中的path,commandName(modelAttribute)的来源,path就是我须要的一个值的对应的Domain(Model,POJO)类之中的相应的字段,commandName(modelAttribute)就是在Controller之中定义的Model(ModelMap, ModelAndView)对应的Model的key。此处须要理清楚数据绑定的对象,数据绑定的方向。
19.Spring MVC先后端数据交互
A:1.Spring MVC先后端数据交互总结, 2.Spring MVC 后端获取前端提交的json格式字符串并直接转换成control方法对应的参数对象, 3.Spring MVC 传值方式总结, 4.SpringMVC前端传值到Controller与Controller中传值到View解析, 5.Spring 向页面传值以及接受页面传过来的参数的方式
20.JSP页面使用a href来跳转到另外一个jsp页面
A:Spring MVC貌似不支持从一个jsp页面经过<a href="sss.jsp">的方式跳转,都要经过controller的方式访问页面
21.视图配置的时候,能够设置多个文件夹吗?能够配置多种视图后缀吗?
A: ViewResolver能够设置多个,不一样的ViewResolver类型,须要设置不一样的ViewResolver,好比jspViewResolver,htmlViewResolver等。至于某一种视图的多个文件夹,能够在/WEB-INF/views/之中设置,能够设置到不一样级别的文件夹之中,可是这样不灵活,通常都是返回的时候,返回其父级别的文件夹名,好比以前的为/WEB-INF/views/,返回的时候使用的是return "login",好比修改成/WEB-INF/views/user以后,那就须要使用user/login来返回,写全就是:return "user/login",若是要访问其余的,新的网页,则可使用“user/XXX”,那么就是同一视图的多个文件夹的访问方式,而不一样的ViewResolver,通常时将其页面放在不一样的页面之下。1. springmvc如何设置多视图器,springmvc 多个 ViewResolver, 2.SpringMVC同时支持多视图(JSP,Velocity,Freemarker等)的一种思路实现
22.Spring MVC之中form标签,jstl标签,sf标签,el表达式,各自使用在什么地方而且有什么区别?
A:JSTL的全名为:Java Server Pages Standard Tag Library。JSP标准标签库,由四个定制标记库(core、format、xml 和sql)和一对通用标记库验证器(ScriptFreeTLV 和 PermittedTaglibsTLV)组成。它实现了迭代和条件判断、数据管理格式化、XML操做以及数据库访问的功能。有了jstl标签库和el表达式,咱们的 jsp中不须要<%%>的java代码,提升了程序的可读性和可维护性。
EL(Expression Language)表达式:目的是为了使JSP写起来更加简单。语法结构:${expression}; 对象:pageScope、requestScope、sessionScope、applicationScope(访问顺序:page—request—session——application)
form标签是SpringMVC的核心标签,以下的表达式中,tablib是咱们给此标签库设置的名字,能够为任意不重复的名字,固然决定此标签库的仍是URI,URI惟一决定此标签库,因此以下的标签库能够叫sf,也能够叫form
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
除了Spring标签,JSTL标签,还有Strutsde 标签等等。而EL表达式只是为了方便使用而存在的
区别尚未写
23.Spring MVC的模板技术有哪些?
A:模板技术有JSP, Velocity, freemarker和Thymeleaf模板,JSP开发对于MVC是破坏的,然后面三种是MVC模式的,不会在视图之中直接写java代码,而jsp会写java代码,而后编译成servlet,占用JVM的堆大小,会有GC的产生。Velocity, freemarker和Thymeleaf支持MVC开发模式,先后端分离,之间的差异不是很是大,Spring官方推荐的是Thymeleaf模板。浅谈jsp、freemarker、velocity区别
24.Spring MVC后端传给前端值,怎么传,有哪些方法?
A:
25.Spring MVC前端传给后端值,怎么传,有哪些方法?
A:
26.spring的jsp类库有哪些?<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>的含义和说明
A:taglib之中的prefix是一个必要的参数,这个是本身定义的,能够是任何和已有的标签缩写不重复的标签前缀,可是重点在于后面的URI,这是惟必定位一个标签库的方式。 Spring的标签,有form部分和其余部分,这个form是为了数据绑定而设置的,Spring的标签,主要是使用form,其余的标签在tags下面,用的不是不少。
27.spring的jsp类库有哪些?
A:Spring提供了两个JSP标签库,用来帮助定义SpringMVC Web的视图。其中一个标签库会用来渲染HTML表单标签,是from标签,这些标签能够绑定model中的某个属性。另一个标签库包含了一些工具类标签,咱们随时均可以很是便利地使用它们。在这两个标签库汇中,表单绑定的标签库更加有用。咱们更多使用的是表单标签,表单标签所在的位置为:
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
,而工具类标签为
<%@taglib uri="http://www.springframework.org/tags" prefix="sf"%>
。1.SpringMVC入门之七:使用JSP做为视图, 2.Spring MVC 页面渲染( render view ), 3.SpringMVC入门之五:渲染Web视图概述。
28: spring form之中的标签,能够卸载spring:form以外吗?也就是说,能在form以外单独应用吗?
A: 是不能的,spring jsp的表单form标签之中的子元素,如<form:input>
,<form:checkouboxs>
等,都是须要在form标签之下才能起做用的,因此spring jsp的表单form标签之中的子元素必需要包含在form打的标签之中,在标签以外就会报错。
29.Spring MVC的默认视图解析器是什么?
A:当视图为jsp的时候,默认的视图解析器为InternalResourceViewResolver,默认的viewClass为JstlView,通常的配置为:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" > <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView /> </bean>
30.为何经过mybatis执行sql语句,一开始能够成功,可是后续执行返回结果为0?
A:这主要是由于数据过小,而查询的时候没法直接显示出来数据的缘由,好比,删除的时候使用id和item_id,在一开始的时候都是1,2,3这种数据,可是购物车id主键和商品的id的增加是不一样步的,因此就会产生数据不一样步的缘由,此时的表现是,sql语句能够执行,可是返回受影响的行数结果为0。这类问题大可能是因为粗枝大叶,把字段搞错了!解决这些问题的方法以下:
31.IDEA忽然标红,怎么处理?
A:通常是因为缓存致使的,表现为各个类都没法识别,可是仍然能够运行,此时只须要清理缓存便可。
32.mybatis之中动态SQL的做用?
A:当咱们使用mybatis对一张表进行的CRUD操做,若是业务简单,那么SQL语句都比较简单,若是有比较复杂的业务,咱们须要写复杂的SQL语句,每每须要拼接,而拼接 SQL,稍微不注意,因为引号,空格等缺失可能都会致使错误。
那么怎么去解决这个问题呢?就须要使用mybatis的动态SQL,经过if, choose, when, otherwise, trim, where, set, foreach等标签,可组合成很是灵活的SQL语句,从而在提升 SQL 语句的准确性的同时,也大大提升了开发人员的效率。
33.@Results,@Result的做用是什么?
A:@Results, 对应<resultMap>表示的是结果映射的列表,包含了一个特别结果列如何被映射到属性或字段的详情。属性为value,@Result是@Results注解的结果数组之中的一条结果,@Results注解产生一个对应的结果数组。
34.嵌入在mybatis动态SQL语句之中的<script>,<CDATA>等标签的做用?
A:用script标签包围,而后像xml语法同样书写,很明显,在java中写xml可读性和维护性太差,尤为当SQL很长时,这样写是很痛苦的。 <script>,<CDATA>这些标签是xml之中的标签,咱们通常写sql的时候不用这么写,须要注意标点,链接符等便可。写简单的SQL,结果拼接,而不是拼接SQL。
@Select("<script>" + "SELECT id,sn,user_id,wechat_id,alipay_id,item_id,item_value,mobile," + "oilcard_num,oilcard_name,recharge_value,bean_award_value,payment_value,status," + "payment_time,order_time,created,updated " + " FROM oilcard_recharge_record "+ "<where>" + "<if test=\"status !=null \"> and status = #{status}</if>" + "<if test=\"createdStart !=null \"> and created <![CDATA[ > ]]> #{createdStart}</if>" + "<if test=\"createdEnd !=null \"> and created <![CDATA[ < ]]> #{createdEnd}</if>" + "</where>" + "order by order_time desc " + "</script>") List<OilCardRechargeRecord> listByStatus(@Param("status") Integer status, @Param("createdStart") Long createdStart, @Param("createdEnd") Long createdEnd);
sql中有一些特殊的字符的话,在解析xml文件的时候会被转义,<CDATA>能避免被转义mybatis 详解(五)------动态SQL,XML CDATA,"![CDATA[","<script>"这些字符在动态sql的语句之中的做用是:防止sql里面出现诸如"<"、"&"这种XML非法字符的状况 ,MyBatis动态SQL实现ORDER BY和LIMIT的控制?。
注意:
有时候,只使用单纯的sql语句,在使用动态语句的时候,就会出现没法正确解析SQL的状况,好比说,使用<if>语句的时候,在"<if test=\"topic.status != null\" >status = #{topic.status},</if>"
这种状况的时候就会出现问题,因此最外层须要使用<script>
包起来。另外status = #{topic.status}
这句,不能将#和{}分开,好比status = # {topic.status},这种就会出现错误。当if的条件只有一句的时候,后面不能加","。好比有
sql lite // 只有一个参数的时候,不能加逗号","---><if test=\"status !=null\"> status = #{status},</if> @Select("<script>" + "SELECT " + "id, topic_name, topic_introduce " + "FROM article_topic" + "<where>" + "<if test=\"status !=null\"> status = #{status}</if>" + "</where>" + "</script>") List<ArticleTopic> getTopicNumber(@Param("status") int status);
在插入语句之中,也可使用动态条件,以下:
sql lite // 须要添加<script>,不然没法正确解析<if...>的内容,在insert的时候也可使用<if...> @Insert("<script>" + "INSERT INTO " + "article_topic (id, topic_name, topic_introduce, sort," + "<if test=\"topicImg !=null \"> topic_img,</if> " + "<if test=\"topicThumbnail !=null \"> topic_thumbnail,</if> " + "status, created, updated)" + "VALUES" + "(#{id}, #{topicName}, #{topicIntroduce}, #{sort}, " + "<if test=\"topicImg !=null \"> #{topicImg},</if> " + "<if test=\"topicThumbnail !=null \"> #{topicThumbnail},</if> " + "#{status}, #{created}, #{updated})" + "</script>") @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id") long addTopic(ArticleTopic topic);
通常状况下,更新,插入的时候,须要使用到对象,在此时,咱们的字段就须要带对象的名称,可是在占位符之中,不须要设置对象名,以下:
@Update("<script>" + "UPDATE article_topic" + "<set>" + "<if test=\"topic.status !=null\"> status = #{topic.status},</if>" + "<if test=\"topic.updated !=null\"> updated = #{topic.updated},</if>" + "</set>" + "<where>" + "id = #{id}" + "</where>" + "</script>") long stickyTopic(@Param("topic") ArticleTopic topic, @Param("id") long id);
35.注解,providersql,mapper.xml等方式的异同?
A:注解,providersql,mapper.xml三种方式都是要产生对应的查询结果,注解方式更加集中,把DAO方法,SQL语句,集中在了一个Java接口之中,方便,可是每次有改动,必需要完整的改动这个接口文件。
providersql和mapper.xml方式比较类似,providersql方式,将sql语句与DAO方法的接口文件分离,使用反射,提供了sql语句的调用,DAO方法和SQL语句是分离的。
mapper.xml方式一样是分离的,可是在mapper.xml之中,咱们能够定义各类resultMap,能够重复利用,利用效率比较高,可是写起来比较麻烦。
36:动态sql标签
A:MyBatis的动态SQL是基于OGNL表达式的,它能够帮助咱们方便的在SQL语句中实现某些逻辑。MyBatis中用于实现动态SQL的元素主要有:if, where, set, choose(when,otherwise), trim, foreach. 咱们在通常是在可能产生不肯定条件的地方使用动态SQL的标签,如在where, update的set之中使用动态标签。
if是一个基本的标签,
<if test="条件"> id=#{id} </if>
也能够if+where组合,
<where> <if test="条件1"> id=#{id} </if> <if test="条件2"> name=#{name}</if> </where>
update的<set> 标签,
<set> <if test="条件1"> id=#{id} </if> <if test="条件2"> name=#{name}</if> </set>
有时候,咱们不想用到全部的查询条件,只想选择其中的一个,查询条件有一个知足便可,使用 <choose> 标签能够解决此类问题,相似于Java的switch语句
<where> <choose> <when test="条件1"> id=#{id} </when> <when test="条件2"> name=#{name} </when> <otherwise> and age=#{sex} </otherwise> </choose> </where>
trim标记是一个格式化的标记,能够完成set或者是where标记的功能,在sql其中,添加了一些如分隔符,前缀后缀等的信息。能够对应更多的状况,而foreach更多的是sql之中的in状况,例如id in(id的一个查询获得的结果集合)
<select id="selectUserByListId" parameterType="com.ys.vo.UserVo" resultType="com.ys.po.User"> select * from user <where> <!-- collection:指定输入对象中的集合属性 item:每次遍历生成的对象 open:开始遍历时的拼接字符串 close:结束时拼接的字符串 separator:遍历对象之间须要拼接的字符串 select * from user where 1=1 and (id=1 or id=2 or id=3) --> <foreach collection="ids" item="id" open="and (" close=")" separator="or"> id=#{id} </foreach> </where> </select>
37:Mybatis的Insert Update和Select Delete语句的注意点
A:当咱们使用SQL进行insert和update的时候,在Mybatis之中,使用的是对象,而非一个一个的单独的参数,在Mapper之中,对应的参数为id和对应的对象,而delete和select的时候大多数使用的是id或者其余合适的条件。Mybatis纯注解方式
@Insert("<script>" + "INSERT INTO " + "article_topic (id, topic_name, topic_introduce, sort," + "<if test=\"topicImg !=null \"> topic_img,</if> " + "<if test=\"topicThumbnail !=null \"> topic_thumbnail,</if> " + "status, created, updated)" + "VALUES" + "(#{id}, #{topicName}, #{topicIntroduce}, #{sort}, " + "<if test=\"topicImg !=null \"> #{topicImg},</if> " + "<if test=\"topicThumbnail !=null \"> #{topicThumbnail},</if> " + "#{status}, #{created}, #{updated})" + "</script>") @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id") long addTopic(ArticleTopic topic);
上面是Insert语句的状况,在addTopic方法之中,参数是ArticleTopic的对象topic,Update的状况和Insert相同,另外当咱们使用SqlProvider的时候,Insert和Update的参数都写在对应的Values和Set的String参数之中,参数和占位符相对应。以下的示例,分别对应为Mapper文件和SqlProvider文件
@InsertProvider(type = ArticleCommentReviewSqlProvider.class, method = "reviewComment") long reviewComment(@Param("commentReview") ArticleCommentReview commentReview, @Param("id") long id); @UpdateProvider(type = ArticleCommentReviewSqlProvider.class, method = "reviewCommentAgain") long reviewCommentAgain(@Param("commentReview") ArticleCommentReview commentReview, @Param("id") long id);
public String reviewComment(@Param("commentReview") ArticleCommentReview commentReview, @Param("id") long id) { //insert时,cloumn和对应的参数都写在sql.VALUES()之中,参数和占位符一一对应 SQL sql = new SQL(); sql.INSERT_INTO("article_comment_review"); sql.VALUES( "comment_id, article_id, reviewer_id, review_detail, review_time," + " review_result, created, updated", "#{commentId}, #{articleId}, #{reviewerId}, #{reviewDetail},#{reviewTime}, " + "#{reviewResult}, #{created}, #{updated}"); return sql.toString(); } public String reviewCommentAgain(@Param("commentReview") ArticleCommentReview commentReview, @Param("id") long id) { //update时,column和对应的参数都写在sql.SET之中,参数和占位符一一对应 SQL sql = new SQL(); sql.UPDATE("article_comment_review"); sql.SET("review_detail, review_result", "#{reviewDetail}, #{reviewResult}"); sql.WHERE("id= #{id}"); return sql.toString(); }
以上这是在Mapper(DAO层)之中的定义,而在Service层和Controller层,咱们仍是须要整个完整的参数。
38:SQL分页的问题
A:SQL的分页,咱们可使用limit关键字或者limit&offset两个关键字组合来完成分页的实现,可是使用这两个关键字的时候是有区别的。示例以下:
1️⃣:仅使用limit关键字,limit N:只返回符合条件的前N条
###### sql的数据计算是从0开始的,第1条的下标为0) ##### SELECT * FROM article_topic LIMIT 10; # 符合条件的前10条 SELECT * FROM article_topic WHERE id<100 LIMIT 10; # 符合条件的前10条,这句和上面一句的含义相同
2️⃣:使用limit关键字,limit M , N:跳过M条,返回N条,从第M条开始读取
SELECT * FROM article_topic LIMIT 2,1; # 跳过2条取出1条数据,LIMIT后面是从第2条开始读,读取1条信息,即读取第2条数据,也就是第三条 SELECT * FROM article_topic LIMIT 8,5; # 跳过8条,取出5条,从第8条开始读取 SELECT * FROM article_topic WHERE id<100 LIMIT 8,5;
3️⃣:使用limit&offset关键字,limit M offset N:跳过N条,返回M条,从第N条开始计算
SELECT * FROM article_topic LIMIT 2 OFFSET 1; # 返回2条数据,从第1条开始计算,LIMIT后面跟的是2条数据,OFFSET后面是从第1条开始读取,即读取第2,3条 SELECT * FROM article_topic LIMIT 10 OFFSET 5; # 返回10条数据,从第5条开始计算
其中第2️⃣种和第3️⃣种之间的关系是相反的,最好统一使用第三种: limit M offset N, 返回M条(跳过N条),从第N条开始计算。sql 中 limit 与 limit,offset连用的区别, SQL 语句的LIMIT的用法
39:sql语句定义和查询时候的一些问题
A:1️⃣:全部的字段最好不要设置成NULL,能够设置为NOT NULL,为其设置一个默认值,经过DEFAULT xxx
2️⃣:将字段定义为BIGINT,INT等数字的时候,若是其大于0,那么能够加一个UNSIGNED来修饰,这样就不会有小于0的状况,表示无符号,只有咱们认为的大于0的状况存在,没有负数的存在了
3️⃣:给字段和表添加注释是一个好习惯COMMENT '建立时间',
4️⃣:在建立数据库的语句以前,最好加上DROP TABLE IF EXISTS xxx表;
5️⃣:在建立SQL的语句之中,所使用的引号都是单引号---'',而不是双引号
6️⃣:为了区别SQL语句和咱们建立或者查询的字段,能够把SQL保留字,所有大写,自定义的代表,数据等小写
一个建立表的例子
# article_info DROP TABLE IF EXISTS article_info; CREATE TABLE article_info ( id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', topic_id BIGINT(20) UNSIGNED NOT NULL COMMENT '专题id', user_id BIGINT(20) UNSIGNED NOT NULL COMMENT '编辑人id', title VARCHAR(64) NOT NULL COMMENT '标题', introduce_detail VARCHAR(64) NOT NULL DEFAULT '' COMMENT '推荐词', author VARCHAR(64) NOT NULL COMMENT '做者', content TEXT NOT NULL COMMENT '文章内容', main_img VARCHAR(300) NOT NULL DEFAULT '' COMMENT '主图 url', thumbnail_img VARCHAR(300) NOT NULL DEFAULT '' COMMENT '缩略图url', status TINYINT(4) NOT NULL DEFAULT 0 COMMENT '状态(待审核,经过,不经过,发表,下架)', release_time BIGINT(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '发表时间', off_time BIGINT(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '下架时间', sort int UNSIGNED NOT NULL DEFAULT 0 COMMENT '排序', created BIGINT(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '建立时间', updated BIGINT(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间', PRIMARY KEY (id), INDEX idx_article_info_topic_id (topic_id), INDEX idx_article_info_user_id (user_id) )DEFAULT CHARSET = utf8 COMMENT = '文章表'; # article_collect DROP TABLE IF EXISTS article_collect; CREATE TABLE article_collect ( id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ' 主键', user_id BIGINT(20) UNSIGNED NOT NULL COMMENT '用户id', article_id BIGINT(20) UNSIGNED NOT NULL COMMENT '文章id', created BIGINT(20) UNSIGNED NOT NULL DEFAULT 0 COMMENT '建立时间', updated BIGINT(20) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间', PRIMARY KEY (id), INDEX idx_article_collect_user_id(user_id), INDEX idx_article_collect_article_id(article_id), UNIQUE idx_union_unique(user_id,article_id) )DEFAULT CHARSET = utf8 COMMENT = '文章收藏表'; # article_thumb DROP TABLE IF EXISTS article_thumb; CREATE TABLE article_thumb( id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', user_id BIGINT(20) UNSIGNED NOT NULL COMMENT '用户id', article_id BIGINT(20) UNSIGNED NOT NULL COMMENT '文章id', created BIGINT(11) UNSIGNED DEFAULT 0 COMMENT '建立时间', updated BIGINT(11) UNSIGNED DEFAULT 0 COMMENT '更新时间', PRIMARY KEY (id), INDEX idx_article_thumb_user_id(user_id), INDEX idx_article_thumb_article_id(article_id) ) DEFAULT CHARSET =utf8 COMMENT = '文章点赞表'; # article_area DROP TABLE IF EXISTS article_area; CREATE TABLE article_area ( id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', area_id BIGINT(20) UNSIGNED NOT NULL COMMENT '地区id', article_id BIGINT(20) UNSIGNED NOT NULL COMMENT '文章id', created BIGINT(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '建立时间', updated BIGINT(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间', PRIMARY KEY (id), INDEX idx_article_area_article_id(article_id), INDEX idx_article_area_area_id(area_id) )DEFAULT CHARSET =utf8 COMMENT ='文章地区表'; # article_review DROP TABLE IF EXISTS article_review; CREATE TABLE article_review( id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', article_id BIGINT(20) UNSIGNED NOT NULL COMMENT '文章id', reviewer_id BIGINT(20) UNSIGNED NOT NULL COMMENT '审核人id', review_detail VARCHAR(200) NOT NULL DEFAULT '' COMMENT '审核说明', review_time BIGINT(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '审核时间', review_result TINYINT(4) UNSIGNED NOT NULL COMMENT '审核结果', created BIGINT(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '建立时间', updated BIGINT(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间', PRIMARY KEY (id), INDEX idx_article_area_article_id(article_id) )DEFAULT CHARSET =utf8 COMMENT ='文章审核表'; # article_topic DROP TABLE IF EXISTS article_topic; CREATE TABLE article_topic( id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', topic_name VARCHAR(50) NOT NULL COMMENT '专题名', topic_introduce VARCHAR(200) NOT NULL DEFAULT '' COMMENT '专题简介', sort int UNSIGNED NOT NULL DEFAULT 0 COMMENT '专题排序', topic_img VARCHAR(300) NOT NULL DEFAULT '' COMMENT '专题主图片', topic_thumbnail VARCHAR(300) NOT NULL DEFAULT '' COMMENT '专题缩略图', status TINYINT(4) NOT NULL COMMENT '专题状态', created BIGINT(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '建立时间', updated BIGINT(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间', PRIMARY KEY (id) )DEFAULT CHARSET =utf8 COMMENT ='文章主题表'; # article_comment DROP TABLE IF EXISTS article_comment; CREATE TABLE article_comment( id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', article_id BIGINT(20) UNSIGNED NOT NULL COMMENT '文章id', user_id BIGINT(20) UNSIGNED NOT NULL COMMENT '用户id', comment_content VARCHAR(140) NOT NULL COMMENT '评论内容', sort int NOT NULL DEFAULT 0 COMMENT '排序', status TINYINT(4) NOT NULL COMMENT '状态(提交,审核经过,不经过', created BIGINT(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '建立时间', updated BIGINT(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间', PRIMARY KEY (id), INDEX idx_article_comment_article_id(article_id), INDEX idx_article_comment_user_id(user_id) )DEFAULT CHARSET =utf8 COMMENT ='文章评论表'; # article_comment_thumb DROP TABLE IF EXISTS article_comment_thumb; CREATE TABLE article_comment_thumb( id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', comment_id BIGINT(20) UNSIGNED NOT NULL COMMENT '评论id', user_id BIGINT(20) UNSIGNED NOT NULL COMMENT '用户id', created BIGINT(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '建立时间', updated BIGINT(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间', PRIMARY KEY (id), INDEX idx_article_comment_thumb_user_id(user_id), INDEX idx_article_comment_thumb_comment_id(comment_id) )DEFAULT CHARSET =utf8 COMMENT ='文章评论点赞表'; # article_comment_review DROP TABLE IF EXISTS article_comment_review; CREATE TABLE article_comment_review( id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', comment_id BIGINT(20) UNSIGNED NOT NULL COMMENT '评论id', article_id BIGINT(20) UNSIGNED NOT NULL COMMENT '文章id', reviewer_id BIGINT(20) UNSIGNED NOT NULL COMMENT '审核人id', review_detail VARCHAR(200) NOT NULL DEFAULT '' COMMENT '审核说明', review_time BIGINT(11) NOT NULL DEFAULT 0 COMMENT '审核时间', review_result TINYINT(4) NOT NULL COMMENT '审核结果', created BIGINT(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '建立时间', updated BIGINT(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间', PRIMARY KEY (id), INDEX idx_article_comment_review_reviewer_id(reviewer_id) )DEFAULT CHARSET =utf8 COMMENT ='文章评论审核表';
39:MySQL字段的疑惑
A:mysql之中的bigint长度为8个字节,int为4个字节,tinyint为1个字节,不一样类型的int决定了存储的占用的字节数量,而常用的tinyint(M):M默认为4,SMALLINT(M):M默认为6,MEDIUMINT(M):M默认为9,INT(M):M默认为11,BIGINT(M):M默认为20。M表示最大显示宽度,建表若设置了zerofill(0填充),会在数字前面补充0 。
他山之石:
不是咱们有这种限制,全部的建表都要加上这个限制 这个含义和入参检查是同样的,不是能够保存多大的值就保存多大的值,要从逻辑入手,性别就1位,身份证就17位,手机号就11位。
40:MVC模式在何处进行数据校验
A:通常java web的项目分为domain, dao, service, controller等层,数据的校验和参数传递集中在controller和service两个地方,具备较大的可选性,有两种方式,1️⃣一种是在service之中获取基本数据,取得须要的基本数据,在controller层之中进行数据合法性的校验,而后在此处,将全部的数据统一处理,打包成须要的格式,传送给前端;2️⃣第二种是在service层之中将全部的数据都验证,整合,将其传送给controller层,controller只是作一个url转发的层。这两种方式在实际上都是能够的,可是因为第2️⃣种方式要讲数据多传送一次,而在service层之中整个合法性校验,数据的整合,而后又传送给controller层,这样操做比较浪费,因此第1️⃣种方式好,service层提供基本的数据,在controller层之中校验,组装数据,转发请求等。
41:Java EE须要掌握的技术
42:intellij idea 运行 tomcat,没法进入断点的问题解决方法
A:这是由于JMX port被占用而出现的问题,解决方法,1️⃣:重启机器,2️⃣:使用netstat -aon|findstr 1099
找出来1099端口占用的进程,而后经过taskkill -f -pid 3756
杀掉进程,从新运行,便可。其实和没法启动tomcat服务器的缘由是同样的。启动tomcat时jmx port被占用,intellij idea 运行 tomcat,没法进入断点的问题解决方法
43:RPC与RMI的介绍
A:RPC(Remote Procedure Call Protocol)远程过程调用协议,经过网络从远程计算机上请求调用某种服务。RMI是远程方法调用(Remote Method Invocation)。可以让在客户端Java虚拟机上的对象像调用本地对象同样调用服务端java 虚拟机中的对象上的方法。 RMI中是经过在客户端的Stub对象做为远程接口进行远程方法的调用。每一个远程方法都具备方法签名。若是一个方法在服务器上执行,可是没有相匹配的签名被添加到这个远程接口(stub)上,那么这个新方法就不能被RMI客户方所调用。 RPC中是经过网络服务协议向远程主机发送请求,请求包含了一个参数集和一个文本值,一般造成“classname.methodname(参数集)”的形式。RPC远程主机就去搜索与之相匹配的类和方法,找到后就执行方法并把结果编码,经过网络协议发回。 RMI只用于Java;RPC是网络服务协议,与操做系统和语言无关。
44:Spring配置多个数据源,如何使用?
A:Spring配置多个数据源的时候,启用他须要使用包扫描,意思就是在特定的包下面使用某一个特定的数据源,在这个包下的操做,就是用这些对应的数据源。注意:须要单独把相关的dao建立一个包,放在原先的dao下面会被覆盖,从而致使没法取到数据源的链接。另外,须要在工程的配置文件之中添加上多个数据源的链接基本信息,方可操做。
@Configuration @ConfigurationProperties(prefix = "redpacket.datasource") @MapperScan(basePackages = "com.yjf.redpacketdao", sqlSessionFactoryRef = "redpacketSession") @EnableTransactionManagement public class RedPacketDataConfiguration { //单独把相关的dao建立一个包,放在原先的dao下面会被覆盖,原先的包为com.yjf.dao private static final String DATA_SOURCE = "redpacket_ds"; @Value("${redpacket.datasource.mapUnderscoreToCamelCase}") private Boolean mapUnderscoreToCamelCase; @Bean("redpacketSession") public SqlSessionFactory getSqlSessionFactory(@Qualifier(DATA_SOURCE) DataSource ds) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(ds); org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration(); configuration.setMapUnderscoreToCamelCase(mapUnderscoreToCamelCase); bean.setConfiguration(configuration); return bean.getObject(); } @Bean(name = DATA_SOURCE) @ConfigurationProperties(prefix = "redpacket.datasource") public DataSource dataSourceRedpacket() { return DruidDataSourceBuilder.create().build(); } @Bean public DataSourceTransactionManager redPacketTransactionManager(@Qualifier(DATA_SOURCE) DataSource ds) { return new DataSourceTransactionManager(ds); } }
45:把sql的嵌套查询拆开,应该怎么作?
A:在开发之中,SQL层(Mapper层的查询),可能常常会遇到多个sql嵌套查询的状况,这样的时候,很容易出现Mapper层的耦合,处理这些耦合,就须要把复杂嵌套的sql语句拆分红单独的简单的sql,而后在service层之中处理等否,关联等关系,这样能够有效减小SQL语句的耦合,让复杂的SQL变得清晰简单。
46:写Mybatis的Mapper文件时候,sql的注意问题?
A:有时候,写Mapper文件的时候,有时候会有把sql语句都写在一块儿,在写<script>包裹起来的语句,在每一行的sql语句后面,最好后面留一个空格,防止SQL语句拼接连在一块儿,出现问题。
@Select("<script>" + "SELECT " + "id, create_date, ali_user_id, balance, identity_number, is_enabled, is_locked, mobile, name, " + "phone, wx_open_id, member_rank, sinopec_station, real_name, area, " + "FROM member " + "WHERE is_enabled = 1 and is_locked = 0 " + "</script>") List<Member> getMemberList(); @Select("<script>" + "SELECT " + "id, create_date, ali_user_id, balance, identity_number, is_enabled, is_locked, mobile, name, " + "phone, wx_open_id, member_rank, sinopec_station, real_name, area, " + "FROM member " + "WHERE id= #{id}" + "</script>") Member getUserById(@Param("id") Long id);
47:须要的数据是从多个表之中获取,该如何处理?
A:首先咱们经过查询语句,将须要的信息,提取出来,此时咱们获得了多种信息,而后接下来,咱们能够建立一个新的domain,里面的字段恰好是所需信息的所有字段,而后使用Mapper查询出来咱们要的信息后,在Service层将信息组合,整合出来咱们想要的信息,好比,Student表和Book表,student(id, name, age, gender, grade, class, school),book(id, book_name, book_price, book_author, book_detail, book_time, book_type)。若是咱们想知道学生喜欢的书籍的类型和出版时间,那么能够新建新的domain,student_book(id, name, age, gender, book_name, book_detail, book_time, book_type),将其组合成一个新的domain, 这样处理将会方便不少。
ref:
1.IDEA 图标介绍。 缓存和索引介绍、清理方法和Debug使用, 2.使用 mybatis 到底要不要写一对多、一对一关联, 3.Log4j的配置, 4.log4j的使用--IDEA建立maven项目, 5.mybatis 详解(五)------动态SQL, 6.MyBatis——动态SQL讲解, 7.MyBatis注解Annotation介绍及Demo, 8.spring boot(8)-mybatis三种动态sql, 9.mybatis @Select注解中如何拼写动态sql, 10.MySQL bigint(20)是什么意思?, 11.详解mysql int类型的长度值问题, 12.Java RMI与RPC的区别, 13.Mybatis纯注解方式, 14.sql 中 limit 与 limit,offset连用的区别, 15.SQL 语句的LIMIT的用法