mybatis入门 基础知识(重点,内容量多)
1、对原生态jdbc程序(单独使用jdbc开发)问题总结
2、mybatis框架原理 (掌握)
3、mybatis入门程序
用户的增、删、改、查
4、mybatis开发dao两种方法:
原始dao开发方法(程序需要编写dao接口和dao实现类)(掌握)
mybaits的mapper接口(相当于dao接口)代理开发方法(掌握)
5、mybatis配置文件SqlMapConfig.xml
mybatis核心:
6、mybatis输入映射(掌握)
7、mybatis输出映射(掌握)
8、mybatis的动态sql(掌握)
1、对原生态jdbc程序中问题总结
(1)数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响性能。
设想:使用数据库连接池管理数据库连接。
(2)将sql语句硬编码到java代码中,如果sql 语句修改,需要重新编译java代码,不利于系统维护。
设想:将sql语句配置在xml配置文件中,即使sql变化,不需要对java代码进行重新编译。
(3)向preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护。
设想:将sql语句及占位符号和参数全部配置在xml中。
(4)从ResutSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,,不利于系统维护。
设想:将查询的结果集,自动映射成java对象。
2、mybatis框架
mybatis是什么?
mybatis是一个持久层框架,是apache下的顶级项目。
mybatis托管到goolecode下,再后来托管到github下:https://github.com/mybatis/mybatis-3/releases
mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成(半自动化,大部分需要程序员编写sql)满足需要sql语句。
mybatis可以将向 preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。(输出映射)
2.1 mybatis框架原理
2.2 快速上手开发步骤:
需求:简单CRUD操作
持久层mybatis 开发步骤:
1、搭建环境:
mybatis运行环境(jar包): mybatis所需jar包(核心包,lib文件夹中的依赖包)、
mysql数据库驱动包、单元测试jar包、log4j.properties日志文件
2、配置文件:
XXXMapper.xml
SqlMapConfig.xml(名称不固定):配置数据源,事务,映射目录,别名,全局配置等
3、单元测试
写单元测试,测试CRUD方法
2.3工程结构
1、映射文件 User.xml
映射文件命名:User.xml(原始ibatis命名),mapper代理开发映射文件名称叫XXXMapper.xml,比如:UserMapper.xml、ItemsMapper.xml。在映射文件中配置sql语句:
<?xml version="1.0" encoding="UTF-8" ?> <!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离
<!-- 自增主键适用,添加数据返回主见 -->
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String"> --> |
2、创建mybatis配置文件:sqlMapConfig.xml
在sqlMapConfig.xml中加载User.xml:
<?xml version="1.0" encoding="UTF-8" ?> <!-- 加载属性文件 --> |
3、程序编写
public class MybatisFirst { // 根据id查询用户信息,得到一条记录结果 // mybatis配置文件 // 创建会话工厂,传入mybatis的配置文件信息 // 通过工厂得到SqlSession // 通过SqlSession操作数据库 // sqlSession.selectOne结果 是与映射文件中所匹配的resultType类型的对象 // list中的user和映射文件中resultType所指定的类型一致 // 插入用户对象 sqlSession.insert("test.insertUser", user); // 提交事务 // 传入id删除 用户 // 提交事务 // 更新用户 User user = new User(); sqlSession.update("test.updateUser", user);
// 释放资源 } |
上面即是mybatis的快速入门,可以进行单表的CRUD操作。
总结
1、parameterType
在映射文件中通过parameterType指定输入 参数的类型。
2、resultType
在映射文件中通过resultType指定输出 结果的类型。
3、#{} 和 ${}
#{}表示一个占位符号,
#{}接收输入参数,类型可以是简单类型(int,string等),pojo、hashmap。
如果接收简单类型,#{}中可以写成value或其它名称。
#{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。
${}表示一个拼接符号,会引用sql注入,所以不建议使用${}。
${}接收输入参数,类型可以是简单类型,pojo、hashmap。
如果接收简单类型,${}中只能写成value。
${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。
4、selectOne 和 selectList
selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现,那么使用selectList也可以实现(list中只有一个对象)。
selectList表示查询出一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne。
如果使用selectOne报错:
org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 4
5、插入数据时,返回主键
mysql:
1、自增主键返回
mysql自增主键,执行insert提交之前自动生成一个自增主键。
通过mysql函数获取到刚插入记录的自增主键:LAST_INSERT_ID()
是insert之后调用此函数。
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> |
2、非自增主键返回(使用uuid())
使用mysql的uuid()函数生成主键,需要修改表中id字段类型为string,长度设置成35位。
执行思路:
先通过uuid()查询到主键,将主键输入 到sql语句中。
执行uuid()语句顺序相对于insert语句之前执行。
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String"> |
oracle
通过oracle的序列生成主键:
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String"> |
mybatis 和 hibernate本质区别和应用场景
hibernate:是一个标准ORM框架(对象关系映射)。入门门槛较高的,不需要程序写sql,sql语句自动生成了。
对sql语句进行优化、修改比较困难的。
应用场景: 适用与需求变化不多的中小型项目,比如:后台管理系统,erp、orm、oa .......
mybatis:专注是sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全 的ORM框架,虽然程序员自己写sql,mybatis 也可以实现映射(输入映射、输出映射)。
应用场景: 适用与需求变化较多的项目,比如:互联网项目。
企业进行技术选型,以低成本 高回报作为技术选型的原则,根据项目组的技术力量进行选择。