通过自动回复机器人学Mybatis---基础版

 

 

第1章 案例简介

介绍要实现的案例情况,后面会通过这个案例来学习 Mybatis

 

 

 

第2章 实战第一部----黎明前的黑暗

在没有 Mybatis 的情况下,使用 Jsp + Servlet + Jdbc 实现案例中的一个模块

 

 开发流程1:

  开发流程2:

  开发流程3:

 

 

JSP页面放在web-inf下便于控制和管理。必须从后台才能访问到JSP,这样便于控制。放在外面是直接可以访问到的,除非拦截*.jsp

 

最好不要写成select *,select *数据库引擎还得用*去解析一遍,解析成列名,所以最好写“select 列名”

 

 

 

servlet一般就做这几件事

1.接收页面的值

2.向页面传值

3.业务需要,调用service。

4.向页面跳转。

 

dao层一般是跟表相关的,跟哪张表操作的就是哪个dao,例如有一张表Message,就叫MessageDao

 

第3章 实战第二部---- Mybatis 来袭

通过将上一章中 JDBC 部分替换为 Mybatis 实现来学习 Mybatis 的下载、基本配置、基本应用以及体会 Mybatis 的特征
Mybatis的官方下载地址:https://github.com/mybatis/mybatis-3/releases

 

快照版,相当于发布之前,正在开发过程当中的临时保存版本。不要下载

 

发布版,下载。

 

源码包最好一起下载。这个源码文件除了对应Mybatis里面jar包的源码以外,还有test文件,即演示版

 

 配置Mybatis

1.导入Mybatis的jar包

mybatis-3.4.6.jar

2.核心配置文件(在源代码的演示文档中找)

核心配置文件Configuration.xml拷贝到工程中

 

配置好了可以帮我们去加载驱动、连接

核心配置文件,修改为对应的数据库驱动

Configuration.xml

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 
 3 <!DOCTYPE configuration
 4     PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 5     "http://mybatis.org/dtd/mybatis-3-config.dtd">
 6 
 7 <configuration>
 8   <settings>
 9     <setting name="useGeneratedKeys" value="false"/>
10     <setting name="useColumnLabel" value="true"/>
11   </settings>
12 
13   <typeAliases>
14     <typeAlias alias="UserAlias" type="org.apache.ibatis.submitted.complex_property.User"/>
15   </typeAliases>
16 
17   <environments default="development">
18     <environment id="development">
19       <transactionManager type="JDBC">
20         <property name="" value=""/>
21       </transactionManager>
22       <dataSource type="UNPOOLED">
23         <property name="driver" value="com.mysql.jdbc.Driver"/>
24         <property name="url" value="jdbc:mysql://127.0.0.1:3306/micro_message"/>
25         <property name="username" value="root"/>
26         <property name="password" value="123456"/>
27       </dataSource>
28     </environment>
29   </environments>
30 
31   <mappers>
32     <mapper resource="org/apache/ibatis/submitted/complex_property/User.xml"/>
33   </mappers>
34 
35 </configuration>

 这里的<property name="url" value="jdbc:mysql://127.0.0.1:3306/micro_message"/>最好写成

 

<property name="url" value="jdbc:mysql://127.0.0.1:3306/micro_message?useUnicode=true&amp;characterEncoding=UTF-8"/>

 

防止出现乱码问题

JDBC中的Dao层

 Dao层其实只关心

1.执行SQL语句

2.获取操作结果封装信息

3.返回操作结果

 

 

 

 

在JDBC的代码,如果执行的是一条预编译的SQL语句,那就必须得通过一个对象为这个SQL语句去设置这些预编译的参数,SqlSession就 具备这样的能力

数据库会话指的就是SqlSession,SqlSession就是一次跟数据库交互的会话

db层:真正和数据库去交互

 

Mybatis跟JDBC不一样,它不是像JDBC这样把SQL语句写死在代码里面,然后才去执行的,也不是像JDBC一样去用java代码去动态的拼接这个检索条件。

 <select id="find" parameterType="long" resultMap="UserResult">

