mysql生成uui mybatis_mybatis----基础

基础知识

安装

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语句

e5cf79c1039a

image.png

e5cf79c1039a

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接口地址

e5cf79c1039a

image.png

2.mapper.java接口中的方法名和mapper.xml中statement的id一致

3.mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致

4.mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致

e5cf79c1039a

image.png

e5cf79c1039a

image.png

总结

以上开发规范主要是对下边的代码进行统一的生成:

e5cf79c1039a

image.png

SqlMapConfig.xml

properties(属性)

需求:

将数据库连接的参数单独配置在db.properties中,只需要在sqlMapConfig.xml中加载db.properties的属性值

在SqlMapConfig.xml中就不需要对数据库连接参数硬编码

将数据库连接参数只配置在db.properties中,原因:方便对参数进行统一的管理,其他xml可以引用该db.properties

db.properties的文件

e5cf79c1039a

image.png

sqlMapConfig.xml加载属性名称

e5cf79c1039a

image.png

e5cf79c1039a

image.png

建议:

不要在properties元素体内添加任何属性值,只将属性值定义在properties文件中

setting(全局配置参数)需要时设置,不需要就不要设置(会影响mybatis的运行)

mybatis框架在运行时可以调整一些运行参数

比如:开启二级缓存、开启延时加载……

全局参数将会影响mybatis的运行行为

typeAliases(类型别名)

单个定义别名

e5cf79c1039a

image.png

批量定义别名

e5cf79c1039a

image.png

在dao.xml中的返回值类型填实体类的名称,首字母大写小写都可以

typeHandles(类型处理器)

在mybatis中通过typeHandles完成jdbc类型和java类型的转换

objectFactory(对象工厂)

plugins(插件)

environments(环境集合属性对象)

environment(环境子属性对象)

transactionManager(事务管理)

dataSource(数据源)

mappers(映射器)

通过resource加载单个映射文件

e5cf79c1039a

image.png

通过mapper接口加载

加载单个映射文件

e5cf79c1039a

image.png

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

e5cf79c1039a

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查询方法

e5cf79c1039a

image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值