mybatis,我认为大部分人在学习ssm框架的时候第一个学习的就是mybatis这个框架(嗯,反正我第一个学的就是mybatis)。然后我就想到了一个问题,为什么要先学习mybatis,而不是先去学习spring?
嗯,当我把ssm框架都学习了之后,我就懂了!mybatis无论从学习难度上还是理解度上都是最简单的!非常适合作为框架入门学习。
1、什么是mybatis
根据官方的说法是:
-
MyBatis 是一款优秀的持久层框架
-
支持自定义 SQL、存储过程以及高级映射。
-
免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作
-
可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
我的理解就是:简化了原有的jdbc操作
2、学习前我们需要了解的知识
- 首先要知道什么是持久层
- sql语句的书写
- jdbc的知识(更容易理解mybatis)
3、入门
3.1、依赖
在使用mybatis前,我们需要做的第一件事情是什么?答案当然是要导入mybatis的依赖,如果是maven项目就很简单了直接去中央仓库,将依赖的代码放在pom.xml中就可以了,代码如下:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
我本人推荐大家在学习mybatis的时候可以根据mybatis的官方文档来进行学习,附:MyBatis3的中文官方文档
3.2、配置
首先大家都知道mybatis主要就是需要和数据库进行交互,竟然要和数据库交互的话,mybatis就肯定需要进行配置来进行连接数据库。
现在我们可以先来对比一下jdbc与mybatis连接方式的不同:
// jdbc通用的连接数据库方法
public static Connection getConnection(){
Connection conn = null;
// url,username,password 也可以通过properties配置文件获取
// 数据库连接的地址
String url = "";
// 数据的用户名
String username = "";
// 数据库的密码
String password = "";
try{
// 加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 获取数据库连接
conn = DriverManager.getConnection(url, username, password);
}catch(Exception e){
e.printStackTrace();
}
return conn;
}
从这段代码不难看出jdbc的连接配置都是写在类中的,接下来我们看一下mybatis的配置mybatis-config.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--configuration(配置):在configuration内进行连接数据库的配置-->
<configuration>
<!--环境配置(environments):用来配置环境,
可以有多个环境配置
根据environment中的id来选择使用那个环境配置
-->
<environments default="development">
<environment id="development">
<!--事务管理器(transactionManager):处理事务-->
<transactionManager type="JDBC"/>
<!--dataSource :获取数据源-->
<dataSource type="POOLED">
<!--连接数据库的驱动,地址,用户名,密码-->
<property name="driver" value=""/>
<property name="url" value=""/>
<property name="username" value=""/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
<!--这里我后面会说-->
<!--每一个Mapper.XML都需要在Mybatis核心配置中注册-->
<mappers>
<mapper resource="com/zj/dao/UserMapper.xml"></mapper>
</mappers>
</configuration>
嗯,看到这里大家可能发现一个问题就是为啥感觉用了mybatis以后感觉配置上更麻烦了?jdbc连接数据库就那么一点代码,而mybatis却要在xml配置这么多东西呐?其实这点大家可以思考一点就是,你认为把所有的配置都写在java类中好,还是放在一个配置文件然后取读取好。在这里多说一点就是xml中的driver、url、username、password最好写一个db.properties配置文件中,这样以后修改数据库不需要修改xml配置文件直接修改properties配置文件就可以了。
如果大家想详细的了解mybatis配置文件中那些属性的含义可以去mybatis的官方文档去看,写的很详细。
3.3、mybatis的使用
数据的连接搞定了,那么下一步就是使用了,这个文章我只会告诉初学者mybatis如何使用,其他的内容我其实也不知道如何说的比较详细让我思考思考在说!这里说一下mybatis的使用需要获取SqlSession对象,因为SqlSession完全包含了面向数据库执行SQL命令所需的所有方法(当然等我们学习晚spring以后我们就不需要手动获取SqlSession对象了,就全部交给spring了)。附上获取SqlSession对象的通用类;
//sqlSessionFactory-->sqlSession
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//使用mybatis第一步获取sqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream =
Resources.getResourceAsStream(resource);
sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
// 既然有了SqlSessionFactory,
//顾名思义,我们就可以从中获得SqlSession实例
// SqlSession完全包含了面向数据库执行SQL命令所需的所有方法
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
那么我们就开始来写我们的第一个mybatis程序
第一步:创建我们的数据库以及建表;
create DATABASE `mybatis`;
USE `mybatis`;
create table `user`(
`id` INT(20) not null primary key,
`name` varchar(30) DEFAULT null,
`pwd` varchar(30) default null
)ENGINE=INNODB DEFAULT CHARSET=utf8;
insert into `user`(`id`,`name`,`pwd`)values
(1,'狂神','123456'),
(2,'张三','123456'),
(3,'李四','123890')
第二步:导入maven依赖;
<!--导入依赖-->
<dependencies>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--Junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
第三步:创建mybatis的配置文件;
第四步:写工具类获取SqlSession;
第五步:写实体类;
// 实体类
public class User {
private Integer id;
private String name;
private String pwd;
public User() {
}
public User(Integer id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
}
第六步:写我们dao层的接口;
public interface UserDao {
List<User> getUserList();
}
第七步:
到了这里大家其实发现除了获取数据库连接不同以外,jdbc和mybatis没有什么差别,那么到了这一步,就能看出两者的不同,以及为什么选择使用mybatis,jdbc如何写UserDaoImpl;
public class UserDaoImpl implements UserDao{
public List<User> getUserList(){
// 定义sql
String sql = "select* from user ";
// 连接对象
Connection conn = null;
// 预编译对象 PreparedStatement
PreparedStatement ps= null;
// 结果集
ResultSet rs= null;
try {
conn = DButils.getConnection();
// 获取preparedStatement
ps= conn.prepareStatement(sql);
// 执行sql语句,并返回结果集到resultSet中
rs= preparedStatement.executeQuery();
List<User> list = new ArrayList();
// 遍历结果集
while (rs.next()) {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name");
user.setPwd(rs.getString("pwd");
list.add(user);
}
return list;
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放资源
if (resultSet != null) {
resultSet.close();
}
if (preparedStatement != null) {
preparedStatement.close();
}
if (connection != null) {
connection.close();
}
}
return null;
}
}
嗯,看完这个代码以后,那么你会发现这个 代码好乱,sql语句预编译全部都是放在类中来实现,而mybatis并不是在类中来写sql语句而是在xml中来写
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace绑定一个对应的Dao/Mapper接口-->
<mapper namespace="com.zj.dao.UserDao">
<select id="getUserList" resultType="com.zj.pojo.User">
select * from user
</select>
</mapper>
这里我就解释一下前面配置文件里面那个mappers,它是一个映射器,为什么需要映射器,因为我们是把代码和sql分离了,可最后我们还是需要获取sql语句那么怎么获取就需要使用映射器来告诉 MyBatis 到哪里去找映射文件。
回到主题,通过jdbc和mybatis的对比,会发现在代码的可读性上mybatis十分简单明了,把代码和sql分开,而jdbc把代码和sql放在一起无论是可读性还是维护上都不如mybatis。
最后让我们看看通过mybatis的测试类:
@Test
public void test(){
// 第一步:获取SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
// 方式一:getMapper
UserDao mapper = sqlSession.getMapper(UserDao.class);
List<User> userList = mapper.getUserList();
for (User user : userList){
System.out.println(user);
}
// 关闭SqlSession
sqlSession.close();
}
这就是mybatis如何使用的一个流程,建库建表、导入依赖、工具类、实体类、dao层方法、以及通过映射文件来获取sql到最后的测试方法;
在这里我也说出了mybatis和jdbc的不同
为什么要使用mybatis
- 帮助程序员将数据存入到数据库中
- 方便
- 传统的JDBC代码太复杂了。简化。框架:自动化
- 不用Mybatis也可以。更容易上手。技术没有高低之分
优点:
1、 简单易学
2、灵活
3、sql和代码的分离
4、提供映射标签
5、提供对象关系映射标签
5、提供xml标签
最主要的一点是因为用的人多!