id属性:为sql语句起一个唯一名字,好让java代码里面的SqlSession通过这个名称去调用。id不能重名

<mapper namespace="User">

通过namespace为每个配置文件都起一个不同的名称,那不同的namespace下相同的id是可以存在的,是不冲突的,通过namespace加以区分。

 

<id column="ID" jdbcType="INTEGER" property="id"/>

jdbcType="INTEGER":数据库里的字段类型与JDBC Types中的类型或者说与这个Types类下面的常量名有一种对应关系
 //java.sql.Types

例如 int-->INTEGER

  varchar-->VARCHAR

 

 

这条sql语句查询出来的列名将在对应关系里找到对应关系,把查出来的这一列的列值放到对应的对象属性里面

 

第4章 实战第三部 --- 越战越勇

继续用 Mybatis 实现案例中剩下的模块,来对 Mybatis 进一步了解学习

 

 

 

 

 

OGNL能从java的对象中去取属性值,而且它能直接调用java对象的方法

 

log4j.properties:

都是key=value的形式(键值对)

log4j.rootLogger=DEBUG,Console  //使用log4j输出日志的时候,输出的级别DEBUG,以及输出的位置Console,大于等于DEBUG级别的输出形式都会被输出;root针对整个工程下面所有输出日志的地方都将会按照这个规定DEBUG,Console来输出

输出级别:由低到高

 

这里输出级别为什么是DEBUG?

因为Mybatis源码可以看出,其他级别都高于DEBUG,信息就输出不出来


log4j.appender.Console=org.apache.log4j.ConsoleAppender  //输出到控制台,起的名字:Console
log4j.appender.Console.layout=org.apache.log4j.PatternLayout  //布局方式,按照自己的想法去输出,这里的布局方式是自定义
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n  //自定义输出内容的格式,%开头都是有特殊含义的,空格、方括号、减号按原样输出。%d指的是产生日志的时间;%t指的是产生这个日志所处于的那个线程的线程名称;%p输出的日志级别(debug,info,warn,error),%-5p:5指的是至少你输出的字符会占5位字符,不足5位将会用空格补齐,-(负号)指的是补齐的空格在右边,如果没有-(负号),补齐的空格将在左边;%c指的是输出日志时所处于的那个类的全名,包括包名;%m指的是你输出的时候附加的这个信息将会出现在这个位置(例:log.dabug("adf")中的adf);%n指的是换行。


log4j.logger.org.apache=INFO  //log4j.logger关键字,不能动;org.apache自己写的包名,写什么包名都行;为某个特定的包下面去配其他不同的级别,org.apache这个包下面的输出级别是INFO,DEBUG信息在这个包下是不输出的,就不影响我们看我们想看的信息

log4j.rootLogger=DEBUG,Console  //是针对整个工程的

 

Mybatis对于各种各样的log都定义好接口了,你加入哪一种log,它就调用哪一种。

控制台输出日志如下:

2018-10-29 12:01:30,268 [http-bio-8080-exec-7] DEBUG [Message.queryMessageList] - ==>  Preparing: select ID,COMMAND,DESCRIPTION,CONTENT from MESSAGE where 1=1 and DESCRIPTION like '%' ? '%'   //最终执行的sql语句
2018-10-29 12:01:30,269 [http-bio-8080-exec-7] DEBUG [Message.queryMessageList] - ==> Parameters: 精彩(String)  //输入的参数
2018-10-29 12:01:30,274 [http-bio-8080-exec-7] DEBUG [Message.queryMessageList] - <==      Total: 2  //执行查询有两条结果

 

4-4 实现单条信息删除

servlet负责接收页面的值,向页面传值,如果有其他业务逻辑需要处理,可以调用相应的service来完成这个的功能

service层就负责接收servlet传过来的值,并对这个值进行处理,做业务的操作、算法等等,如果有需要调用相应的Dao层

