-
Mybatis总结——容易混淆的概念
【1】resultMap与resultType:
<select>标签有resultMap属性和resultType属性,都是为了表示结果集与java对象之间的一种映射关系,这样Mybatis就可以把结果集放在java对象中。
resultMap:的值为<resultMap>标签的id,它需要配置<resultMap>标签进行映射,它不受名称的影响(即实体类的属性名可以和结果集的名不相同)。<resultMap>的子标签提供了typeHandler可以用来类型转换(一般出现这样的问题可能是日期类型、布尔类型等,例如用数据库中的0和1表示java中的true和false,都可以通过配置resultMap来解决)
resultType:的值为java的类型,resultType按结果集的名字与实体类的名字相同来映射的,并且resultType的映射关系不区分大小写。它还可以是java.util.Map,这样结果集就会放在Map集合中,key就是结果集中的列名,value就是结果集的值了,使用该方式大小写是敏感的,sql语句返回的结果集是什么key就是什么。
【2】parameterMap与parameterType:
parameterType:指向一个java类型,它与OGNL表达式有联系(#{})
parameterMap:它和resultMap相似,也需要指向一个<parameterMap>标签配置的映射关系的id,只不过是resultMap表明结果集与java中属性间的映射关系,而parameterMap表明参数中的属性与数据库中的列对应的关系(Mybatis官方不推荐使用的属性)。
Mybatis曾经的名称为iBatis,原来在apache发布,后来在GoogleCode发布,原来的resultClass和parameterClass对应现在的resultType和parameterType。
【3】#{}与${}
这两种取值都是写在配置文件的sql语句中,${}取值写法和#{}是相同的。
#{}与${}的区别:#{command}会被Mybatis解析为预处理的?,然后再通过preparedStatement为该?赋值。而${command}会直接把command拼接在sql语句后,它是没有预编译效果的,类似于字符串拼接变量,但是当前是错误,两侧没有'',所以需要'${command}'。
${}使用场景:排序,当前端传入一个按照某列进行查询时,使用order by并不希望预处理给参数两边加上''。
【4】#{}与OGNL表达式
#{}与OGNL表达式取值写法是相同的,当parameterType的类型为String或者基本数据类型时,#{}里并不是一定要写成_parameter才能取到值,变量名可以写成任意名称,而OGNL中取值必须写成_parameter。
查看全部 -
常用标签
<where>标签:,一般在增删改查标签里使用,使用jdbc时,需要在sql语句后添加where1=1,Mybatis提供<where>标签,就是这个作用,当<where>里的条件成立时,就会拼接where。另外一个作用会去掉拼接sql语句里的第一个and或者or,如果不这样就会sql语法错误。
<sql>标签:与增删改查平级的,类似于java中的常量定义的概念,通过给该标签起一个id名,这样就可以在相应sql语句中通过<include refid="sql标签id名"/>来引用,项目复杂时,会带来便捷。
<set>标签:与where标签平级,用来代替set关键字。没使用set标签时如图一,如果使用<if>标签进行判断,拼接sql时,逗号加在前,加在后,都会语法错误。<set>标签就解决了该问题,如果<set>标签里的<if>标签条件满足就会拼接set,并且把最后的逗号去掉。
<trim>标签:它可以代替<where>标签或者<set>标签,提供很多灵活组合功能。
属性prefix代表前缀,例如前缀为where时当标签里的if条件成立时就会拼接where。
属性suffix后缀,根据业务场景进行设定,例如后缀为test,当标签里的if条件成立时,就会拼接后缀test。
属性prefixOverrides,例如它的值为and时,如果标签里的if条件成立,如果拼接的sql语句最前面有and,则会去掉。如下图就可以代替where标签了。
suffixOverrides属性,如果拼接的sql语句最后面有该属性值时,会被去掉。如下图,就可以代替set标签了
<choose>标签:类似于if...elseif...else语句,该标签里有<when><otherwise>,可以有多个<when>。
<collection>标签:配置一对多关系时使用,我们案例中在主表中的<resultMap>映射标签中进行使用的,代表每查询出一条主表中的数据,可以查询出它对应的子表的数据并映射到集合中。
<association>标签:property属性代表子表类中引用的主表对象,resultMap属性指向主表的namespace.resultMap的id,主表查询一条子表的数据,查询它关联的主表的数据,然后把主表的数据映射到子表的对象中。
Mybatis提供的标签总结
查看全部 -
一对多关系的配置
步骤1:数据库中的两张表对应两个实体类Command、CommandContent,其中Command类中应该存放一个集合用来存放CommandContent。
步骤2:为这两个实体类配置sql配置文件。
CommandContent.xml
Command.xml
步骤3:sql配置文件中编写关联查询,使用left join进行关联查询,当出现两张表时,通过起别名方便引用,关联条件是a作为主表时,a的id等于b的command-id。
步骤4:主表command.xml中配置,在映射关系中添加主表对应子表的集合,collection标签中的property值为集合属性名,resultMap值为command_content.xml的mapper的namespace+resultMap的id。
注意:
1、resultMap中的result标签和id标签的column属性不是数据库中表的列名,而是SELECT查询出来的结果集的名称,如果给查询出来的字段起了别名,则column要改为相应的别名。
2、列名前表的别名,加载列名前的前缀不能算作结果集的一部分的(可以通过jdbc的结果集对象调用getMetaData().getColumnName()打印输出,是没有列名前的表的别名),Mybatis也一样,如果查询返回的结果的字段名不在以上的方法中,则不会映射到实体类中。
问题:查询出来都有id字段,而表的别名又不能在映射中使用,所以这里只需要给其中一个id字段改一个别名。
步骤5:由于新添加了两个sql配置文件,所以需要在Mybatis核心配置文件中引入。
查看全部 -
一对多关系的配置(一个指令对应多个回复内容)
使用场景:该案例中通过发出一个命令,回复多个内容中的一个内容,也就是配置一对多关系。
首先,要从表结构进行改写,一般会拆成两张表进行一对多关系配置(一张表也可以存,但相同指令的名称会反复的出现,但是这样会出现冗余数据,也不符合第三范式)。
查看全部 -
实现自动回复功能
$(function(){})该jQuery方法相当于js中onload事件的方法,该方法中会先调用render方法,渲染效果(否则显示不出来效果),执行完操作后还需要调用render方法,重新计算滚动条的高度等等。
jQuery的ajax方法:取绝对路径可以通过在jsp页面中,添加一个隐藏的标签,该隐藏标签的值为绝对路径,再通过取该标签的值就可以取到绝对路径,整个js文件取绝对路径都是这样取。
通过ajax请求到的Servlet,该Servlet和前面的Servlet有些区别,该Servlet不是为了跳转页面,而是通过PrintWriter把查询内容输出出去。
通过指令自动查询内容的Service层
查看全部 -
实现自动回复功能(开发微信公众号自动回复功能)
案例描述:输入指令,点击发送,让指令和和账号的图片显示在聊天记录的框里面,然后向后台发送ajax请求,以这个指令作为参数,让后台到数据库中查找,然后回复内容,然后让公众号的图片和回复内容显示在框里面。
JS知识点:如果一个var声明的变量,如下四种情况,则在if语句判断时是false。
jQuery的ajax请求写法:url为请求后台的路径,type:提交的方式为(POST或者是GET),dataType:期待服务端响应的数据类型,timeout:超时时间,success:成功回调函数(也可以加一个错误回调函数进行调试),data:像服务端发送请求带上ajax的参数。
暂时不考虑后台实现,加入通过发送指令,成功的话会拿到服务器相应内容,然后执行success的回调函数。该回调函数的任务就是显示用户发送的命令和头像以及显示公众号的回复内容和头像,再把文本框的内容清空(这里只不过是调用js内部自己封装好的js方法),最后有一个render方法是为了达到样式。
查看全部 -
jdbc的事物是自动提交的,每执行一次增、删、改都会自动提交一次事物,而Mybatis对jdbc进行封装之后,SqlSession需要手动提交事物。
查看全部 -
应用log4j日志调式动态SQL(JDBC使用断点可以调试,然后输出拼接的SQL语句。Mybatis使用log4j进行调试可以完成此功能)
Mybatis支持日志,最常用的日志输出是log4j,Mybatis支持log4
j,只需要把Log4j的配置文件和Jar包导入即可,这样Mybatis就可以通过Log4j把最终执行的sql语句打印出来,并且包括参数,Log4j配置文件直接放在src文件夹下,这样就不用再编写加载Log4j配置文件路径的代码了。
Log4j配置文件:Mybatis源码包中也存在,它以.properties文件形式打开,其中的内容都是key和value进行存储,可以通过key取到value。
【1】log4j.rootLogger=DEBUG,Console:配置使用log4j输出日志的时候,输出的级别,以及输出的位置。
输出日志的形式:如下输出日志的级别是由低到高,当在log4j.properties中配置了DEBUG时,大于等于debug级别的日志输出都会被输出。
Logger对象调用debug("对象");
Logger对象调用info(对象);
Logger对象调用warn(对象);
Logger对象调用error(对象);
log4j.properties配置DEBUG的原因:可以从Mybatis源码中查看,因为是Mybatis通过log4j输出sql语句,源码中使用到了debug()进行输出,如果不配置它,Mybatis的日志信息不会被输出。
导入Mybatis源码:点击项目Properties属性,在Java Build Path的Libraries,找到Mybatis的jar包下的Source attachment...,然后edit,选中mybatis源码包。
如下图,Mybatis的org.apache.ibatis.logging.jdbc的这几个类就是输出日志用的。
Console代表日志信息的输出位置,它的名任意的。配置了ConsoleAppender这个类才会输出到控制台,如果想要输出到文件里,就需要把org.apache换成其他的类。
日志信息的布局配置(当前这个是自定义配置,所以还需要配置自定义格式)
当前自定义的日志信息布局格式。
%d:产生日志的时间。
%t:产生该日志所处的线程的名称。
%-5p:输出日志的级别(debug、info、warning、error)这里的5代表输出的字符至少5位字符,不足5位将用空格补齐,-号代表补齐的空格在右边,如果没有-补齐的空格将在左边。
%c:代表输出日志时,所处于的那个类的全名,包括包名。
%m:输出时附加的信息,也就是调用日志输出方法的里的信息。
%n:代表换行,如果没有它,所有的日志会连成一片。
前面的log4j.logger固定,后面是包名,rootLogger代表整个工程下所有输出日志的地方都将按照这种方式进行输出,也可以为某个包下的日志输出配置不同的级别,如下就是把org.apache包下的日志不按照该方式进行输出,也就是不会输出该包下的debug信息,这样就不会影响我们想要看的信息。
引入了log4j的jar包和配置文件,Mybatis自动就会输出日志的原因:Mybatis的jar包的logging下的LogFactory.class里定义好了各种各样的日志接口(log4j、log4j2、jdk ),使用哪一个日志,就会调用相应的日志接口完成日志输出。
查看全部 -
动态SQL拼接
OGNL是一个功能强大的表达式语言:OGNL支持java的方法。
XML属性的双引号冲突解决办法:使用转义引号""
OGNL中&&的转义:XML中不支持&&,需要使用转义字符,&&也可以使用OGNL特有操作符and
SQL拼接:使用#{传入的参数名},Mybatis处理这里时会把它处理为?,并对该?赋值。当Mybatis解析时会解析该参数并赋值,这里而且可以不需要考虑sql语句的空格等问题,只要写在标签中间,Mybatis会自动处理。
查看全部 -
动态SQL拼接
1、动态的给sql语句传入参数
一般把属性封装成一个类,传入这个类的对象,而sql配置文件中通过相应标签的parameterType属性指定该类的路径,如果是java中提供的数据类型,例如String不用写java.lang.String,直接写String即可。
2、sql语句动态的获取参数
在使用JDBC时进行判断参数是否为null,或者为""时,使用的是if语句,如果不为null,或者不为"",则使用append追加字符串。
而Mybatis使用<if test=""></if>进行判断,也就是OGNL表达式,Mybatis在sql配置文件中支持OGNL表达式。
Mybatis中的OGNL表达式
【1】取值范围 ———————— 标签的属性中
取值的范围可以是标签属性parameterType范围,也可以从其他标签属性中取出,例如<foreach collection=""></foreach>,这时就会从collection属性中取。
【2】取值写法
如果是传入的参数类型是String与基本数据类型,固定写法:_parameter
如果是自定义类型(Message):直接写属性名(command)
如果是集合类型,固定写法,大小写敏感:数组:array,List:list,Map:_parameter
从集合中取出一条数据:
数组——array[索引](String[]),如果不是String或者基本类型,则是array[索引].属性名(Message[])
List——list[索引](List<String>),如果不是String或者基本类型,则是
list[索引].属性名(List<Message>)
Map——_parameter.key(Map<String,String>),_parameter可以省略,一般写key.属性名(Map<String,Message>),这个key就是java中存入的key名称
利用foreach标签可以从集合中取出数据:Mybatis的sql配置文件提供了<foreach collection="array" index="i" item="item">,可以循环数组、List、Map集合,collection属性指向一个完整的集合,数组和List中index的i代表索引或者下标,在Map中i代表key,item代表循环某一个具体的数据,在Map中指的是value。
操作符:OGNL表达式目的,并不只是获取值,也可能是对获取到的值进行算数运算或者逻辑运算,OGNL操作符分为两类,一类是java支持的操作符,OGNL都支持,另一类是OGNL特有的操作符(mod取模、in判断某个值是否在一个集合中)如下图
查看全部 -
SQL基本配置与执行
SQL基本配置:Mybatis通过XML标签<insert>、<delete>、<update>、<select>执行SQL语句,Mapper标签有一个namespace属性(Mybatis规定所有的XML文件的id都不可以相同,所以可以通过给Mapper标签的namespace起名解决该问题),SqlSession提供了增、删、改、查的方法,通过在方法中传入XML文件标签的namespace.id可以查找到XML文件中相应的标签并执行相应sql语句。
注意:Mapper标签的namespace必须有,否则加载配置文件会出错。
<resultMap>标签:配置数据库字段和实体类属性之间的映射信息,type属性——数据库里的表对应java中哪一个类,所以它的值为类的全名称,这样字段值就会映射到该类属性上。
id属性——该映射关系的唯一标识(<resultMap>标签的id和<select>等标签id不冲突)。
<resultMap>子标签——通过该标签ID就可以映射到某个实体类
<id column="id" jdbcType="INTEGER" property="id"/>:如果数据库这个字段是主键用该标签。
<result column="username" jdbcType="VARCHAR" property="username":如果数据库这个字段是普通字段用该标签。
jdbcType:它的值应该是Types类中的常量名。在java.sql.Types包中,该类中存放着数据库中数据类型与Types类中的常量名有着对应关系。
Sql语句引用映射关系:sql标签中添加属性resultMap="ResultMap的id",这样查询出来的列值就会映射到类的属性中,如果查出来的字段值,在映射关系中没有映射,那么就不放,如果配置了映射关系的属性,在查询时却没有返回该字段,那么实体类的该属性值则为默认值。
Mybatis核心配置文件中导入sql配置(Mapper.xml):sql的XML文件需要在Mybatis核心配置文件中配置才会生效,<mappers>可以有多个sql配置文件<mapper resource="Mapper文件的路径/></mappers>,每个mapper对应一个sqlXML文件。
查看全部 -
本章主要介绍Mybatis 的下载、基本配置、基本应用以及Mybatis 的特征
【一】Mybatis官网下载:https://github.com/mybatis/mybatis-3/releases
mybatis-SNAPSHOT:mybatis快照版,临时开发版本,这里下载开发版本。
这里需要下载Mybatis源码包,该包中src——>test中有一些参考文件。
【二】Mybatis配置(Mybatis大部分工作在配置文件中)
步骤1:导Mybatis包(mybatis-3.3.0.jar)。
步骤2:Mybatis核心配置文件(可以参照Mybatis源码包中演示代码,只需要修改Configuration.xml中数据库的信息(driver、username、password、url)路径如下图)
步骤3:读取Mybatis核心配置文件(完成jdbc的操作,这里单独创建一个类提供给Dao层SqlSession)
【1】:Mybatis提供了解析核心配置文件的方式:
Reader reader=Resources.getResourceAsReader(“Mybatis核心配置文件路径”);
【2】:通过配置信息构建SqlSessionFactory
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader)
【3】:通过SqlSessionFactory打开数据库会话(SqlSession)。
SqlSession sqlSession=sqlSessionFactory.openSession();
Mybatis相关知识点
SqlSession介绍:与数据库交互。
SqlSession作用:
作用1:向SQL语句传入参数(相当于预处理,设置sql语句中的?,并通过ps.setObject进行预处理)。
作用2:执行SQL语句
作用3:获取执行SQL语句的结果
作用4:事物的控制
Mybatis提供给Dao层的SqlSession获取方式:
1、通过Mybatis核心配置文件获取连接数据库的相关信息。
2、通过Mybatis配置信息对象构建SqlSessionFactory。
3、通过SqlSessionFactory打开数据库会话(SqlSession)。
查看全部 -
案例分析
基本功能:接收发送指令
根据指令自动回复对应的内容
模块划分:
回复内容的维护——包括新增、修改等(维护的是发送的指令与回复内容的关系,也就是一种指令只能对应一段内容)
对话功能——用户与公众号对话的平台,根据指令匹配回复内容
回复内容列表——把维护到数据库的内容展示出来,具备搜索所有内容,还能进行二次维护(也可以从这里进行删除)
回复内容删除——
查看全部 -
OGNL表达式,里面大小写敏感
查看全部 -
#{}会预编译,用占位符 ? 代替,${}直接用查询字符串替换,比如要查询“消息”则会直接替换为 消息,注意是没有 双引号 的。
String 或 基本数据类型取值写法不是非要写成 #{_parameter} 而是可以写成 #{任意,随便写什么} ,但是自定义的类型,就只能写成 #{自定义类型}
查看全部
举报