简介
1、什么是mybatis
- MyBatis 是一款优秀的持久层框架,
- 它支持自定义 SQL、存储过程以及高级映射。
- MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
- MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
- MyBatis 本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。
- 2013年11月迁移到Github。
关键词解释
持久化
狭义的理解: “持久化”仅仅指把域对象永久保存到数据库中;
广义的理解,“持久化”包括和数据库相关的各种操作(持久化就是将有用的数据以某种技术保存起来,将来可以再次取出来应用,数据库技术,将内存数据一文件的形式保存在永久介质中(磁盘等)都是持久化的例子.)。
- 保存:把域对象永久保存到数据库。
- 更新:更新数据库中域对象的状态。
- 删除:从数据库中删除一个域对象。
- 加载:根据特定的OID,把一个域对象从数据库加载到内存。
- 查询:根据特定的查询条件,把符合查询条件的一个或多个域对象从数据库加载内在存中。
持久层
- 我们在此之前已经学过mvc三层架构都知道 Dao层,Servcie 层 Controlle r层, 层与层之间相互关联。
- 持久层从广义上来说在持久化的基础上做了一个明显的划分,完成持久化工作的代码块
- 层与层之间具有十分明显的界限。
为什么要持久化呢?
- 通过持久化技术可以减少访问数据库数据次数,增加应用程序执行速度;
- 代码重用性高,能够完成大部分数据库操作;
- 松散耦合,使持久化不依赖于底层数据库和上层业务逻辑实现,更换数据库时只需修改配置文件而不用修改代码。
2、为什么要用Mybatis
- 使操作数据库更为轻松简单
- 传统jdbc代码复杂,ibatis实现自动化 简化
- 程序员使用起来得心应手
优点
- 简单易学
- 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。通过sql语句可以满足操作数据库的所有需求。
- sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射
- 提供对象关系映射标签,支持对象关系组建维护
- 提供xml标签,支持编写动态sql。
3、Mybatis第一个应用程序
实现思路: 搭建环境-->导入mybatis-->编写代码-->测试
1、数据库(可随意创建一个数据库进行测试)
CREATE DATABASE `java_project`;
use `java_project`;
CREATE TABLE `mybatis_user`(
`id` Int NOT NULL PRIMARY KEY,
`name` VARCHAR(30) DEFAULT NULL,
`pwd` VARCHAR(30) DEFAULT NULL,
)ENGINE=INNODB DEFAULT CHARSET=utf8;
mysql>INSERT INTO `mybatis_user` (`id`,`name`,`pwd`) VALUES (1,'juran','123');
2、新建maven项目
删除src目录
导入依赖
<dependencies>
<!--Mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!--Mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
</dependencies>
通过模块创建子工程
编写核心mybatis核心配置文件(连接数据库)
<?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>
<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://localhost:3306/java_project?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
编写工具类
package com.juran.untils;
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 java.io.IOException;
import java.io.InputStream;
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory
static {
try {
//使用mybatis第一步:获取sqlseesionFactory 对象。
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。
// 你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
编写实体类(根据各个数据库字段来定义类)
package com.juran.pojo;
public class Mybatis_User {
private int id;
private String name;
private String pwd;
public Mybatis_User() {
}
public Mybatis_User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
public int getId() {
return id;
}
public void setId(int 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 "Mybatis_User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
}
Dao层接口
package com.juran.dao;
import com.juran.pojo.Mybatis_User;
import java.util.List;
public interface Mybatis_UserDao{
List<Mybatis_User> UserList();
}
Dao层接口由原来的接口也实现类转换成一个mapper配置文件
<?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 namespace="com.juran.dao.Mybatis_UserDao">
<!--id:绑定-->
<select id="getUserList" resultType="com.juran.pojo.Mybatis_User">
select * from java_project.mybatis_user
</select>
</mapper>
创建测试类
package com.juran.dao;
import com.juran.pojo.Mybatis_User;
import com.juran.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class Mybatis_UserTest {
@Test
public void test(){
//获得sqlsession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
// //执行Sql方式一: 通过mapper获取类
Mybatis_UserDao mapper = sqlSession.getMapper(Mybatis_UserDao.class);
List<Mybatis_User> mybatis_users = mapper.getUserList();
//执行Sql方式二:根据方法的返回值返回
// List<Mybatis_User> mybatis_users = sqlSession.selectList("com.juran.dao.Mybatis_UserDao.getUserList");
//遍历
for (Mybatis_User mybatis_user : mybatis_users) {
System.out.println(mybatis_user);
}
//关闭
sqlSession.close();
}
}
报错注意事项
- org.apache.ibatis.binding.BindingException: Type interface com.juran.dao.Mybatis_UserDao is not known to the MapperRegistry.
该报错是因为我们没有在没有mybatis核心文件下注册mapper.xml文件
我们需要在mybatis-confing.xml文件之中注册mapper
<!--每一个都mapper.xml文件需要在mybatis核心文件之中注册-->
<mappers>
<mapper resource="com/juran/dao/Mybatis_UserMapper.xml"/>
</mappers>
- java.lang.ExceptionInInitializerError
该问题涉及资源过滤问题,我们写得配置文件,无法被导出或生效。解决方案在mybatis核心配置文件中加入。
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
- org.apache.ibatis.exceptions.PersistenceException:
该问题主要涉及mapper文件配置问题,请仔细核对mapper文件中的配置参数是否存在其错误。