mybatis的sql配置文件
‘壹’ mybatis基本配置详解
中间步骤自行设置
Mysql驱动版本根据自己安装的MySQL选择
我把AppTest改成了MybatisTest,不该也无妨;
其中Student类暂时只设置四个字段:
mapper接口暂时为空
在resources目录下新建File命名为db.peoperties,配置如下内容:
提示:以上配置适用于MySQL8.X版本,5.X版本按照如下配置:
1、transactionManager:事务管理器;
type 事务管理类型:
JDBC(JdbcTransactionFactory);
MANAGED(ManagedTransactionFactory)
自定义事务管理器:实现TransactionFactory接口.type指定为全类名
2、dataSource:数据源;
type :数据源类型;
UNPOOLED(UnpooledDataSourceFactory); POOLED(PooledDataSourceFactory);
JNDI(JndiDataSourceFactory)
自定义数据源:实现DataSourceFactory接口,type是全类名
<mapper>:注册一个sql映射文件
1、注册映射文件
resource:引用类路径下的sql映射文件
mybatis/StudentMapperpper.xml
url:引用网路路径或者磁盘路径下的sql映射文件
file:///var/mappers/AuthorMapper.xml
2、注册接口
class:引用(注册)接口,
① 有sql映射文件,映射文件名必须和接口同名,并且放在与接口同一目录下;
② 没有sql映射文件,所有的sql都是利用注解写在接口上;
推荐:
比较重要的,复杂的Dao接口我们来写sql映射文件
不重要,简单的Dao接口为了开发快速可以使用注解;
批量注册
需要在资源路径下(resources)建立和一样的文件目录来存放想xml映射文件,如:com.example.StudentMapperpper.xml
StudentMapper
在resources的mybatis目录下新建文件夹mapper,新建xml文件StudentMapper.xml
namespace :名称空间;指定为接口的全类名
id :唯一标识
resultType :返回值类型
#{id} :从传递过来的参数中取出id值
resources目录(MajorMapper.xml暂时不用创建)如下:
‘贰’ mybatis-plus日志输出sql配置(控制台能输出sql日志没有sql问题)
看下spring boot配置文件中的mybatis部分
一般配置debug级别日志,基本日志都能输出了,之前配置,这个是标准的输出,控制台正常输出,但是不会写到日志文件中,所以一旦上传测试或生产,自动过滤sql部分日志
但是我们也希望在测试环境也能看
改成如下配置
另外日志级别改为debug,可以直接
就整体都是debug了
如果需要局部控制,可以配置多个level
只要是com.xxxx,com.aaa下的日志输出均是debug
‘叁’ 在spring的配置文件 怎么加载mybatis的sql配置文件
首先事务不是根据是不是返缓service层而关闭的,而是你开启的session什么时候用完 在哪个层用完就关闭。而一般情况下都是漏链模在事务配置文件里的前缀方法名 如: 这种在service层调用saveXXX方法时唤氏候 这个方法就被事务管理
‘肆’ MyBatis Generator 配置文件详解 之 table 元素
相关链接: MyBatis Generator 配置文件详解
此篇主要说明 MyBatis Generator 配置文件详解 中的 table 元素,有关 MyBatis Generator 配置文件详解 的其他内容请移步: MyBatis Generator 配置文件详解
table 元素用来配置要通过内省的表。只有配置的才会生成实体类和其他文件。有一个必选属性(tableName)指定要生成的表名,可以使用SQL通配符匹配多个表。例如要生成全部的表,可以按如下配置:
table 元素包含多个可选属性:
该元素包含多个可用的<property>子元素,可选属性为:
除了<property>子元素外,<table>还包含以下子元素:
后面的小节对这4个元素进行详细讲解。
这个元素是可选的,最多可以配置一个。
这个元素用来指定自动生成主键的属性(identity字段或者sequences序列)。如果指定这个元素,MBG在生成insert的SQL映射文件中插入一个<selectKey>元素。 这个元素 非常重要 ,这个元素包含下面两个必选属性:
这个元素还包含两个可选属性:
该元素是可选的,最多可以配置一个,使用该元素可以在生成列之前,对列进行重命名。这对那些存在同一前缀的字段想在生成属性名时去除前缀的表非常有用。 例如假设一个表包含以下的列:
生成的所有属性名中如果都包含CUST的前缀可能会让人不爽。这些前缀可以通过如下方式定义重命名规则:
注意,在内部,MBG使用镇销java.util.regex.Matcher.replaceAll方法实现这个功能。 请参阅有关该方法的文档和在Java中使用正则表达式的例子。
当<columnOverride>匹配一列时,这个元素(<columnRenamingRule>)会被忽略。<columnOverride>优先于重命名的规则。
该元素御贺游有一个必选属性(searchString):定义将被替换的字符串的正则表达式。
该元素有一个可选属性(replaceString):这是一个用来替换搜索字符串行每一个匹配项的字符串。如果没有指定,就会使用空字符串。
关于<table>的<property>属性useActualColumnNames对此的影响可以查看完整文档。
该元素可选,可以配置多个。该元素将某些属性默认计算的值更改为指定的值。
该元素有一个必选属性(column):要重写的列名。
该元素有多个可选属性:
配置示例:
该元素可选,可以配置多个。该元素可以用来屏蔽不需要生成的列。
该元素有一个必选属性(column):要忽略的列名。
该元素还有一个可选属性(delimitedColumnName):匹配列名的时候是否区分大小写。如拍迟果为true则区分。默认值为false,不区分大小写。
‘伍’ mybatis原理
MyBatis 的工作原理:读取 MyBatis 配置文件、加载映射文件、构造会话工厂、创建会话对象、Executor 执行器、输入参数映射、输出结果映射。
mybatis原理具体介绍如下:
1、读取 MyBatis 配置文件:
mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。
2、加载映射文件:
映射文件即 SQL 映射文件,该文件中配置了操作数据库的 SQL 语句,需要在 MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。
3、构造会话工厂:
通过 MyBatis 的环境等配置信息谨举构建会话工厂 SqlSessionFactory。
4、创建会话对象:
由会话工厂创建 SqlSession 对象,该对拿晌哪象中包含了执行 SQL 语句的所有方法。
5、Executor 执行器:
MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 SqlSession 传递消码的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。
8、输出结果映射:
输出结果类型可以是 Map、 List 等集合类型,也可以是基本数据类型和 POJO 类型。输出结果映射过程类似于 JDBC 对结果集的解析过程。
‘陆’ mybatis配置文件里怎么格式化sql
第一步:新建一个java项目。
‘柒’ Mybatis中如何实现批量数据的插入,请写出配置文件的配置信息以及Java代码的源
MyBatis提供用于插入数据的注解有两个:@insert,@InsertProvider,类似还有:@DeleteProvider@UpdateProvider,和@SelectProvider,
作用:
用来在实体类的Mapper类里注解保存方法的SQL语句
区别:
@Insert是直接配置SQL语句,而@InsertProvider则是通过SQL工厂类及对应的方法生产SQL语句,这种方法的好处在于,我们可以根据不同的需求生产出不同的SQL,搏昌州适用性更好。
使用:
@Insert
@Insert(“insert into blog(blogId,title,author) values(#blogId,#title,#author)”)
public boolean saveBlog(Blog blog);
@InsertProvider
在mapper接口中的方法上使用@InsertProvider注解:
参数解释:
type为工厂类的类对象,
method为对应的工厂类中的方基蔽法,方法中的@Param(“list”)是因为迅宴批量插入传入的是一个list,但是Mybatis会将其包装成一个map。其中map的key为“list”,value为传入的list。
‘捌’ 谁能跟我解释一下Mybatis配置文件中这些语句的含义最好帮我把里面标签含义说出来就行了
typeAliases标签碰告裂 是写实体类的别笑闭名,写了之后可以在写Sql配置文件例如<select>标签中的属性就可以不用写实体的具体路径直接用别名就可以了,可以简化代码给你看个例子:友唤没有别名这样写<select resultType="com.sjh.entity.VoteUser"> 写了别名就可以这样写<select resultType="VoteUsers"> 直接写别名就可以不用再写实体的路径了,VoteUsers就能在任何地方代替“com.sjh.entity.VoteUser”被使用。如果很多属性涉及到实体类,直接写别名很方便的。你说你删了程序照样跑,写配置的时候你一定是没有应用到别名,都写得实体路径。希望通过我的一番解释你能明白这个标签的用途。
‘玖’ mybatis各阶段的详解
比如我们在引入了jdbc的配置文件使用了properties标签,引入jdbc有什么好处?,可以在配置文件中统一管理
内容而不是在很多个文件改来改去,而且在核心配置文件中把数据库连接相关的写死,显然是硬编码的所以我们用配置文件代替 nice!!!
你可能注意到了上面的写法 用前缀jdbc. 可以很好地将他们与其他的变量区分开,(可以从名字很容易看出是jdbc相关的数据,不至于和同名变量搞混因为username这种可能
不止会出洞亏现在数据库的连接)
上面的代码中引入配置文件的部分为
可以从上面看到写法:
下面这段就是用来设置类的别名:
那么问题来了,为什么要有类的别名这种操作??
因为在映射文件中每次都要写全类名显然有点麻烦比如下面这样:纳谨神
一个项目是会有很多个映射文件的为了方便,所以类别名就出现了。可以在核心配置文件写接口类和对应的别名
这样就可以在映射文件的命名空间里可以直接写User(对大小没有要求也可以是user; 其实可以比这更加简单,也是我们在实际开发中常用的写法
就是将整个包写成别名的形式,如果不写alias属性默认为类名(不区分大小写),这样就容易多了,我们只需一行代码,便可以在所有的映射文件命名空间
中直接写对应的类名
引入核心的配置文件
首先需晌兄要思考的这里是映射文件的引入,我们正常的一个项目的数据库是有很多个表组成的那么每一张表对应一个mapper接口,每个接口对应一个映射文件,那么就需要导入大量的映射文件,还容易漏掉-->
上面这种以包的形式的导入非常方便,不用每次新建一个接口就要导入它的映射文件,但是上面这种写法需要 注意 一些问题:
如果你在映射文件中编写查询语句的sql,但是粗心的你忘记了设置返回类型会在控制台抛异常且会看到这样的说明:
It's likely that neither a Result Type nor a Result Map was specified.
下面只是指定返回类型的一种方式:resultType,还有 resultMap
它们的区别:
查询的标签必须指定resultType或resultMap
com.kobe.mybatis 获取参数的两种方式:${} 和 #{}
上面是使用了 #{}写法相当于原生jdbc的占位符,这个前面已经提到过了所以不多赘述, 需要注意的是#{}里面的变量名可以是任意的username规范显然很好,但是aaaa也没错因为只是用来占位的;
还有就是在使用${}时注意''单引号问题,因为${}是字符拼接的方式,所以需要注意!!
传输参数时有多个参数时
在测试代码里通过传入两个参数分别为 username和password 但是在上面代码的(映射文件里的部分代码)执行失败,(sql语句未能解析)
报错:
Cause: org.apache.ibatis.binding.BindingException: Parameter 'username' not found. Available parameters are [arg1, arg0, param1, param2]
可以从错误提示的信息不难发现我们的参数在映射文件里未能真正地接受到,可以用[arg1, arg0, param1, param2] 的方式获取,mybatis将参数放到map容器可以通过建arg0,agr1..的方式
获取参数(也可以是param1,param2..)
将上面的代码改动:
需要注意的是:使用${}时需要手动添加''才能正常访问,因为他的处理方式是字符串的拼接
做了改动之后结果很感人!!
User{id=6, userName='旺财', age=20, password='cwlz'}
可以直接通过键访问相对应的值(通过自己的方式访问到数据,上面的形式是mybatis默认提供的map和mybatis默认的提取指的方式 arg0,arg2...)
当需要传多个参数时将他们放到一个map容器,然后将map传给对应的方法(模拟mybatis的做法,就可以在sql语句中直接通过键访问到值)代码如下:
映射文件中的部分代码 :
通过键直接获取值,注意:使用${}时不要忘了单引号!!!!
当参数以实体对象的形式传参时如何解决?
只需要通过#{}以属性名的方式访问!
所以代码的编写一定要规范,才能减少这种错误!!!
一定要和注解中的参数名一一对应!!!
如果查询的结果只有一个,也可以通过Map集合接收,字段名为键字段的值为值:{password=0000, id=3, userName=图区, age=20}
java.lang.Ingeger --> int ,Integer
int --> _int,_Integer
Map --> map
String --> string
注意:
所以在批量删除的案例:需要注意的是不能使用#{} 因为它是会自动添加'' 所以在批量删除的语句中我们要使用${}
若字段和属性名不一致 ,则可以通过resultMap设置自定义映射
在mybatis的核心配置文件用下面的代码将 数据库中命名的规范 (user_name) 转换为 java中的命名规范 (userName)
就是手动设置属性与字段的映射关系:
如果设置了手动的设置属性和字段的映射关系,注意主键使用 id 标签,普通字段使用 result标签,就算属性和字段名一一对应,只要
用了这种方式就 必须要写全 !!!
一对多的查询:
通过分步查询实现:
多条件的查询
if 根据标签中test的属性所对应的表达式决定标签中的内容是否拼接到sql语句中
上面的where后面的 1=1 是细节,因为当where后面的条件都为空时就成了 select * from t_user where
显然这种sql语句是有问题的,还有一种情况就是当userName为null时语句就成了 select * from t_user where and age=#{age}
这也是错的,所以在where后加一个恒成立的条件不仅不会影响查询结果,而且没有会在特定情况时sql语句是会报错的所以很有必要
where 当where标签中有内容时,会自动生成where关键字,并且将内容前多余的and 或者or去掉
当where中没有内容时,此时where标签没有任何效果 就是不会生成关键字 注意:在写条件时不能在后面加and or 这个在下一条语句无效时mybatis不会帮你去掉!
相当于 if else
一个案例 -->就是当我们需要批量删除一些东西时(参数以数组的形式传入)
sql 片段: 在我们的查询语句不能在实际开发中也一直写 *;因为我们要按需查找,不必将不需要的也查询出来,我们可以将我们平常查询次数较多的字段
放在sql片段内,可以在需要查询时直接进行引用!
缓存,这个术语我们听过很多次,在web阶段时访问网页时有缓存机制!
现在sql的查询时也有缓存机制,有一级缓存,一级缓存是默认开启的,一级缓存的范围时sqlSession,将我们查询到的数据先进行缓存,若下次有相同的查询时不用重新
访问数据库,可以直接从缓存中取出!!!!
手动清空缓存 sqlSession.clearCache();
在mapper配置文件中添加cache标签可以设置一些属性:
逆向工程就是不难理解,我们之前都是由实体类到数据库,而逆向类就是通过数据库表生成实体类,
‘拾’ mybatis中的sql语句完整配置文件怎么写
Mybatis 分多个配置文件方法,考虑一个项目会很多模块,如果团体开发的话用不同模块在不同的配置文件可以这样实现: 标签里面只能放SQL映射文件 Mybatis配置文件 XML code Spring里面的配置文件XML code。 当你程序需要执行的时候