通过自动回复机器人学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,一经查实,立即删除!

相关文章

部署到Maven中央存储库

您需要使您的Java库公开访问吗&#xff1f; 您的项目托管在GitHub上吗&#xff1f; 您是否喜欢“将所有功能都部署到Maven Central Repository”按钮的想法&#xff1f; 我将展示如何使用maven-release-plugin进行设置 。 源代码托管在GitHub上&#xff0c;因此还将描述对源代码…

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上的云基础架构。既然您正在阅…

linux vector 头文件,LINUX 之Vector用法

在Linux开发过程中常用到的一个功能----列表显示.如何将中心数据进行列表显示呢?这里就用到了VECTOR容器.从中心获取的数据通过VECTOR容器传输给站点程序从而实现批量数据的传输.VECTOR容器常用的函数包括以下几个1.push_back函数函数原型:void push_back(const T& x);实现…

MySQl的一些基本知识(1)

数据库优化操作&#xff1a; MySQL优化 数据库优化维度有四个: 硬件、系统配置、数据库表结构、SQL及索引 优化成本: 硬件>系统配置>数据库表结构>SQL及索引 优化效果: 硬件<系统配置<数据库表结构<SQL及索引 运行机制原理和底层架构 MySQL的查询优化&#x…

将一个word文档按一页或多页拆分成多个文档

工作中&#xff0c;有时候碰到需要将一个比较大的word按照指定的页数分割成若干个小的word文档&#xff0c;下面提供分割的方法供参考&#xff1a; 一、按照单页拆分 1、在Word里面打开那个需要分割的文档&#xff08;假设它的文件名叫做“test.doc”&#xff09;&#xff1b; …

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

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

应用面向方面的编程

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

最大连续子序列----DP动态规划

1196: 最大连续子序列 时间限制: 1 Sec 内存限制: 128 MB提交: 44 解决: 20[提交][状态][讨论版] 题目描述 给定 K 个整数的序列{ N1, N2, ..., NK } &#xff0c;其任意连续子序列可表示为{ Ni, Ni1,...,Nj} &#xff0c;其中1 < i< j < K。最大连续子序列是所有…

linux钟java运行命令,在java中运行linux命令

我想在java中运行“ls”命令&#xff0c;我的代码是- 注意&#xff1a; - 我正在使用WINDOWS。在java中运行linux命令import java.io.IOException;public class Example{public void fn(){Runtime run Runtime.getRuntime();Process p null;String cmd "ls";try {…

python3seek_Python seek()和tell()函数详解

在讲解 seek() 函数和 tell() 函数之前&#xff0c;首先来了解一下什么是文件指针。我们知道&#xff0c;使用 open() 函数打开文件并读取文件中的内容时&#xff0c;总是会从文件的第一个字符(字节)开始读起。那么&#xff0c;有没有办法可以自定指定读取的起始位置呢&#xf…

n=n+1 放在print(s)的前/后的影响

# 123456.....100 ?#关键在于,当n为时,才print(s)n 1s 0while n < 101: s s n if n 100: #关键在于这一步, 我用if来判断,当n为100时,才print(s), 否则继续while循环 print(s) n n 1          转载于:https://www.cnblogs.co…

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

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

JDBC布尔兼容性列表

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

linux用户操作的日志,linux 用户操作记录并录入日志

1. 添加bash全局配置文件&#xff1a;cd /etc/profile.dvi log_command.sh输入如下内容&#xff1a;export PROMPT_COMMAND‘RETRN_VAL$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\[ ]*//" ) [$RETRN_VAL]"‘2. 添加rsy…

我实在不懂Python的Asyncio

原语 事件循环(Event Loop)Awaitables和CoroutinesCoroutine WrappersAwaitables and FuturesTasksHandlesExecutorsTransport and Protocols如何使用Asyncio上下文数据个人想法这是Flask&#xff0c;Sentry的作者Armin Ronacher的一篇博客&#xff0c;这篇文章的影响很大&…

GDI+与WPF中的颜色简析

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

pythondatetime_Date

在JavaScript中&#xff0c;Date对象用来表示日期和时间。要获取系统当前时间&#xff0c;用&#xff1a;var now new Date();now; // Wed Jun 24 2015 19:49:22 GMT0800 (CST)now.getFullYear(); // 2015, 年份now.getMonth(); // 5, 月份&#xff0c;注意月份范围是0~11&…

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

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

优化您的ApplicationContext

Spring有一个问题&#xff0c;已经存在了一段时间&#xff0c;我在许多项目中都遇到过。 与Spring或Spring的Guys无关&#xff0c;这取决于像您和我这样的Spring用户。 让我解释一下……在Spring 2的过去&#xff0c;您必须手动配置Application Context&#xff0c;手动创建一个…