文章目录
1 ibatis
1.1 ibatis基础
1.2 区别
1.2.1 ibatis和mybatis区别
1.2.1.1 配置文件区别
1.2.1.2 sql语句区别
1.2.1.3 SqlSession执行区别
1.2.1.4 属性设置区别
1.2.1.5 配置事务管理器和数据源区别
1.2.1.6 指定映射文件的方式区别
1.2.1.7 代码配置和SQL与方法绑定区别
1.2.1.8 映射文件区别
1.2.1.9 调用存储过程区别
1.3 ibatis语法
1.3.1 iterate循环标签
1.3.2 动态sql标签
1 ibatis
1.1 ibatis基础
1.1.1 ibatis过渡为mybatis
对于从事Java EE
的开发人员来说,iBatis
是一个再熟悉不过的持久层框架了,iBatis
可以算是在所有主流的持久层框架中学习成本最低,最容易上手和掌握的框架。虽说其他持久层框架也号称门槛低,容易上手,但是等到你真正使用时会发现,要想掌握并用好它是一件非常困难的事。 iBatis
自从在Apache
软件基金会网站上发布至今,和他的明星兄弟们(Http Server,Tomcat,Struts,Maven,Ant
等等)一起接受者万千 Java 开发者的敬仰。然而在当时,几乎是发布 3.0
版本的同时,iBatis
主页上的一则Apache iBATIS has been retired(退休)
的声明在社区引起了一阵不小的波澜。在Apache
寄居六年之后,iBatis
将代码托管到Google Code
。在声明中给出的主要理由是,和Apache
相比,Google Code
更有利于开发者的协同工作,也更能适应快速发布。于此同时,iBatis
更名为 MyBatis
从iBatis
到MyBatis
,不只是名称上的变化,MyBatis
提供了更为强大的功能,同时并没有损失其易用性,相反,在很多地方都借助于JDK
的泛型和注解特性进行了简化。iBatis
确实该退休了,因为一个更为出色的继任者经过 10
个 Beta
版本的蜕变已然出现在我们的面前。
1.2 区别
1.2.1 ibatis和mybatis区别
如果接触过一些常用的Java EE
框架,应该都知道这些框架需要提供一个全局配置文件,用于指定程序正常运行所需的设置和参数信息。而针对常用的持久层框架而言(Hibernate
、JPA
、iBatis
等),则通常需要配置两类文件:一类用于指定数据源、事务属性以及其他一些参数配置信息(通常是一个独立的文件,可以称之为全局配置文件);另一类则用于指定数据库表和程序之间的映射信息(可能不止一个文件,称之为映射文件)。MyBatis
也不例外,虽然其中的一部分可以通过注解的形式进行,但是这两部分内容本身仍是必不可少的。
根据iBatis
的习惯,我们通常把全局配置文件命名为 sqlMapConfig.xml
,文件名本身并没有要求,在 MyBatis
中,也经常会将该文件命名为 Configuration.xml
(读完全文后也许会发现,在iBatis
中经常出现的sqlMap
在MyBatis
中被逐渐淡化了,除了此处,还比如iBatis
配置文件的根元素为
,指定映射文件的元素为
,以及 SqlMapClient
等等,这个变化正说明,iBatis
仅是以 SQL
映射为核心的框架,而在MyBatis
中多以Mapper
、Session
、Configuration
等其他常用ORM
框架中的名字代替,体现的无非是两个方面:首先是为了减少开发者在切换框架所带来的学习成本;其次,MyBatis
充分吸收了其他ORM
框架好的实践,MyBatis
现在已不仅仅是一个SQL
映射框架了)。 mybatis
在全局配置文件中可以配置的信息主要包括如下几个方面:
properties
— 用于提供一系列的键值对组成的属性信息,该属性信息可以用于整个配置文件中。
settings
— 用于设置MyBatis
的运行时方式,比如是否启用延迟加载等。
typeAliases
— 为Java
类型指定别名,可以在XML
文件中用别名取代Java
类的全限定名。
typeHandlers
— 在MyBatis
通过PreparedStatement
为占位符设置值,或者从ResultSet
取出值时,特定类型的类型处理器会被执行
objectFactory
— MyBatis
通过ObjectFactory
来创建结果对象。可以通过继承DefaultObjectFactory
来实现自己的ObjectFactory
类。
plugins
— 用于配置一系列拦截器,用于拦截映射SQL
语句的执行。可以通过实现Interceptor
接口来实现自己的拦截器。
environments
— 用于配置数据源信息,包括连接池、事务属性等。
mappers
— 程序中所有用到的SQL
映射文件都在这里列出,这些映射SQL
都被MyBatis
管理 上面提及的大多数元素都不是必需的,通常MyBatis
会为没有显式设置的元素提供缺省值。一个简单的全局配置文件示例如下:
1.2.1.1 配置文件区别
简单的全局配置文件示例
< configuration>
< environments default = " demo" >
< environment id = " demo" >
< transactionManager type = " JDBC" />
< dataSource type = " POOLED" >
< property name = " username" value = " root" />
< property name = " password" value = " root" />
dataSource >
environment >
environments >
< mappers>
< mapper resource = " footmark/mybatis/demo/UserInfoMapper.xml" />
mappers >
configuration >
有了这些信息,MyBatis
便能够和数据库建立连接,并应用给定的连接池信息和事务属性。MyBatis
封装了这些操作,最终暴露一个 SqlSessionFactory
实例供开发者使用,从名字可以看出来,这是一个创建SqlSession
的工厂类,通过SqlSession
实例,开发者能够直接进行业务逻辑的操作,而不需要重复编写JDBC
相关的样板代码。根据全局配置文件生成SqlSession
的代码如下:
Reader reader = Resources. getResourceAsReader ( "Configuration.xml" ) ;
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder ( ) . build ( reader) ;
SqlSession sqlSession = sqlSessionFactory. openSession ( ) ;
可以把上面的三行代码看做是MyBatis
创建SqlSession
的样板代码。其中第一行代码在类路径上加载配置文件,Resources
是MyBatis
提供的一个工具类,它用于简化资源文件的加载,它可以访问各种路径的文件,不过最常用的还是示例中这种基于类路径的表示方式
1.2.1.2 sql语句区别
在完成全局配置文件,并通过MyBatis
获得SqlSession
对象之后,便可以执行数据访问操作了。对于 iBatis/MyBatis
而言,要执行的操作其实就是在映射文件中配置的 SQL
语句。两者的配置基本相同,如下所示: 在映射文件中配置SQL
语句
< mapper namespace = " mybatis.demo.UserInfoMapper" >
< select id = " selectUser" parameterType = " int" resultType = " mybatis.demo.UserInfo" >
select * from UserInfo where userid =#{userid}
select >
mapper >
在iBatis
中,namespace
不是必需的,且它的存在没有实际的意义。在 MyBatis
中,namespace
终于派上用场了,它使得映射文件与接口绑定变得非常自然。
1.2.1.3 SqlSession执行区别
使用SqlSession
执行映射文件中配置的SQL
语句
try
{
UserInfo userinfo = ( UserInfo) sqlSession. selectOne ( "mybatis.demo.UserInfoMapper.selectUser" , 2 ) ;
System. out. println ( userinfo) ;
} finally
{
sqlSession. close ( ) ;
}
需要注意的是,SqlSession
的使用必需遵守上面的格式,即在finally
块中将其关闭。以保证资源得到释放,防止出现内存泄露! 以上就是一个简单而完整的MyBatis
程序。其中涉及了全局配置文件,映射文件,构建SqlSession
对象,执行数据访问操作等四个步骤。下面将针对除构建SqlSession
对象之外的三块内容进行分解。 MyBatis
全局配置文件的改变 MyBatis
全局配置文件的各主要元素基本和iBatis
相同,只是在用法和个别名称上做了调整。元素的意义就不再描述,下面主要讲述针对 iBatis
和 MyBatis
配置文件的主要区别之处。
1.2.1.4 属性设置区别
首先,两个版本的 DTD
约束不同,MyBatis
的DTD
文件已经包含在发布包下的 mybatis-3.0.x.jar
包中。这直接影响到的是,iBatis
配置文件的根元素是
,而MyBatis
使用的是
其次,
的用法发生了改变,之前的格式为:
要设置的属性直接以键值对的形式作为
的属性
< settings>
< setting name = " props1" value = " value1" />
< setting name = " props2" value = " value2" />
……
settings >
1.2.1.5 配置事务管理器和数据源区别
< transactionManager type = " JDBC" >
< dataSource type = " SIMPLE" >
< property name = " JDBC.Driver" value = " ${driver}" />
dataSource >
transactionManager >
< environments default = " demo" >
< environment id = " demo" >
< transactionManager type = " JDBC" />
< dataSource type = " POOLED" >
< property name = " JDBC.Driver" value = " ${driver}" />
dataSource >
environment >
environments >
通过
来进行数据源管理,主要是为了简化在多套数据源配置之间的切换,比如开发和发布使用不同的配置。
1.2.1.6 指定映射文件的方式区别
< sqlMap resource = ... />
< sqlMap resource = ... />
< sqlMap resource = ... />
< mappers>
< mapper resource = ... />
< mapper resource = ... />
mappers >
上面的这些调整,主要出发点其实并不是使得MyBatis
功能更为强大,而是使配置更为合理,让开发者更容易阅读和理解。 到目前为止,除了XML
形式的全局配置,其实这也不是唯一选择,MyBatis
还提供了通过代码来进行配置的方式:
1.2.1.7 代码配置和SQL与方法绑定区别
在MyBatis
中使用代码进行配置
DataSource ds = ……
TransactionFactory txFactory = new JdbcTransactionFactory ( ) ;
Environment env = new Environment ( "demo" , txFactory, ds) ;
Configuration cfg = new Configuration ( env) ;
cfg. addMapper ( UserInfoMapper. class ) ;
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder ( ) . build ( cfg) ;
结合前面的配置文件,很容易理解这段代码的意思,故不再赘述。不过,需要注意的是Configuration
的addMapper()
方法,该方法的参数通常是一个接口,可以在接口里面定义若干方法,在方法上使用注解来指定映射的SQL
语句。一个典型的接口定义以及对应的数据访问方法如下: 将映射的SQL
语句与接口中的方法绑定
public interface UserInfoMapper
{
@Select ( "select * from userinfo where userid = #{userid}" )
public UserInfo getUserInfo ( int userid) ;
}
try
{
UserInfoMapper userinfoMapper = sqlSession. getMapper ( UserInfoMapper. class ) ;
UserInfo userinfo = userinfoMapper. getUserInfo ( 1 ) ;
System. out. println ( userinfo) ;
} finally
{
sqlSession. close ( ) ;
}
1.2.1.8 映射文件区别
MyBatis
映射文件的改变 MyBatis
针对映射文件进行格式调整的地方很多,但大部分仅仅只是名称上的变化,现代的 IDE
都支持联想功能,可以很方便的获取到当前位置可以有哪些元素、哪些属性等。所以这基本不会给开发者造成什么麻烦。
针对映射文件,首先是一系列的属性名称的改变,这些仅仅是名称的改变,用法和含义并没有发生变化:
和全局配置文件一样,由于DTD
约束发生变化,根元素也由iBatis
原来的
调整为MyBatis
的
等元素的iBatis的parameterClass属性改为了MyBatis的 parameterType 属性。
等元素的iBatis
的resultClasss
属性改为了MyBatis
的 resultType
属性。
等元素的 iBatis
的class
属性改为了MyBatis
的type
属性。
元素的iBatis
的columnIndex
属性被移除了。
嵌套参数由iBatis
的#value#
改为了MyBatis
的#{value}
等元素的jdbcType
属性取值中,原来的iBatis
的 ORACLECURSOR
取值改为了现在的 MyBatis
的CURSOR
,iBatis
的NUMBER
取值改为了 MyBatis
的NUMERIC
。
iBatis
配置文件的根元素是
,而MyBatis
使用的是
1.2.1.9 调用存储过程区别
iBatis
中调用存储过程的方式 iBatis/MyBatis
对存储过程的支持一直是值得称道的。之前通过使用
元素进行存储过程的定义,示例如下:
< procedure id = " getValues" parameterMap = " getValuesPM" >
{ ? = call pkgExample.getValues(p_id => ?) }
procedure >
MyBatis
中调用存储过程的方式 在 MyBatis
中,
元素已经被移除,通过 、 和进行定义:
<select id="getValues" parameterMap="getValuesPM" statementType="CALLABLE">
{ ? = call pkgExample.getValues(p_id => ?)}
select>
如上所示,通过statementType属性将该语句标识为存储过程而非普通SQL语句。
代码层面的改变 通过前面的示例可以看出,MyBatis在编码中的最大的改变就是将一个最常用的 API 由 SqlMapClient 改为了SqlSessionFactory。另外,类型处理器接口也由原来的 TypeHandlerCallback 改为了 TypeHandler。最后 DataSourceFactory 也进行了调整,移动到 org.apache.ibatis.datasource 包下,其中的方法也作了微调。总之,代码层面公开的部分改动较少,不会给开发者造成较大的移植成本。
1.3 ibatis语法
1.3.1 iterate循环标签
Iterate:这属性遍历整个集合,并为List集合中的元素重复元素体的内容。 Iterate的属性:
prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选)
property - 类型为java.util.List的用于遍历的元素(必选)
open - 整个遍历内容体开始的字符串,用于定义括号(可选)
close -整个遍历内容体结束的字符串,用于定义括号(可选)
conjunction - 每次遍历内容之间的字符串,用于定义AND或OR(可选)
遍历类型为java.util.List(或数组)的元素。 例子:
<iterate prepend=”AND” property=”userNameList” open=”(” close=”)” conjunction=”OR”>
username=#userNameList[]#
iterate>
注意:使用时,在List元素名后面包括方括号[]非常重要,方括号[]将对象标记为List, 以防解析器简单地将List输出成String。 在生成该条sql语句时,标签中的内容是循环生成的,就拿上面的例子来说,生成的sql是:(username=xxx1 or username=xxx2 or username=xxx 3)而不是(username=xxx1 or xxx2 or xxx3) 再举个例子,如下:
id in
<iterate prepend="" property="ids" open="(" close=")" conjunction="," >
#ids[]#
iterate>
其生成的sql语句是:id in (xx1,xx2,xx3,.....),括号中的(包括括号)是标签生成的。 标签虽然是遍历整个集合的,但他也不象我们在java中用到的for一样,一次一次的循环生成标签中的内容,而是一次性利用list或数组生成整个可运行的sql语句。 就好比它生成的sql不可能象这样:id in (xx1) id in (xx2) ,id in (xx3),.....
1.3.2 动态sql标签
属性关键字
含义
如果参数相等于值则查询条件有效
如果参数不等于值则查询条件有效
如果参数大于值则查询条件有效
如果参数等于值则查询条件有效
如果参数小于值则查询条件有效。如下所示:ADOLESCENT = ‘TRUE’
如果参数有使用则查询条件有效
如果参数没有使用则查询条件有效
如果参数为NULL则查询条件有效
如果参数不为NULL则查询条件有效
如果参数为空则查询条件有效
如果参数不为空则查询条件有效。参数的数据类型为Collection、String 时参数不为NULL或“”。如下所示: FIRST_NAME=#firstName#
如果参数类不为NULL则查询条件有效
如果参数对象不存在(空) 有效:EMPLOYEE_TYPE = ‘DEFAULT’
在动态标签中:
isequal:作比较用相当于String 里的equal方法,
property:指定比较属性的名称,
compareValue:表示要比较的参数,
prepend:表示追加比较条件
你可能感兴趣的:(mybatis,mybatis,ibatis)
Field ‘id‘ doesn‘t have a default value
MA_Y_
oracle数据库
1.程序测试时,运行到向数据库插入数据时,报以下异常是id没有默认值;在测试单元内单独向该数据库插入数据,报同样的异常,确定了异常的定位2.项目时采用mybatisPlus操作数据库,报异常的数据库和另外一个数据库关联,主键ID和另外一个数据库相同,通过读取另外一个数据库的ID获得3.通过查找,发现是PO类的ID策略有误,采用mybatisPlus生成的po类,默认是自增长ID@ApiModelP
解决Mybatis-plus与springboot3.0+、spring6.0+的兼容性问题
lian潋湄
mybatis
根据mybatis-plus学习框架时,一直都会报错如下信息:当时并不知道这几个工具之间存在版本兼容性问题,就一直苦于找不到合适的解决方法,于是便上网开始了疯狂的搜索,发现改了好多地方还是不行。偶然间了解到了工具之间版本是存在兼容性问题的,一开始问ChatGPT也并没有给出正确的回答,于是我去了最最权威的官网查看,终于发现了问题所在:mybatis-plus官网给出的mybatis-plus插件依
MyBatis的if标签的基本使用
君子剑mango
#MyBatis框架mybatisjava开发语言
在MyBatis框架中,if标签用于在构建SQL语句时,根据参数条件判断的结果,动态地选择加入或不加where条件中。一常见使用在使用MyBatis处理查询逻辑的时候,常用的是判断一些参数是否为空,列举常用的几种情况展示1.1数据准备1.1.1创建表模型CREATETABLE`approval_info`(`id`BIGINTNOTNULLAUTO_INCREMENT,`info_name`VAR
【Spring:Caused by java.lang.ClassNotFoundException 】
m0_74823490
面试学习路线阿里巴巴javaspringtomcat
Spring:Causedby:java.lang.ClassNotFoundException:org.springframework.dao.support.DaoSupportSpring中使用Mybatis连接数据库时可能会出现以上错误,但是当出现以上错误时说明你在applicationContext.xml文件中所做的相关操作:spring整合myBATis后控制的创建连接用的对象加载M
SpringBoot3整合MyBatis-Plus
Mais10011
springbootmybatis
准备数据CREATETABLE`t_user`(idBIGINTNOTNULLCOMMENT'主键ID',nameVARCHAR(30)NULLDEFAULTNULLCOMMENT'姓名',ageINTNULLDEFAULTNULLCOMMENT'年龄',emailVARCHAR(50)NULLDEFAULTNULLCOMMENT'邮箱',PRIMARYKEY(id));INSERTINTO`t_
MyBatis-Plus介绍及基本使用
墨鸦_Cormorant
#Java持久层mybatismybatis-plusmybatisPlus
文章目录概述介绍MyBatis-Plus常用配置分页插件配置类注解配置快速入门maven依赖编写配置文件编写启动类编写MybatisPlus配置类代码生成器:MybatisPlusGeneratormaven依赖代码生成器核心类概述介绍MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。主页:传送门引入MyBati
mybatis-plus逆向code generator pgsql实践
松树戈
工具使用mybatisspringboot
mybatis-plus逆向codegeneratorpgsql实践环境准备重要工具的版本供参考pom依赖待逆向的SQL配置文件CodeGenerator配置类配置类说明环境准备重要工具的版本jdk1.8.0_131springboot2.7.6mybatis-plus3.5.7pgsql14.15供参考pom依赖4.0.0com.tghparent-demo0.0.1-SNAPSHOTparen
MyBatis 源码解析:动态 SQL 生成的基本原理
捕风捉你
MyBatis源码解读mybatistomcat
摘要MyBatis提供了灵活的动态SQL功能,使得开发者可以根据业务需求在运行时生成不同的SQL语句。动态SQL是MyBatis最具特色的功能之一,它允许我们通过条件拼接来生成复杂的查询语句。本文将通过自定义实现一个简化的动态SQL生成器,解析其工作原理,并结合MyBatis的源码进行深入讲解。前言传统的SQL查询往往需要开发者根据不同的业务逻辑手动拼接SQL语句,而这种方式不仅容易出错,也不够灵
SSM框架搭建
皇家大厨
笔记
此文参考书籍为ACCP软件工程师——使用SSM框架开发企业级应用8.0版文章目录遇到的问题:1.错误:couldnotfindresourcesrc/dao/UserMapper.xml和mybatis启动异常:Logginginitializedusing'classorg.apache.ibatis.logging.log4j.Log4jImpl'2.Eclipse中的路径问题:3.log4j
MybatisPlus + SpringBoot + Vue 实现自定义联表查询,返回 HashMap<String, Object> 条件,分页,模糊,total
沐沐uuu
springboot后端java
MybatisPlus+SpringBoot+Vue实现自定义联表查询,返回HashMap条件,分页,模糊,totalMybatisPlus极大的简化了单表查询的重复操作,但是在联表的时候,特别是在查询的结果集没有对应实体类的时候,就还要手写sql,手写分页和模糊,返回HashMap对象。这里我写一个Demo,以方便以后的开发中遇到这种情况。mapper.xmlSELECTa.APPLICATIO
druid mysql读写分离_Spring Boot + Mybatis + Druid 实现MySQL一主多从读写分离
咖啡碎冰冰
druidmysql读写分离
SpringBoot读写分离实现原理实现方式主要是通过扩展SpringAbstractRoutingDataSource这个类充当DataSource路由中介,在运行当中根据自定义KEY值动态切换正真的DataSource。具体实现创建测试库、表:createdatabase`mytest_db`;CREATETABLE`t_user`(`id`int(11)NOTNULLAUTO_INCREME
Spring Boot + MyBatis + MySQL 实现读写分离
2301_79099287
程序员springbootmybatismysql
spring-boot-starter-testtestorg.springframework.bootspring-boot-maven-plugin3.2.数据源配置application.ymlspring:datasource:master:jdbc-url:jdbc:mysql://192.168.102.31:3306/testusername:rootpassword:123456d
Spring Boot 配置 Mybatis 读写分离
xiaoyao888
springbootmybatisjavamybatis读写分离spring读写分离
JPA的读写分离配置不能应用在Mybatis上,所以Mybatis要单独处理为了不影响原有代码,使用了增加拦截器的方式,在拦截器里根据SQL的CRUD来路由到不同的数据源需要单独增加Mybatis的配置@ConfigurationpublicclassMyBatisConfig{ @Bean publicSqlSessionFactorysqlSessionFactory(DataSource
Mybatis中的Dao接口工作原理
扯淡吧 Pino曹
mybatissqljava
简要概述一下Mybatis中的Dao接口工作原理Dao接口就是Mapper接口。接口的全限名就是映射文件中的namespace的值接口的方法名就是映射文件中的MappedStatement的id值接口方法内的参数,就是传递给sql的参数。Mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为key值,可唯一定位一个MappedStatement。Dao接口的工作原理是J
Mybatis中#{}和${}的用法
光阴不负卿
javamybatisMySQLjavasqlmybatis
1、#{}将传入的数据当作一个字符串,会对传入的数据加上一个双引号。比如,select*fromstudentwherestudent_name=#{studentName}如果传入的值为xiaoming,那么解析成sql的值为student_name="xiaoming"。2、${}将传入的数据直接显示生成在sql中。如:select${fieldNmae}fromstudentwherestu
MyBatis常见知识点
2301_80148369
mybatis
#{}和${}的区别是什么?答:${}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于原样文本替换,可以替换任意内容,比如${driver}会被原样替换为com.mysql.jdbc.Driver。一个示例:根据参数按任意字段排序:select*fromusersorderby${orderCols}orderCols可以是name、namedesc、name,se
【课程设计】Java EE SSM 试卷管理系统
鱼弦
课程设计java-eejava
JavaEESSM试卷管理系统简介试卷管理系统是一个用于教育机构、培训中心等单位的在线考试和评估工具。该系统帮助教师管理考试题目、生成试卷,并将试卷导出为Word文档。应用使用场景学校与教育机构:用于日常测验、期中和期末考试。企业培训:用于员工技能测试和评估。在线教育平台:用于提供学生练习题和模拟考试。原理解释架构系统基于JavaEE开发,采用了Spring、SpringMVC和MyBatis(S
LambdaQueryWrapper的使用
java
原文链接项目GitHub地址:https://github.com/Snowstorm0/learn-lambda-query-wrapper项目Gitee地址:https://gitee.com/Snowstorm0/learn-lambda-query-wrapper1添加maven依赖在pom中添加如下依赖:com.baomidoumybatis-plus-boot-starter3.5.3
2月第二讲:mybatis是如何识别分表位的
2501_90442144
mybatis
带着问题,我花了不少时间深入了读了一下这部分的源码,终于搞清楚了,借本文分享一下。本文主要环境是mybatis-plus-boot-starter3.4.3,不过用的基本上仍然是mybatis的特性。流程图以查询为例,可以先看下流程图,大致了解一下整个过程。关键的类和对象在流程图里出现了一些类和其实例化的对象,有必要选其中关键的介绍一下。MappedStatement类全名org.apache.i
【MyBatis】如何在数据插入后获取对应的主键 ID
程序员谷美
Java实战MyBatismybatisjava数据库
在数据库操作中,我们经常需要在插入数据后立即获取生成的主键ID。这种需求在需要维护关联表数据或进行后续业务处理时尤为常见。本文将深入探讨MyBatis中获取插入主键的多种实现方式,并解析其底层原理及性能影响。一、单条数据插入获取ID1.useGeneratedKeys方式(推荐)INSERTINTOuser(name,age)VALUES(#{name},#{age})原理:通过JDBC的Stat
详细的讲解mybtis中动态标签有哪些和他的作用
胡图蛋.
java服务器前端
MyBatis提供了丰富的动态标签,这些标签能让开发者根据不同的条件动态生成SQL语句,极大地增强了SQL语句的灵活性和可维护性。以下是对MyBatis中常见动态标签的详细讲解:1.标签功能:标签是最基础且常用的动态标签,它用于条件判断。根据传入参数的不同情况,决定是否将某部分SQL语句添加到最终生成的SQL中。使用方式:通过test属性指定一个OGNL(对象图导航语言)表达式,当该表达式的结果为
讲解下MySql的外连接查询在SpringBoot中的使用情况
陈老师还在写代码
SpringBoot100问mysqlspringboot数据库
在SpringBoot中使用MySQL的外连接查询时,通常通过JPA、MyBatis或JDBC等持久层框架来实现。外连接查询主要用于从多个表中获取数据,即使某些表中没有匹配的记录。外连接分为左外连接(LEFTJOIN)、右外连接(RIGHTJOIN)和全外连接(FULLJOIN),MySQL不支持全外连接。1.左外连接(LEFTJOIN)左外连接返回左表中的所有记录,即使右表中没有匹配的记录。如果
最新计算机专业开题报告案例84:基于Springboot框架的校园点餐系统的设计与实现
平姐设计
微信小程序项目实战java项目实战计算机毕业设计开题报告100套springbootjava校园点餐管理系统餐厅管理在线支付开题报告国内外研究现状
计算机毕业设计100套微信小程序项目实战java项目实战需要源码可以滴滴我请文末卡片dd我获取更详细的演示视频撰写不易,感谢支持!目录一、研究背景和意义1.1研究背景1.2研究意义二、国内外研究状况2.1后端技术2.1.1基于SpringBoot的校园点餐系统设计与实现2.1.2基于SpringMVC的校园点餐系统设计与实现2.1.3基于Mybatis的校园点餐系统设计与实现2.2前端技术2.2.
Mybatis源码05 - Mapper映射文件的配置
是小崔啊
#mybatis源码mybatis数据库java源码
Mapper映射文件的配置文章目录Mapper映射文件的配置一:更新的配置和使用1:模板mapper2:实例说明二:select、resultMap的配置及使用1:select的配置2:实例说明3:resultMap4:字符串代入法和SQL注入三:子元素解析1:子元素cache解析2:子元素cache-ref解析3:子元素resultMap解析4:子元素sql解析5:子元素statement解析5
Mybatis-SQL-Viewer技术文档
彭锟晋Rita
Mybatis-SQL-Viewer技术文档mybatis-sql-viewerconvertmybatisxmltosqlstatement;mybatisparammock;sqlspecificationcheck;sqlindexcheck;sqlexecution;sqlstress;mybatissqlscan项目地址:https://gitcode.com/gh_mirrors/my
MybatisPlusCRUD接口使用
cwtlw
java开发语言springbootmysql
1.MybatisPlus的CRUD接口MybatisPlus提供了很多CRUD接口,可以直接使用这些接口来操作数据库。而不用像Mybatis那样写大量的XML文件及SQL语句。MapperCRUD接口主要关键是继承BaseMapper,其中T是实体类。使用案例Mapper层继承BaseMapper接口@MapperpublicinterfaceStudentMapperextendsBaseMa
JavaWeb学习-Mybatis(增删改查)
半截詩
JavaWeb学习mybatis
(一)Mybatis入门程序1.创建springboot工程,并导入mybatis的起步依赖、mysql的驱动包。(项目工程创建完成后,自动在pom.xml文件中,导入Mybatis依赖和MySQL驱动依赖)org.mybatis.spring.bootmybatis-spring-boot-starter2.3.0com.mysqlmysql-connector-jruntimeorg.spri
JAVA架构师需要掌握的常用架构模式有哪些?
猿享天开
Java开发从入门到精通java架构开发语言
引言Java架构师必须掌握常用技术组合及其选型逻辑。技术组合的选择直接影响系统的可扩展性、性能和维护成本。以下是当前主流技术组合、选型原则及常用架构应用的详细说明:一、当前主流技术组合及其应用场景1.基础开发框架技术组合应用场景核心优势SpringBoot+MyBatis+MySQL中小型单体应用、快速迭代业务开发效率高、ORM轻量、数据库兼容性强SpringBoot+JPA+PostgreSQL
spring项目中读取类路径下文件的方式
初夏の猫
springjavasql
//1.Class.getResourceAsStream()InputStreaminputStream=LoadConfigUtil.class.getResourceAsStream("/mybatis-config.xml");//2.ClassPathResourcefontResource=newClassPathResource("fonts/msyh.ttf");InputStre
【基于SprintBoot+Mybatis+Mysql】电脑商城项目之获取省市区列表名称及收货地址列表展示
安清h
电脑商城项目mybatismysql数据库spring后端
安清h:个人主页个人专栏:【Spring篇】【计算机网络】【Mybatis篇】作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。目录1.获取省市区列表-创建数据表2.获取省市区列表-实体类3.获取省市区列表-持久层✨3.1规划SQL语句✨3.2接口设计和抽象方法的实现4.获取省市区列表-业务层5.获取省市区列表-控制层✨5.1设计请求✨5.2处理请求6.获取省市区列表-
jQuery 键盘事件keydown ,keypress ,keyup介绍
107x
jsjquerykeydownkeypresskeyup
本文章总结了下些关于jQuery 键盘事件keydown ,keypress ,keyup介绍,有需要了解的朋友可参考。
一、首先需要知道的是: 1、keydown() keydown事件会在键盘按下时触发. 2、keyup() 代码如下 复制代码
$('input').keyup(funciton(){
AngularJS中的Promise
bijian1013
JavaScriptAngularJSPromise
一.Promise
Promise是一个接口,它用来处理的对象具有这样的特点:在未来某一时刻(主要是异步调用)会从服务端返回或者被填充属性。其核心是,promise是一个带有then()函数的对象。
为了展示它的优点,下面来看一个例子,其中需要获取用户当前的配置文件:
var cu
c++ 用数组实现栈类
CrazyMizzz
数据结构C++
#include<iostream>
#include<cassert>
using namespace std;
template<class T, int SIZE = 50>
class Stack{
private:
T list[SIZE];//数组存放栈的元素
int top;//栈顶位置
public:
Stack(
java和c语言的雷同
麦田的设计者
java递归scaner
软件启动时的初始化代码,加载用户信息2015年5月27号
从头学java二
1、语言的三种基本结构:顺序、选择、循环。废话不多说,需要指出一下几点:
a、return语句的功能除了作为函数返回值以外,还起到结束本函数的功能,return后的语句
不会再继续执行。
b、for循环相比于whi
LINUX环境并发服务器的三种实现模型
被触发
linux
服务器设计技术有很多,按使用的协议来分有TCP服务器和UDP服务器。按处理方式来分有循环服务器和并发服务器。
1 循环服务器与并发服务器模型
在网络程序里面,一般来说都是许多客户对应一个服务器,为了处理客户的请求,对服务端的程序就提出了特殊的要求。
目前最常用的服务器模型有:
·循环服务器:服务器在同一时刻只能响应一个客户端的请求
·并发服务器:服
Oracle数据库查询指令
肆无忌惮_
oracle数据库
20140920
单表查询
-- 查询************************************************************************************************************
-- 使用scott用户登录
-- 查看emp表
desc emp
ext右下角浮动窗口
知了ing
JavaScriptext
第一种
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/
浅谈REDIS数据库的键值设计
矮蛋蛋
redis
http://www.cnblogs.com/aidandan/
原文地址:http://www.hoterran.info/redis_kv_design
丰富的数据结构使得redis的设计非常的有趣。不像关系型数据库那样,DEV和DBA需要深度沟通,review每行sql语句,也不像memcached那样,不需要DBA的参与。redis的DBA需要熟悉数据结构,并能了解使用场景。
maven编译可执行jar包
alleni123
maven
http://stackoverflow.com/questions/574594/how-can-i-create-an-executable-jar-with-dependencies-using-maven
<build>
<plugins>
<plugin>
<artifactId>maven-asse
人力资源在现代企业中的作用
百合不是茶
HR 企业管理
//人力资源在在企业中的作用人力资源为什么会存在,人力资源究竟是干什么的 人力资源管理是对管理模式一次大的创新,人力资源兴起的原因有以下点: 工业时代的国际化竞争,现代市场的风险管控等等。所以人力资源 在现代经济竞争中的优势明显的存在,人力资源在集团类公司中存在着 明显的优势(鸿海集团),有一次笔者亲自去体验过红海集团的招聘,只 知道人力资源是管理企业招聘的 当时我被招聘上了,当时给我们培训 的人
Linux自启动设置详解
bijian1013
linux
linux有自己一套完整的启动体系,抓住了linux启动的脉络,linux的启动过程将不再神秘。
阅读之前建议先看一下附图。
本文中假设inittab中设置的init tree为:
/etc/rc.d/rc0.d
/etc/rc.d/rc1.d
/etc/rc.d/rc2.d
/etc/rc.d/rc3.d
/etc/rc.d/rc4.d
/etc/rc.d/rc5.d
/etc
Spring Aop Schema实现
bijian1013
javaspringAOP
本例使用的是Spring2.5
1.Aop配置文件spring-aop.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmln
【Gson七】Gson预定义类型适配器
bit1129
gson
Gson提供了丰富的预定义类型适配器,在对象和JSON串之间进行序列化和反序列化时,指定对象和字符串之间的转换方式,
DateTypeAdapter
public final class DateTypeAdapter extends TypeAdapter<Date> {
public static final TypeAdapterFacto
【Spark八十八】Spark Streaming累加器操作(updateStateByKey)
bit1129
update
在实时计算的实际应用中,有时除了需要关心一个时间间隔内的数据,有时还可能会对整个实时计算的所有时间间隔内产生的相关数据进行统计。
比如: 对Nginx的access.log实时监控请求404时,有时除了需要统计某个时间间隔内出现的次数,有时还需要统计一整天出现了多少次404,也就是说404监控横跨多个时间间隔。
Spark Streaming的解决方案是累加器,工作原理是,定义
linux系统下通过shell脚本快速找到哪个进程在写文件
ronin47
一个文件正在被进程写 我想查看这个进程 文件一直在增大 找不到谁在写 使用lsof也没找到
这个问题挺有普遍性的,解决方法应该很多,这里我给大家提个比较直观的方法。
linux下每个文件都会在某个块设备上存放,当然也都有相应的inode, 那么透过vfs.write我们就可以知道谁在不停的写入特定的设备上的inode。
幸运的是systemtap的安装包里带了inodewatch.stp,位
java-两种方法求第一个最长的可重复子串
bylijinnan
java算法
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class MaxPrefix {
public static void main(String[] args) {
String str="abbdabcdabcx";
Netty源码学习-ServerBootstrap启动及事件处理过程
bylijinnan
javanetty
Netty是采用了Reactor模式的多线程版本,建议先看下面这篇文章了解一下Reactor模式:
http://bylijinnan.iteye.com/blog/1992325
Netty的启动及事件处理的流程,基本上是按照上面这篇文章来走的
文章里面提到的操作,每一步都能在Netty里面找到对应的代码
其中Reactor里面的Acceptor就对应Netty的ServerBo
servelt filter listener 的生命周期
cngolon
filterlistenerservelt生命周期
1. servlet 当第一次请求一个servlet资源时,servlet容器创建这个servlet实例,并调用他的 init(ServletConfig config)做一些初始化的工作,然后调用它的service方法处理请求。当第二次请求这个servlet资源时,servlet容器就不在创建实例,而是直接调用它的service方法处理请求,也就是说
jmpopups获取input元素值
ctrain
JavaScript
jmpopups 获取弹出层form表单
首先,我有一个div,里面包含了一个表单,默认是隐藏的,使用jmpopups时,会弹出这个隐藏的div,其实jmpopups是将我们的代码生成一份拷贝。
当我直接获取这个form表单中的文本框时,使用方法:$('#form input[name=test1]').val();这样是获取不到的。
我们必须到jmpopups生成的代码中去查找这个值,$(
vi查找替换命令详解
daizj
linux正则表达式替换查找vim
一、查找
查找命令
/pattern<Enter> :向下查找pattern匹配字符串
?pattern<Enter>:向上查找pattern匹配字符串
使用了查找命令之后,使用如下两个键快速查找:
n:按照同一方向继续查找
N:按照反方向查找
字符串匹配
pattern是需要匹配的字符串,例如:
1: /abc<En
对网站中的js,css文件进行打包
dcj3sjt126com
PHP打包
一,为什么要用smarty进行打包
apache中也有给js,css这样的静态文件进行打包压缩的模块,但是本文所说的不是以这种方式进行的打包,而是和smarty结合的方式来把网站中的js,css文件进行打包。
为什么要进行打包呢,主要目的是为了合理的管理自己的代码 。现在有好多网站,你查看一下网站的源码的话,你会发现网站的头部有大量的JS文件和CSS文件,网站的尾部也有可能有大量的J
php Yii: 出现undefined offset 或者 undefined index解决方案
dcj3sjt126com
undefined
在开发Yii 时,在程序中定义了如下方式:
if($this->menuoption[2] === 'test'),那么在运行程序时会报:undefined offset:2,这样的错误主要是由于php.ini 里的错误等级太高了,在windows下错误等级
linux 文件格式(1) sed工具
eksliang
linuxlinux sed工具sed工具linux sed详解
转载请出自出处:
http://eksliang.iteye.com/blog/2106082
简介
sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾
Android应用程序获取系统权限
gqdy365
android
引用
如何使Android应用程序获取系统权限
第一个方法简单点,不过需要在Android系统源码的环境下用make来编译:
1. 在应用程序的AndroidManifest.xml中的manifest节点
HoverTree开发日志之验证码
hvt
.netC#asp.nethovertreewebform
HoverTree是一个ASP.NET的开源CMS,目前包含文章系统,图库和留言板功能。代码完全开放,文章内容页生成了静态的HTM页面,留言板提供留言审核功能,文章可以发布HTML源代码,图片上传同时生成高品质缩略图。推出之后得到许多网友的支持,再此表示感谢!留言板不断收到许多有益留言,但同时也有不少广告,因此决定在提交留言页面增加验证码功能。ASP.NET验证码在网上找,如果不是很多,就是特别多
JSON API:用 JSON 构建 API 的标准指南中文版
justjavac
json
译文地址:https://github.com/justjavac/json-api-zh_CN
如果你和你的团队曾经争论过使用什么方式构建合理 JSON 响应格式, 那么 JSON API 就是你的 anti-bikeshedding 武器。
通过遵循共同的约定,可以提高开发效率,利用更普遍的工具,可以是你更加专注于开发重点:你的程序。
基于 JSON API 的客户端还能够充分利用缓存,
数据结构随记_2
lx.asymmetric
数据结构笔记
第三章 栈与队列
一.简答题
1. 在一个循环队列中,队首指针指向队首元素的 前一个 位置。
2.在具有n个单元的循环队列中,队满时共有 n-1 个元素。
3. 向栈中压入元素的操作是先 移动栈顶指针&n
Linux下的监控工具dstat
网络接口
linux
1) 工具说明dstat是一个用来替换 vmstat,iostat netstat,nfsstat和ifstat这些命令的工具, 是一个全能系统信息统计工具. 与sysstat相比, dstat拥有一个彩色的界面, 在手动观察性能状况时, 数据比较显眼容易观察; 而且dstat支持即时刷新, 譬如输入dstat 3, 即每三秒收集一次, 但最新的数据都会每秒刷新显示. 和sysstat相同的是,
C 语言初级入门--二维数组和指针
1140566087
二维数组c/c++指针
/*
二维数组的定义和二维数组元素的引用
二维数组的定义:
当数组中的每个元素带有两个下标时,称这样的数组为二维数组;
(逻辑上把数组看成一个具有行和列的表格或一个矩阵);
语法:
类型名 数组名[常量表达式1][常量表达式2]
二维数组的引用:
引用二维数组元素时必须带有两个下标,引用形式如下:
例如:
int a[3][4]; 引用:
10点睛Spring4.1-Application Event
wiselyman
application
10.1 Application Event
Spring使用Application Event给bean之间的消息通讯提供了手段
应按照如下部分实现bean之间的消息通讯
继承ApplicationEvent类实现自己的事件
实现继承ApplicationListener接口实现监听事件
使用ApplicationContext发布消息
按字母分类:
ABCDEFGHIJKLMNOPQRSTUVWXYZ其他
首页 -
关于我们 -
站内搜索 -
Sitemap -
侵权投诉
版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.