一、Mybatis是什么
MyBatis 本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,mybatis是支持普通sql查询,存储过程和高级映射的优秀的、轻量级的持久层框架。
二、Mybatis的作用
mybatis消除了几乎所有的jdbc代码和参数的手工设置以及结果集的检索。
3. mybatis使用简单的xml或注解用于配置和原始映射,将简单javabean映射成数据库中的对象。
三、为什么要学习Mybatis
1. 我们先来看使用jdbc操作数据库的过程
Connection connection =
PreparedStatement preparedStatement =
ResultSet resultSet =
Class.forName("com.mysql.jdbc.Driver"
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/study?characterEncoding=utf-8" "root","root"
String sql = "select * from t_order where order_no = ?"
preparedStatement =
preparedStatement.setString(1,"123"
resultSet =
System.out.println(resultSet.getString("id") + " " + resultSet.getString("orderinfo" } }
(resultSet != } (preparedStatement != } (connection != }
}
使用jdbc操作数据库存在如下的问题:
1.1、数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能。
:使用数据库连接池管理数据库连接。
1.2、将sql语句硬编码到java代码中,如果sql 语句修改,需要重新编译java代码,不利于系统维护。
解决方案:将sql语句配置在xml配置文件中,即使sql变化,不需要对java代码进行重新编译。
1.3、向preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护。
解决方案:将sql语句及占位符号和参数全部配置在xml中。
1.4、从resutSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,不利于系统维护。
Mybatis解决方案:将查询的结果集,自动映射成java对象。
四、Mybatis架构图
架构图的说明:
1.1 SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
1.2 mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
2、通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
3、由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
4、mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
5、Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
6、Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
7、Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
五、Mybatis入门程序
1. 需求:创建一个用户表,用户名有用户名称,生日,性别,地址字段,对用户表进行CRUD操作
2. 环境:JDK1.8,eclipse,Mysql5.6,maven
3. 创建一个名为MybatisTest的工程,目录结构如下:
4. 在数据库里面创建用户表,并插入数据
SET FOREIGN_KEY_CHECKS=0
-- ----------------------------
-- Table structure -- ----------------------------
`id` (11 `username` varchar(30) NOT NULL COMMENT '用户名称' `birthday` date DEFAULT NULL COMMENT '生日' `sex` (2) DEFAULT NULL COMMENT '性别' `address` varchar(256) DEFAULT NULL COMMENT '地址' ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=
-- ----------------------------
-- -- ----------------------------
INSERT INTO `t_user` VALUES ('1','a','2017-10-12','2','深圳' INSERT INTO `t_user` VALUES ('2','b','深圳' INSERT INTO `t_user` VALUES ('3','c','1','深圳' INSERT INTO `t_user` VALUES ('4','d','深圳');
5. 在工程里面创建用户表的实体类UserModel.java
.id =
.username =
.sex =
.address =
.birthday =
"User [id=" + id + ",username=" + username + ",sex=" + sex + ",address=" + address + ",birthday="
+ birthday + "]"
}
6. 定义实体类在mybatis里面的映射文件mapper-user.xml
7. 定义mybatis的主配置文件SqlMapConfig.xml,在里面引入数据库配置文件db.properties和实体映射文件mapper-user.xml
8. db.properties
driver= url=jdbc:mysql:
name= password=123456
9. 编写mybatis的测试类
String resource = "SqlMapConfig.xml" InputStream inputStream = SqlSession sqlSession = inputStream =
SqlSessionFactory sqlSessionFactory =
sqlSession =
UserModel user = sqlSession.selectOne("test.findUserById",1
} } (sqlSession != (inputStream != }
String resource = "SqlMapConfig.xml" InputStream inputStream = SqlSession sqlSession = inputStream =
SqlSessionFactory sqlSessionFactory =
sqlSession =
List list = sqlSession.selectList("test.findUserByName","a"
} } (sqlSession != (inputStream != }