Dao层完成与数据库的交互,执行相应的sql语句。

4-5 实现信息批量删除

 

item指的是迭代出来的某一个具体的项,具体的项如果是一个简单的类型,直接写item就可以,如果是一个对象的话,需要item.属性名,才能把它引用出来

 

4-6 实现自动回复功能(上)

 

如果content等于上述几种情况,那么它在if表达式里面判断是为false

 

5-1 一对多关系的配置 I

 

 

 

 

 

select a.ID C_ID,a.NAME,a.DESCRIPTION,b.ID,b.CONTENT,b.COMMAND_ID
    from COMMAND a left join COMMAND_CONTENT b
    on a.ID=b.COMMAND_ID

left join关联子表,关联条件a.ID=b.COMMAND_ID。当出现两张表的时候,应该取个别名(COMMAND别名为a,COMMAND_CONTENT 别名为b),方便引用,同时也规避了一些问题。

配置一对多关系的目的是将主表的值填充到对应的主表实体类的属性中,并且通过collection标签关联的子表,

<collection property="contentList"  resultMap="CommandContent.Content"/>

将子表查询出来的值填充到映射的子表实体类的属性中。

5-3 一对多关系的配置Ⅲ

通过Mybatis帮我们去通过配置文件转换以后,变成一个一对多关系呈现出来的列表

 5-4 常用标签

