前言:
mybatis的前身是叫Ibatis ,阿帕奇组织下的。后来谷歌收购改名为 Mybatis。 (在Github 下可以找到该框架)
Mybatis是一个持久化框架 (跟数据库交互的框架)
原始jdbc 与数据库进行交互的过程繁琐,与数据库连接,获取Connection对象,编写预编译sql指令,设置参数,在执行sql指令, 封装结果
而后来出现的 jdbc工具:dbutis、jdbcTemplate 将这些过程封装,让过程更加简单。但还是有些问题 sql执行还是写在 java代码中,硬编码,高耦合,不推荐将sql指令写在java中,不便维护。
后来出现了与数据交互的框架:
hibernate 全自动的 orm (对象关系映射) ,javabean对象和数据库记录字段一 一对应上
hibernate框架会消除sql,内部暗箱操作(编写sql指令)。
但想要自定义sql指令,还需要学习HQL(定制sql),太难了,这无疑增加了学习的负担。所以我们使用mybatis(#^.^#)。
Mybatis: 半自动框架,内部没有暗箱操作,mybatis将编写sql的过程单独提取出来,使sql和java代码分离,sql由开发人员编写。
mybatis的使用 (注:可以参考mybatis的官方文档:https://mybatis.org/mybatis-3/zh/getting-started.html)
项目的结构图:
1.在Eclipse中 创建一个Meven项目:mybatis_Day01
2.pom.xml 导入所需要的依赖
<!-- Mybatis 框架 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- mysql的jdbc -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.30</version>
</dependency>
<!-- 日志依赖 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
3.编写数据表的 bean实体类、 操作表的Dao接口。
User 实体类
package com.mybatis.bean;
//User表的实体类
public class User {
//成员变量属性名 建议和 数据库字段保持一致
private Integer id;
private String name;
private Integer password;
private Integer money;
private String sex;
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", password=" + password + ", money=" + money + ", sex=" + sex
+ "]";
}
//...............以下省略掉 set/get 方法
}
User表的Dao接口
package com.mybatis.dao;
import com.mybatis.bean.User;
/**
* User表的 DAO接口
* @author dell
*/
public interface UserMapper {
//通过id查询User表中信息
User findUserById(Integer id);
}
4.在src类路径下创建一个mybatis_config.xml (mybatis的全局配置文件)和 userMapper.xml (User的sql映射文件)
mybatis_config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- mybatis 框架的核心全局配置文件 -->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!-- 配置数据源 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///test"/>
<property name="username" value="root"/>
<property name="password" value="19971011"/>
</dataSource>
</environment>
</environments>
<!-- 引入sql映射文件 -->
<mappers>
<!-- 引入指定的sql映射文件 因为该文件在类路径下(与mybatis同一路径下,直接指定文件名) -->
<mapper resource="userMapper.xml"/>
</mappers>
</configuration>
userMapper.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">
<!--
User的SQL映射文件
该文件配置了执行的sql语句,以及查询出来的数据封装格式
-->
<!-- namespace:名称空间(用于区别文件) 将命名空间置于合适的 Java 包命名空间之中 这样使代码更加整洁
使用User的Dao接口的包名类名,作为该xml的名称空间,使User的Dao接口与xml配置文件绑定
-->
<mapper namespace="com.mybatis.dao.UserMapper">
<!--定义sql语句 :相当于对 UserMapper接口方法的实现 -->
<!-- id名和返回值类型与 UserMapper接口 指定方法的一致 (该sql指令就是 UserDao接口中指定方法的实现) -->
<select id="findUserById" resultType="com.mybatis.bean.User">
select * from USER where id = #{id} <!-- #{id} 会被解析为? 占位符 -->
</select>
</mapper>
5.main方法演示
package com.mybatis.domain;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import com.mybatis.bean.User;
import com.mybatis.dao.UserMapper;
public class Demo {
public static void main(String[] args) throws IOException {
/*
* 根据xml配置文件 (全局配置文件mybatis_config.xml) 创建 SqlSessionFactory对象
*/
String resource = "mybatis_config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
/*
* 通过工厂生产 SqlSession对象,SqlSession 用于执行已经映射好的sql语句
* Sqlsession代表和数据库的一次会话,用完之后就释放掉
*/
SqlSession session = sqlSessionFactory.openSession();
//获取Dao接口的实现类对象
UserMapper mapper = session.getMapper(UserMapper.class);
//调用该接口的方法
User u = mapper.findUserById(1);
System.out.println(u.toString());
/**
这里可能会发生AbstractMethodError
Method com/mysql/jdbc/PreparedStatement.isClosed()Z is abstract
at com.mysql.jdbc.PreparedStatement.isClosed(PreparedStatement.java)
导致这个异常的原因是 Mysql的jdbc 版本问题
*/
}
}
控制台输出:
User [id=1, name=tom, password=123456, money=1000, sex=man]