1、数据库连接频繁的创建和关闭,缺点浪费数据库的资源,影响操作效率
设想:使用数据库连接池
2、sql语句是硬编码,如果需求变更需要修改sql,就需要修改Java代码,需要重新编译,系统不易维护。
设想:将sql语句统一配置在文件中,修改sql不需要修改java代码。
3、通过preparedStatement向占位符设置参数,存在硬编码( 参数位置,参数)问题。系统不易维护。
设想:将sql中的占位符及对应的参数类型配置在配置文件中,能够自动输入映射。
4、遍历查询结果集存在硬编码(列名)。
设想:自动进行sql查询结果向java对象的映射(输出映射)。
Mybatis就是一个封装来jdbc的持久层框架,它和hibernate都属于ORM框架,但是具体的说,hibernate是一个完全的orm框架,而mybatis是一个不完全的orm框架。
Mybatis让程序员只关注sql本身,而不需要去关注如连接的创建、statement的创建等操作。
Mybatis会将输入参数、输出结果进行映射。
1、 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
2、 Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
3、 向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。
4、 对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。
对订单商品案例中的用户表进行增删改查操作
1、 根据用户ID查询用户信息
2、 根据用户名称模糊查询用户列表
3、 添加用户
3.2环境准备
首先要下载MyBaits,2 Mybatis的框架原理mybaits的代码由github.com管理1、 执行sql_table.sql脚本,创建数据库表;
2、 执行sql_data.sql初始化测试数据。
Mybatis的核心包和依赖包
MySQl的驱动包
Junit(非必须)
3.4需求开发
(1)根据用户ID查询用户信息
【1】 映射文件
在config目录下,创建User.xml
【3】测试代码
(2)根据用户名称模糊查询用户列表
模糊查询名字带小明的用户信息,其SQL语句为
SELECT * FROM user WHERE username LIKE '%小明%'
但是我们又不会在前段页面输入 %小明%,只会输入 小明。这个时候就要用到${ }
${ }表示拼接sql串,将接受到的内容不加任何修饰的加在sql中
【1】映射文件
【2】测试代码
小结:
#{ }和${ }的区别:
#{ }代表一个占位符,#{}接收简单类型的参数时,里面的名称可以任意
${ }代表拼接符号,${}接收简单类型的参数时,里面的名称必须是value,${}里面的值会原样输出,不加解析(如果该参数值字 符串,有不会添加引号)
因为会引起sql注入,所以不建议使用
selectOne和selectList的区别
selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现使用selectList也可以实现
selectList表示查询出一个列表(多条记录)。如果使用selectList查询多条记录,不能使用selectOne。
parameterType和resultType
parameterType指定输入参数的java类型,parameterType只有一个,也就是说入参只有一个。
resultType指定输出结果的java类型(是单条记录的java类型)
(3)添加用户
【1】映射文件
【2】测试代码
【3】逐渐返回之自增主键
【4】主键返回值 UUID
【5】主键返回值序列
序列也就是sequence,它是Oracle的主键生成策略