1.where标签

 1 <!-- where标签的作用:1.帮我们输出where关键字,类似之前jdbc的sql语句 select ID a,COMMAND,DESCRIPTION,CONTENT from MESSAGE where 
 2                          2.当里面的条件都不满足,没有检索条件时,它自己也不再输出where关键字,变成无条件检索select ID a,COMMAND,DESCRIPTION,CONTENT from MESSAGE
 3                          3.将整个后面拼出来的检索条件最前面的and或者是or给截掉,让sql语句依然是正确的,可以执行的
 4                          (例:select ID a,COMMAND,DESCRIPTION,CONTENT from MESSAGE where and COMMAND=#{command} and DESCRIPTION like '%' #{description} '%')
 5                            就会变成这样:select ID a,COMMAND,DESCRIPTION,CONTENT from MESSAGE where COMMAND=#{command} and DESCRIPTION like '%' #{description} '%'
 6                            -->
 7     <where>
 8         <if test="command != null and !&quot;&quot;.equals(command.trim())">
 9             and COMMAND=#{command}
10         </if>
11         <if test="description != null and !&quot;&quot;.equals(description.trim())">
12             and DESCRIPTION like '%' #{description} '%'
13         </if>
14     </where>

2.sql标签

 <!-- sql标签相当于java里面的我们经常用的常量定义的概念 。起一个名字id="columns"--><sql id="columns">ID,COMMAND,DESCRIPTION,CONTENT</sql>

3.引用sql标签
 1  <select id="queryMessageList" parameterType="com.imooc.bean.Message" resultMap="MessageResult">
 2     <!-- 引用sql标签 -->
 3     select <include refid="columns"/> from MESSAGE
 4     <where>
 5         <if test="command != null and !&quot;&quot;.equals(command.trim())">
 6             and COMMAND=#{command}
 7         </if>
 8         <if test="description != null and !&quot;&quot;.equals(description.trim())">
 9             and DESCRIPTION like '%' #{description} '%'
10         </if>
11     </where>
12   </select>

4.set变签(相当于set关键字)

上面的逗号加在哪都不合适,不管是哪一个语句在前,最后都会多出来的,set标签就是解决这个问题的。

这里面如果拼的有内容,就输出set关键字,并且把最后结尾的逗号给去掉。和where标签类似

 

5.trim标签

prefix:前缀

suffix:加在内容的后面输出

当你拼的字符串最前面拼接了and,就帮你去掉

代替where标签

代替set标签

 

6.choose标签

 

相当于

if...else if...else if...else

 或者是

switch...

case...

case...

case...

default

 

7.association标签 :用法和connection标签相似

connection标签:在主表上加的,每查询出来一条主表的数据去关联查询它有多少条子数据

相反的,如果查询出来一条子表的数据,希望关联到主表,然后在子表的对象里面能看到主表对象里面的内容。

 property指的是在子表对应的实体类里面有一个对应主表实体的引用

 

 

 

 

 

这样再用关联查询的时候可以把主表的数据一起关联并且映射到子表对应的实体类里面的属性里面

 

 

常用标签归纳

标签名称分别对应sql语句里面增删改查的关键字

 

因为select标签,查询出来的结果集需要转换成java对象,方便进一步操作,就认识了resutMap标签

可以将结果集中的列与java对象的属性对应起来,并将值填充进去

注意:与java对象对应的列不是数据库里表中的列名,而是查询结果集中的列名

 

 

第6章 实战第五部---战斗总结

总结 Mybatis 的特征与需要注意的知识点
6-1 容易混淆的概念
resultMap属性指向的是用这个属性同名的一个标签定义的id。
resultMap和resultType相同的地方
都是为了表示结果集与java对象之间一种关系,好让Mybatis帮我们处理结果集,将结果集放到java对象中。
1 <resultMap type="com.imooc.bean.Message" id="MessageResult">
2     <id column="ID" jdbcType="INTEGER" property="id"/>
3     <result column="COMMAND" jdbcType="VARCHAR" property="command"/>
4     <result column="DESCRIPTION" jdbcType="VARCHAR" property="description"/>
5     <result column="CONTENT" jdbcType="VARCHAR" property="content"/>
6   </resultMap>
7 
8   <select id="queryMessageList" parameterType="com.imooc.bean.Message" resultMap="MessageResult">

这里的resultMap="MessageResult"可以改为resultType=“com.imooc.bean.Message”,当用resultType的时候,就不再需要配置<resultMap></resultMap>标签了,那这样结果集是如何与java类对应的呢?

没有resultMap来表明对应关系了,就只能靠名字,也就是说当结果集中的列名与Message这个类里面的属性名相同的时候,就表示它们之间有映射关系,结果集中的这一列的值就应该放到Message类的属性中,而且这个名称的对应关系是大小写不敏感的。

resultType=“java.util.Map”      Mybatis就会自动把结果集放到Map中,key就是结果集中的列名,value是结果集中的值,这样写大小写是敏感的。

resultType缺点:用resultType的时候必须保证结果集中的列名与java类中的属性名相同,用resultMap就没有这个要求,因为resultMap是考标签来配置对应关系的,名称不同它是不受影响的。

在配置resultMap的时候可以通过一个typeHandler属性来做类型转换

parameterMap:表明参数中的属性与数据库中的列对应的关系。目前parameterMap是Mybatis官方不推荐使用的属性,只是为了保持与老版本一致。

看到Map结尾的是映射(要配置映射关系),Type结尾是类型(java的类型)

 

被Mybatis解析之后

 

 

 #{}有预编译的效果,反复执行相同的sql语句,如果只是参数不同,有性能上的优势,同时还可以防止sql注入等。一般不会用${}将变量的值直接拼在sql语句里面。

#{}与ognl表达式的取值写法是相同的。

 

 

 

 

转载于:https://www.cnblogs.com/songsongblue/p/9839778.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365257.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Scroll Depth – 衡量页面滚动的 Google 分析插件

Scroll Depth 是一个小型的 Google Analytics&#xff08;谷歌分析&#xff09;插件&#xff0c;可以让你衡量用户在页面上滚动了多远。它可以监控 25%、50%、75% 和 100% 四个滚动点&#xff0c;并发送谷歌分析事件。 您还可以跟踪页面上的特定元素是否滚动到视图中。例如在博…

aws ec2时间_AWS中自动化的三大领域,以避免支付过多的云账单

AWS是全球最常用的云服务之一。 Gartner Magic Quadrant将AWS评为最大的IaaS提供商。每个可能的域都由企业使用AWS服务。 全球约有 1,000,000家公司正在使用AWS作为其IaaS提供商。从Netflix到Unilever再到Met Office&#xff0c;每个人都转移到AWS上的云基础架构。既然您正在阅…

Croppic – 免费开源的 jQuery 图片裁剪插件

Croppic 这款开源的 jQuery 图片裁剪插件能够满足网站开发人员各种不同的使用需要。只需要简单的上传图片&#xff0c;就可以实现你想要的图像缩放和裁剪功能。因为使用了 HTML5 FormData 对象&#xff0c;所以目前只支持 IE 10 、Chrome 和 Firefox 等现代浏览器。 您可能感兴…

应用面向方面的编程

1.引言 面向方面的编程的主要目标是将跨领域的关注点分离。 当我们谈论跨领域的关注时&#xff0c;我们指的是在我们的系统或应用程序中的多个地方使用的通用功能。 这些概念包括&#xff1a; 记录中 交易管理 错误处理 监控方式 安全 实现这种分离的方法是将这些概念模块…

ScrollReveal.js – 帮助你实现超炫的元素运动效果

ScrollReveal.js 用于创建和管理元素进入可视区域时的动画效果&#xff0c;帮助你的网站增加吸引力。只需要给元素增加 data-scrollreveal 属性&#xff0c;当元素进入可视区域的时候会自动被触发设置好的动画。 您可能感兴趣的相关文章2013年最受欢迎的10篇前端开发博文小伙伴…

JDBC布尔兼容性列表

有趣的是&#xff0c;布尔类型只是在SQL标准后期才引入&#xff0c;即SQL&#xff1a;1999 。 即使在今天&#xff0c;并非所有数据库本身都支持BOOLEAN或BIT类型。 最重要的是&#xff0c;我们仍然可以在Oracle中等待一段时间。 这是2002年以来关于该主题的“问汤姆”的观点&a…

GDI+与WPF中的颜色简析

GDI与WPF中的颜色简析 原文:GDI与WPF中的颜色简析--------------------------------------------------------------------------------引用或转载时请保留以下信息&#xff1a;大可山 [MSN:a3news(AT)hotmail.com] http://www.zpxp.com http://www.brawdraw.com萝卜鼠在线图形…

Panorama Viewer – jQuery 360度全景展示插件

jQuery Panorama Viewer 这款插件可以帮助你在网站中嵌入全景图片。要做到这一点&#xff0c;首先只需要在页面中引入最新的 jQuery 库&#xff0c;以及 jquery.panorama_viewer.js 和 panorama_viewer.css 到页面中&#xff0c;然后给图片添加 CSS 类“panorama”。现代浏览器…

oracle group by 多类别_python数据关系型图表散点图系列多数据系列

多数据系列多数据系列的散点图需要使用不同的填充颜色(fill)和数据点形状(shape)这两个视觉特征来表示数据系列&#xff1b;绘制多数据系列散点图多数据系列散点图就是在单数据系列上添加新的数据系列&#xff1b;使用不同的填充颜色或形状区分数据系列&#xff1b;plotnine绘制…

Web 开发中应用 HTML5 技术的10个实例教程

HTML5 作为下一代网站开发技术&#xff0c;无论你是一个 Web 开发人员或者想探索新的平台的游戏开发者&#xff0c;都值得去研究。借助尖端功能&#xff0c;技术和 API&#xff0c;HTML5 允许你创建响应性、创新性、互动性以及令人惊叹的漂亮网站。更进一步&#xff0c;你也可以…

在单元测试中访问私有字段

首先&#xff0c;让我大声说一下&#xff0c;您需要将代码设计为可测试的&#xff0c;以便通过公共方法测试私有字段。 但是&#xff0c;&#xff08;“ buts”是人们仍在编程而不是计算机本身的原因&#xff0c;所以在这里很高兴&#xff09;有时您想要并且应该更改一些私有字…

【LeetCode题解】160_相交链表

目录 160_相交链表描述解法一&#xff1a;哈希表思路Java 实现Python 实现解法二&#xff1a;双指针&#xff08;推荐&#xff09;思路Java 实现Python 实现160_相交链表 描述 编写一个程序&#xff0c;找到两个单链表相交的起始节点。 例如&#xff0c;下面的两个链表&#xf…

maya崩溃自动保存路径_maya 使用swig将插件编译成pyd,无缝使用内置数据实现加速计算模块...

前言&#xff1a;原本目的是想寻求一种方式来对cpu计算密集型代码部分进行加速替代&#xff0c;但是maya中mll插件的插件套路在传递参数上会占用大量的io&#xff0c;对于数据比较大的部分也会有相当消耗。如果全部写在c部分又感觉缺乏灵活性&#xff0c;所以琢磨的一种可以在p…

Slip.js – 在触摸屏上实现 Swipe 对列表重新排序

Slip.js 是一个很小的 JavaScript 库&#xff0c;用于实现对触摸屏的互动 Swipe 和对元素重新排序列表&#xff08;Reordering&#xff09;。Slip.js 没有任何的依赖&#xff0c;你可以通过自定义 DOM 事件实现重新排序交互。 您可能感兴趣的相关文章Pace.js – 页面加载进度自…

构建和运行Java 8支持

尚未提供对Java 8的Eclipse支持。 如果要使用它&#xff0c;则必须构建它。 Eclipsepedia的JDT Core / Java8页面包含有关使用Eclipse Java开发工具 &#xff08;JDT&#xff09;中不断发展的Java 8支持源来设置开发环境的说明。 说明中缺少一些内容&#xff1b; 待会儿我会回圈…

狄克斯特拉 Dijkstra 算法 C#实现

今天在看《算法图解》&#xff0c;看了加权最小路径算法&#xff0c;决定用代码实现一下。 首先是画有向图&#xff0c;在网上找了一下&#xff0c;有不错的开源软件graphviz,该源代码托管在GitLab上。该软件是一个图形可视化软件。 画了一个有向图如下&#xff1a; 画图用的代…

So Easy! 让开发人员更轻松的工具和资源

这篇文章给大家分享让开发人员生活更轻松的免费工具和资源。所以&#xff0c;如果你正在寻找一些为迅速解决每天碰到的设计和开发问题的工具和资源&#xff0c;不要再观望&#xff0c;试试这些工具吧。这些奇妙的工具不仅会加快您的生产&#xff0c;也让你的工作质量提升。 您可…

android linux截图库,Android中截图(surfaceView)源码

总结了一个方法&#xff0c;实现了在Android当前Activity的截图&#xff0c;本人测试确实通过了&#xff0c;不过有朋友说截出来的图是黑色的&#xff0c;不能看。我心想&#xff0c;这没有问题啊&#xff0c;相同的代码我就可以执行通过&#xff0c;并没有没有在意这个问题。可…

23套新鲜出炉的网站和手机界面 PSD 素材

Web 用户界面&#xff0c;移动用户界面和线框套件对设计师很有用&#xff0c;因为这些套件让他们使用快速和有效的方式复制用户界面。这些类型的工具包提供了一个基本的用户界面元素&#xff0c;用于它们需要制作的网站或软件模型。 在这篇文章中&#xff0c;我们展示的是自由和…

arcgis栅格邻域统计_ArcGIS 从基础到实战书正式出版,易智瑞技术总裁沙志友沙总推荐并亲自写序...

《ArcGIS 从基础到实战》书正式出版&#xff0c;易智瑞技术总裁沙志友沙总推荐并亲自写序&#xff0c;京东地址 https://item.jd.com/10025512034581.html第一章 ArcGIS基础和入门 11.1 ArcGIS 10.7 Desktop的安装 11.1.1 安装环境 11.1.2 安装步骤 21.1.3 注意的问…