基础知识

安装

org.mybatis

mybatis

x.x.x

对原生态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语句

image.png

image.png

#{}与${}

#{} 表示一个占位符,#{}接受输入参数,类型可以是简单的类型,pojo、hashmap。

如果接受简单类型,#{}中可以写成value或其他名称

#{}接受pojo对象值,通过OGNL读取对象中的属性值,通过属性。属性。属性……的方式获取对象属性值

${} 表示一个拼接符号,会引起sql注入,所以不建议使用

${}接受输入参数,类型可以是简单的类型,pojo、hashmap。

如果接受简单类型,${}中只可以写成value

parameterType、resuletType

parameterType : 指定输入参数的类型

resuletType : 指定输出参数的类型

自增主键返回

mysql自增主键,执行insert提交之前自动生成一个自增主键。

通过mysql函数获取到刚插入记录的自增主键:

LAST_INSERT_ID()

是在insert之后调用此函数,需要修改UserInsert的定义

SELECT LAST_INSERT_ID()

INSERT into user(username,password,address) value(#{username},#{password},#{address})

非自增主键返回(使用uuid)

使用mysql的uuid()函数生成主键,需要修改表中id字段类型为string,长度设置成35位

执行思路:

先通过uuid()查询到主键,将主键输入到sql语句中

执行uuid()语句顺序相对于insert语句之前执行

SELECT uuid()

INSERT into user(id,username,password,address) value(#{id},#{username},#{password},#{address})

mybatis开发dao的方法

sqlSession使用范围

sqlSessionFactoryBuilder

通过sqlSessionFactoryBuilder创建会话工厂sqlSessionFactory

sqlSessionFactory

通过sqlSessionFactory创建sqlSession,通过单例模式管理sqlSessionFactory(工厂一旦创建,一直使用一个实例)

sqlSession

是一个面向用户的接口(程序员)的接口

sqlSession中提供了很多操作数据库的方法:例如:selectOne(返回单个对象)selectList(返回单个或多个对象)

sqlSession是线程不安全的,在sqlSession实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性

sqlSession最佳应用场合在方法体内,定义为局部变量使用

原始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.png

2.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(数据源)

mappers(映射器)

通过resource加载单个映射文件

image.png

通过mapper接口加载

加载单个映射文件

image.png

批量加载映射文件(建议使用)

image.png

动态sql

什么是动态sql

mybatis核心就是对sql语句进行灵活的操作,通过表达式进行判断,对sql进行灵活拼接、组装

需求:

用户信息总和查询列表和用户信息查询列表总数这两个statement的定义使用动态sql

对查询条件进行判断,如果输入参数不为空才能进行查询条件拼接;例如:

select * from user

and user.username = #{userCustom.username}

and user.sex = #{userCustom.sex}

sql片段

需求:

将上边实现的动态sql判断代码块抽取出来,组成一个sql片段。其他的statement中就可以引用sql片段

定义sql片段

and user.username = #{userCustom.username}

and user.sex = #{userCustom.sex}

应用sql片段

select * from user

/*应用sql片段*/

/*在这里还会引用其他的sql片段*/

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传入多个id

private List ids传入多个id

mapper.xml的配置

在查询条件中,查询条件定义成一个sql片段,需要修改sql片段

/*每次遍历需要拼接的串*/

id=#{user_id}

select * from user where id in(1,10,16)的foreach查询方法

image.png

mysql生成uui mybatis_mybatis----基础相关推荐

  1. mysql生成uui mybatis_Mybatis【配置文件】详解

    配置文件和映射文件还有挺多的属性我还没有讲的,现在就把它们一一补全 映射文件 在mapper.xml文件中配置很多的sql语句,执行每个sql语句时,封装为MappedStatement对象,mapp ...

  2. mysql生成uui mybatis,MyBatis自动生成UUID并返回

    pom依赖 org.springframework.boot spring-boot-starter-test test 实体类 public class Person { private Strin ...

  3. mysql rollup 排序_MySQL基础实用知识集合(二)

    上期小编给大家汇总介绍了mysql的6个基础的知识点,下面继续给大家分享一下另外7个知识点: 7.什么是死锁?怎么解决? 死锁:两个或多个事务相互占用了对方的锁,就会一直处于等待的状态. 常见的解决死 ...

  4. 数据基础---mysql数据库操作(一)---基础操作

    mysql常识 本文前面主要是对<mysql_5.5中文参考手册>部分内容的整理. 说明:登录mysql后,可以看到mysql> 的提示符,可以输入相关命令:输入命令后,需要以&qu ...

  5. MySQL的初次见面礼基础实战篇

    [版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/61614366 出自[zejian ...

  6. php mysql 随机字符串函数是,mysql生成随机字符串函数分享

    这篇文章主要介绍了mysql生成随机字符串函数分享,本文直接给出实现代码,需要的朋友可以参考下 set global log_bin_trust_function_creators = 1; DROP ...

  7. Mysql 生成不重复的随机数字

    在网上查找Mysql 生成不重复的随机数字 ,竟然没找到合适的例子. 其实思路很简单,利用MySQL现有的函数,然后进行加工处理,达到预期的结果.可以用到的MySQL函数为rand() ,以及 rou ...

  8. MYSQL 生成UUID() 即 ORACLE 中的guid()函数

    MYSQL 生成UUID 即 guid 函数 -- 带 - 的UUID select UUID() -- 去掉 - 的UUID select replace(uuid(),'-','') 转载于:ht ...

  9. 2.5.1 MySQL数据库备份恢复基础讲解

    MySQL数据库备份恢复基础 MySQL常见的故障类型 对于用户来说,数据库中保存的数据通常至关重要,所以要采取各种手段来防止各种可能的数据损失和数据故障. DBA主要任务就是维持数据库的高可靠性运行 ...

最新文章

  1. C#.NET 中的类型转换 (转)
  2. [LeetCode] Wildcard Matching 题解
  3. Git 下载、安装与SSH配置
  4. 作业调度进程c语言代码,进程调度 时间片轮转调度算法源代码(C语言)
  5. 微信浪漫告白小程序java_厉害了,微信小程序可以这样表白,还怕他(她)拒绝你?...
  6. 软件测试自我评价范文,软件测试工程师100字自我评价范文
  7. 如何删除tmp计算机桌面,temp文件删不掉怎么办
  8. css边框图片的使用场景
  9. 脑机接口的技术与应用
  10. 极值点 驻点 鞍点 拐点
  11. 罗克韦尔PLC编程软件ControlLogix平台
  12. 知识付费系统源码下载带课程数据+一键同步功能和更新设置
  13. linux fflush函数,sleep函数和fflush函数
  14. 晚安西南-----远控房魅影
  15. 爱思助手(i4助手) v5.08 官方版​
  16. /lib和/usr/lib的区别、/lib64与/usr/lib64的区别
  17. UBports使用Anbox玩耍安卓APPs
  18. 转载:SAP 标准教材和自学方法
  19. Ansys Speos | 基于 Workbench 和 Speos 的准直全反射透镜优化设计案例
  20. 【DVB数字电视框架介绍】

热门文章

  1. PHP图片上传,框架通用
  2. mysql中int(16)_MySQL中int(M)和tinyint(M)数值类型中M值的意义
  3. 图标出问题_同是Office365,为什么你的软件图标还是旧版的?
  4. CentOS7中yum安装mysql_CentOS7中YUM 安装mysql
  5. python子类初始化父类_Python实现子类调用父类的初始化实例
  6. 简单java socket_基于Java Socket实现一个简易在线聊天功能(一)
  7. nginx: [warn] the “ssl“ directive is deprecated, use the “listen ... ssl“ directive instead in
  8. java中break内外循环_java 中break如何跳出外部循环
  9. tcp接口测试工具_你不了解的,完整“接口测试”与服务虚拟化
  10. python排序算法实现_十大排序算法python实现