1
、数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响 数据库性能。
设想:使用数据库连接池管理数据库连接。
2
、将
sql
语句
硬编码
到
java
代码中,如果
sql
语句修改,需要重新编译
java
代码,不利于系统维护。
设想:将
sql
语句
配置在
xml
配置文件中,即使
sql
变化,不需要对
java
代码进行重新编译。
3
、向preparedStatement
中设置参数,对占位符号位置和设置参数值,硬编码在
java
代码中,不利于系统维护。
设想:将
sql
语句
及占位符号和参数全部配置在
xml
中。
4
、从
resutSet
中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,,不利于系统维护。
设想:将查询的结果集,自动映射成
java
对象。
1 mybatis
框架
1.1 mybatis
是什么?
mybatis是一个持久层的框架,是
apache
下的顶级项目。
mybatis
托管到
goolecode
下,再后来托管到
github
下
(https://github.com/mybatis/mybatis-3/releases
)
。
mybatis让程序将主要精力放在
sql
上,通过
mybatis
提供的映射方式,自由灵活生成(半自动化,大部分需要程序员编写
sql
)满足需要
sql
语句。
mybatis
可以将向 preparedStatement
中的输入参数自动进行
输入映
射,将查询结果集灵活映射成
java
对象。(
输出映射
)
1.2 mybatis
框架
1.3入门程序
1.3.1 创建
po
类
1.3.2 映射文件
映射文件命名:
User.xml
(原始
ibatis
命名),
mapper
代理开发映射文件名称叫
XXXMapper.xml
,比如:
UserMapper.xml
、
ItemsMapper.xml
在映射文件中配置
sql
语句。
1.4. 总结
1.2.1 parameterType
在映射文件中通过
parameterType
指定输入 参数的类型。
1.4.2 resultType
在映射文件中通过
resultType
指定输出结果的类型。
1.4.3 #{}
和
${}
#{}
表示一个占位符号,
#{}
接收输入参数,类型可以是简单类型,
pojo
、
hashmap
。
如果接收简单类型,
#{}
中可以写成
value
或其它名称。
#{}
接收
pojo
对象值,通过
OGNL
读取对象中的属性值,通过属性
.
属性
.
属性
...
的方式获取对象属性值。
${}
表示一个拼接符号,会引用
sql
注入,
所以不建议使用
${}
。
${}
接收输入参数,类型可以是简单类型,
pojo
、
hashmap
。
如果接收简单类型,
${}
中只能写成
value
。
${}
接收
pojo
对象值,通过
OGNL
读取对象中的属性值,通过属性
.
属性
.
属性
...
的方式获取对象属性值。
1.5.1 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
1.6.1 非自增主键返回
(
使用
uuid())
要求:插入的表必须是非自增主键的,且类型应是varchar
使用
mysql
的
uuid()
函数生成主键,需要修改表中
id
字段类型为
string
,长度设置成
35
位。
执行思路:
先通过
uuid()
查询到主键,将主键输入 到
sql
语句中。
执行
uuid()
语句顺序相对于
insert
语句之前执行。
2.1 mybatis
和
hibernate
本质区别和应用场景
hibernate
:是一个标准
ORM
框架(对象关系映射)。入门门槛较高的,不需要程序写
sql
,
sql
语句自动生成了。
对
sql
语句进行优化、修改比较困难的。
应用场景:
适用与需求变化不多的中小型项目,比如:后台管理系统,
erp
、
orm
、
oa
。。
mybatis
:专注是
sql
本身,需要程序员自己编写
sql
语句,
sql
修改、优化比较方便。
mybatis
是一个不完全 的
ORM
框架,虽然程序员自己写
sql
,
mybatis
也可以实现映射(输入映射、输出映射)。
应用场景:
适用与需求变化较多的项目,比如:互联网项目。
企业进行技术选型,以低成本 高回报作为技术选型的原则,根据项目组的技术力量进行选择。
2 mybatis
开发
dao
的方法
2.1 SqlSession
使用范围
2.1.1
SqlSessionFactoryBuilder
通过SqlSessionFactoryBuilder
创建会话工厂SqlSessionFactory
将SqlSessionFactoryBuilder
当成一个工具类使用即可
,不需要使用单例管理SqlSessionFactoryBuilder
。
在需要创建SqlSessionFactory
时候,只需要
new
一次SqlSessionFactoryBuilder
即可。
2.1.2
SqlSessionFactory
通过SqlSessionFactory
创建
SqlSession
,使用单例模式管理
sqlSessionFactory
(工厂一旦创建,使用一个实例)。
将来
mybatis
和
spring
整合后,使用单例模式管理
sqlSessionFactory
。
2.1.3 SqlSession
SqlSession
是一个面向用户(程序员)的接口。
SqlSession
中提供了很多操作数据库的方法:如:
selectOne(
返回单个对象
)
、
selectList
(返回单个或多个对象)、。
SqlSession
是线程不安全的,在
SqlSesion
实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性。
SqlSession
最佳应用场合在方法体内,定义成局部变量使用。
2.2 原始
dao
开发方法(程序员需要写
dao
接口和
dao
实现类)
2.2.1 思路
程序员需要写
dao
接口和
dao
实现类。
需要向
dao
实现类中注入
SqlSessionFactory
,在方法体内通过
SqlSessionFactory
创建
SqlSession
2.2.2 dao
接口
2.2.3 dao
接口实现类
public
class
UserDaoImpl
implements
UserDao {
//
需要向
dao
实现类中注入
SqlSessionFactory
//
这里通过构造方法注入
private
SqlSessionFactory
sqlSessionFactory
;
public
UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
this
.
sqlSessionFactory
= sqlSessionFactory;
}
@Override
public
User findUserById(
int
id)
throws
Exception {
SqlSession sqlSession =
sqlSessionFactory
.openSession();
User user = sqlSession.selectOne(
"test.findUserById"
, id);
//
释放资源
sqlSession.close();
return
user;
}