mybatis----基础
基础知识
- 安装
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>x.x.x</version> </dependency>
对原生态jdbc程序中问题总结
- 环境
java环境:jdk
- jdbc程序
使用jdbc查询mysql数据库中用户表的记录
- 问题总结
- 数据库连接、使用时创建、不使用时就立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能(使用连接池管理数据库来连接进行优化)
- 将sql语句硬编码到Java代码中,如果sql语句修改,需要重新编译代码,不利于系统维护(将sql语句配置在xml配置文件中,即使sql变化,也不需要对java代码进行重新编译)
- 向preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在Java代码中,不利于系统维护(将sql语句及占位符号和参数全部配置在xml中)
- 从resultSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,不利于系统维护(将查询的结果集,自动映射成java对象。)
mybatis是什么
mybatis是一个持久层框架,是apache下的顶级项目。
mybatis是让程序员将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活的生成(半自动化,大部分需要程序员编写sql)满足需要的sql语句
mybatis可以将向preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象(输出映射)
mybatis框架
SqlMapConfig.xml 是mybatis的全局配置文件,配置了数据源、事务等mybatis运行环境(第三方软件进行配置)
mybatis自己还需要配置映射文件(mapper.xml、mapper.xml、mapper.xml……【映射文件】)也就是配置sql语句
SqlSessionFactory(会话工厂),根据配置文件创建工厂 作用:创建SqlSession
SqlSession(会话),是一个接口,面向用户(程序员)的接口 作用:操作数据库(发出增、删、改、查)
Executor(执行器),也是一个接口(基本执行器、缓存执行器) 作用:操作数据库(发出增、删、改、查)
mapped statement(底层封装对象) 作用:对操作数据库存储封装,包括sql语句,输入参数、输出结果类型
入门程序
- 编写
log4j.properties
进行日志输出
# Global logging configuration #在开发环境下日志级别要设置成DEBUG,生成环境设置成info或ERROR log4j.rootLogger=DEBUG, stdout # MyBatis logging configuration... log4j.logger.org.mybatis.example.BlogMapper=TRACE # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
- 编写全局配置
SqlMapConfig.xml
- 映射文件
- 映射文件命名
User.xml(原始mybatis命名),mapper代理开发映射文件叫xxxMapper.xml,比如:UserMapper.xml 在映射文件中配置sql语句
#{}与${}
- #{} 表示一个占位符,#{}接受输入参数,类型可以是简单的类型,pojo、hashmap。
如果接受简单类型,#{}中可以写成value或其他名称
#{}接受pojo对象值,通过OGNL读取对象中的属性值,通过属性。属性。属性……的方式获取对象属性值 - ${} 表示一个拼接符号,会引起sql注入,所以不建议使用
${}接受输入参数,类型可以是简单的类型,pojo、hashmap。
如果接受简单类型,${}中只可以写成value
parameterType、resuletType
parameterType : 指定输入参数的类型
resuletType : 指定输出参数的类型
自增主键返回
mysql自增主键,执行insert提交之前自动生成一个自增主键。
通过mysql函数获取到刚插入记录的自增主键:LAST_INSERT_ID()
是在insert之后调用此函数,需要修改UserInsert的定义
<insert id=“insertUser” parameter="cn.persist.entily.User"> <!-- 将插入数据的主键返回,返回到user对象中 SELECT LAST_INSERT_ID():得到刚insert进去的记录的主键的值,只适用于自增主键 KeyProperty:将查询到的主键值parameterType指定的对象的哪个属性 order:SELECT LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序 resultType:指定SELECT LAST_INSERT_ID()的结果类型 --> <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Inteager"> SELECT LAST_INSERT_ID() </selectKey> <!-- username,password,address是数据表中的对应的字段名称 #{username},#{password},#{address}是实体类中对应的属性名 --> INSERT into user(username,password,address) value(#{username},#{password},#{address}) </insert>
非自增主键返回(使用uuid)
使用mysql的uuid()函数生成主键,需要修改表中id字段类型为string,长度设置成35位
执行思路:
先通过uuid()查询到主键,将主键输入到sql语句中
执行uuid()语句顺序相对于insert语句之前执行
<insert id=“insertUser” parameter="cn.persist.entily.User"> <!-- 使用mysql的uuid()生成主键 执行过程: 首先通过uuid()得到主键,将主键设置到user对象的id属性中 其次在insert执行时,从user对象中取出id属性值 --> <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String"> SELECT uuid() </selectKey> <!-- id,username,password,address是数据表中的对应的字段名称 #{id},#{username},#{password},#{address}是实体类中对应的属性名 --> INSERT into user(id,username,password,address) value(#{id},#{username},#{password},#{address}) </insert>
mybatis开发dao的方法
- sqlSession使用范围
- sqlSessionFactoryBuilder
通过sqlSessionFactoryBuilder创建会话工厂sqlSessionFactory - sqlSessionFactory
通过sqlSessionFactory创建sqlSession,通过单例模式管理sqlSessionFactory(工厂一旦创建,一直使用一个实例) - sqlSession
是一个面向用户的接口(程序员)的接口
sqlSession中提供了很多操作数据库的方法:例如:selectOne(返回单个对象)selectList(返回单个或多个对象)
sqlSession是线程不安全的,在sqlSession实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性
sqlSession最佳应用场合在方法体内,定义为局部变量使用
- sqlSessionFactoryBuilder
原始dao开发方法(程序员需要写dao接口和dao实现类)
- 思路:
程序员需要写dao接口和dao实现类。
需要向dao实现类中注入sqlSessionFactory(会话工厂),在方法体内通过工厂(sqlSessionFactory)创建sqlSession
- 总结原始开发dao的问题
1.dao的接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来
2.调用sqlSession方法时将statement的id硬编码了
3.调用sqlSession方法时传入的变量,由于sqlSession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,只有在运行时报错,不利于程序开发
mapper代理方法(程序员只需要mapper接口(相当于dao接口))
- 思路
1.程序员只需要mapper接口(相当于dao接口),需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类的代理对象
2.程序员还需要编写mapper.xml映射文件
-
开发规范:
1.在mapper.xml中namespace等于mapper接口地址
image.png2.mapper.java接口中的方法名和mapper.xml中statement的id一致
3.mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致
4.mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致
image.png
image.png
总结
以上开发规范主要是对下边的代码进行统一的生成:
image.png
SqlMapConfig.xml
- properties(属性)
需求:
将数据库连接的参数单独配置在db.properties
中,只需要在sqlMapConfig.xml
中加载db.properties
的属性值
在SqlMapConfig.xml
中就不需要对数据库连接参数硬编码
将数据库连接参数只配置在db.properties
中,原因:方便对参数进行统一的管理,其他xml可以引用该db.properties
db.properties
的文件
image.png
sqlMapConfig.xml
加载属性名称
image.png
image.png
建议:
不要在properties元素体内添加任何属性值,只将属性值定义在properties文件中
- setting(全局配置参数)需要时设置,不需要就不要设置(会影响mybatis的运行)
mybatis框架在运行时可以调整一些运行参数
比如:开启二级缓存、开启延时加载……
全局参数将会影响mybatis的运行行为
- typeAliases(类型别名)
-
单个定义别名
image.png -
批量定义别名
image.png
-
在dao.xml中的返回值类型填实体类的名称,首字母大写小写都可以
- typeHandles(类型处理器)
在mybatis中通过typeHandles完成jdbc类型和java类型的转换
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境集合属性对象)
- environment(环境子属性对象)
- transactionManager(事务管理)
- dataSource(数据源)
- environment(环境子属性对象)
- mappers(映射器)
-
通过resource加载单个映射文件
image.png - 通过mapper接口加载
-
加载单个映射文件
image.png -
批量加载映射文件(建议使用)
image.png
-
-
动态sql
- 什么是动态sql
mybatis核心就是对sql语句进行灵活的操作,通过表达式进行判断,对sql进行灵活拼接、组装
- 需求:
用户信息总和查询列表和用户信息查询列表总数这两个statement的定义使用动态sql
对查询条件进行判断,如果输入参数不为空才能进行查询条件拼接;例如:
<select id="findUserById" parameterType="User" resultType="user"> select * from user <!--where 可以自动去掉条件中的第一个and--> <where> <if test="userCustom!=null"> <if test="userCustom.usermame!=null and userCustom!=''"> and user.username = #{userCustom.username} </if> <if test="userCustom.sex != null and userCustom.sex != ''"> and user.sex = #{userCustom.sex} </if> </if> </where> </select>
sql片段
- 需求:
将上边实现的动态sql判断代码块抽取出来,组成一个sql片段。其他的statement中就可以引用sql片段
- 定义sql片段
<!--定义sql片段 id:sql片段的唯一标识 经验:是基于表单来定义sql片段可重用性高 在sql片段中不要包括where --> <sql id="query_user_where"> <if test="userCustom!=null"> <if test="userCustom.usermame!=null and userCustom!=''"> and user.username = #{userCustom.username} </if> <if test="userCustom.sex != null and userCustom.sex != ''"> and user.sex = #{userCustom.sex} </if> </if> </sql>
应用sql片段
<select id="findUserById" parameterType="User" resultType="user"> select * from user <!--where 可以自动去掉条件中的第一个and--> <where> /*应用sql片段*/ <include refid="query_user_where" /> /*在这里还会引用其他的sql片段*/ </where> </select>
foreach
向sql传递数组或list,mybatis使用foreach解析
- 需求
在用户查询列表和查询总数的statement中增加多个id输入查询
sql语句如下:select * from user where id=1 or id=10 or id=16
或select * from user where id in(1,10,16)
- 在输入参数类型中添加List<Integer>传入多个id
private List<Integer> ids
传入多个id - mapper.xml的配置
在查询条件中,查询条件定义成一个sql片段,需要修改sql片段
<!--定义sql片段 id:sql片段的唯一标识 经验:是基于表单来定义sql片段可重用性高 在sql片段中不要包括where --> <sql id="query_user_where"> <if test="ids!=null"> <!--使用foreach遍历传入ids collection:指定输入对象中集合属性 item:每次遍历生成的对象 open:开始遍历时拼接的串 close:结束遍历时拼接的串 separator:遍历的两个对象中需要拼接的串 --> <foreach collection="ids" item="user_id" open="and (" close=")" separator="or"> /*每次遍历需要拼接的串*/ id=#{user_id} </foreach> </if> </sql>
select * from user where id in(1,10,16)
的foreach查询方法

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
pip换源
换源的作用是可以加快python下载库的速度。 本篇文章采用的方法是作者已经编辑好换源的文本文件,读者只需要下载后将其解压到用户文件夹下即可。 1.下载压缩文件 文件下载链接: https://pan.baidu.com/s/1cAHPGjISCiD49v51Lbbpxg 密码: 2bre 2.解压压缩文件 压缩文件是一个配置文件,只有不到1KB。 下载好后鼠标右击选择解压文件夹,如下图所示: image.png 选择如下图所示文件夹,然后点击 确定: image.png 安装成功后,打开资源管理器,进入路径: C:/Users/Administrator 如果看到此路径下有pip文件夹,则说明解压文件到了正确的位置。 如果你电脑用户有多个,就按照相同的步骤解压到多个用户的目录下。 image.png 3.测试pip速度 在cmd中用pip命令自己选择安装一个库测试 如果换源成功,有2M/s以上的速度。
- 下一篇
创业公司的技术总监,去上市公司面试,结果凉了
1、先来个自我介绍 首先,大概介绍下自己,后端开发8年,头两年用.NET,之后用Python至今,大概六年。大概工作到第三年的时候,就开始兼着任管理职位。工作地点是在一个三、四线的沿海城市,本地IT业不发达,公司规模普遍偏小,对技术要求不高,但需要较为全面的人才。而我长时间在这样的氛围下工作,慢慢也成长为一位偏“全栈”的WEB开发人员,从前端angular,到后端Python,到服务器部署,统统可以一人搞定。 2、人到中年的焦虑 现在在这家公司差不多2年,担任技术合伙人,工资12K,在当地应该几乎达到顶点了,同时拥有一定的股权。但是公司近来越来越不景气,时不时出现了拖欠工资的行为。因而引发了我的焦虑。 心里想着,万一公司解散了,在本地很难找到相当水平的岗位。再者,就算换了一家别的公司,结局是否跟之前的一样,不断出现公司经营情况慢慢变差,随后再次出现解散的情况呢? 我心里没底,现在的我,三十出头,还处在事业的高峰期。如果在我四十岁、甚至五十岁,不断遇到这样类似的情况,那么我该何去何从呢? 3、萌生回到厦门的念头 于是乎,在招聘网站上填了我的资料,寻找机会。 这次我的择业选择比较明确,到大...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- 2048小游戏-低调大师作品
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G