Mybatis入门
Mybatis介绍
什么是 MyBatis?
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
MyBatis是一款提供便利 对数据库操作友好的一款框架 JDBC有很大的耦合性的代码 而使用MyBatis会简单高效且耦合性低
持久化是什么?
持久化就是将数据从瞬时状态变为持久状态
举个很简单的例子 比如一条数据,放在内存中 内存的特性是断电数据消失
而为了避免数据发生丢失情况就会把数据放在磁盘中
这个过程就叫做 数据持久化
而MyBatis就是将数据放入数据库中 所以说它是一个持久化框架
MyBatis使用
准备工作
使用MyBatis需要有
MyBatis依赖包
mybatis-config.xml
MybatisUtils.class
首先需要使用Mybatis需要导入相应的依赖包 使用的是Maven导包
<dependencies>
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
<!-- Mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
然后在resources文件夹下 创建一个 名 :mybatis-config.xml 的文件
<!-- 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>
<!-- environments 是设置环境的 目前默认是开发环境(development) 可以添加其他环境 -->
<environments default="development">
<environment id="development">
<!-- 使用JDBC操作数据库-->
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 参数:驱动名类 -->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!-- 参数:数据库连接地址 -->
<property name="url" value="jdbc:mysql://10.16.105.241:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT"/>
<!-- 参数:数据库用户名 -->
<property name="username" value="root"/>
<!-- 参数:数据库密码 -->
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 注册Mapper文件 -->
<mappers>
<mapper resource="cn/mianju/dao/UserMapper.xml"/>
</mappers>
</configuration>
还需要创建一个工具类:MybatisUtils 这部分的代码是写死的 根据官网由来
package cn.mianju.utils;
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 {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
现在MyBatis配置完成 下一步就是使用框架操作数据库
使用
Dao(Mapper)
pojo(数据库实例化类)
Mapper.xml(存放sql语句)
首先根据数据库的字段编写一个pojo类 (IDEA可生成)
package cn.mianju.pojo;
public class User {
private int id;
private String name;
private String pwd;
public User() {
}
public 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 "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
}
再编写一个需要增删改查 也就是操作数据库的接口
package cn.mianju.dao;
import cn.mianju.pojo.User;
import java.util.List;
public interface UserDao {
List<User> getUserList();
}
在接口中定义方法 定义的方法到 UserMapper.xml 文件中去实现
<!-- 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">
<!-- Dao(mapper)的实现 namespace是接口的位置 resultType是返回类型 -->
<mapper namespace="cn.mianju.dao.UserDao" resultType="cn.mianju.pojo.User">
<!-- id是接口的方法名 需要一致 -->
<select id="getUserList">
select * from mybatis.user
</select>
</mapper>
整体结构:
然后就可以去使用Junit进行一下测试
package cn.mianju.dao;
import cn.mianju.pojo.User;
import cn.mianju.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class UserDaoTest {
@Test
public void test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
List<User> userList = mapper.getUserList();
System.out.println(userList);
//关闭
sqlSession.close();
}
}
//[User{id=1, name='aaa', pwd='bbb'}, User{id=2, name='ccc', pwd='ddd'}]
可能会遇到的问题:
可能会遇到没有注册Mapper xml文件
org.apache.ibatis.binding.BindingException: Type interface cn.mianju.dao.UserDao is not known to the MapperRegistry.
在mybatis-config.xml文件中的注册对应的mapper.xml
<mappers>
<mapper resource="cn/mianju/dao/UserMapper.xml"/>
</mappers>
可能会遇到找不到xml的问题
Could not find resource cn/mianju/dao/UserMapper.xml
这是在Maven中 约定大于配置 的特性 需要在过滤器中设置 添加好以后记得刷新Maven
<!--在build中配置resources,来防止我们资源导出失败的问题-->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
增删改查(CRUD)
增(insert)
xml:
<insert id="insertUser" parameterType="cn.mianju.pojo.User">
insert into user (id, name, pwd)
values (#{id},#{name},#{pwd});
</insert>
java:
@Test
public void insert(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.insertUser(new User(3,"111","222"));
sqlSession.commit();
sqlSession.close();
}
删(delect)
xml:
<delete id="deleteUser" parameterType="int">
delete
from user
where id = #{id};
</delete>
java:
@Test
public void delect(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int i = mapper.deleteUser(3);
sqlSession.commit();
sqlSession.close();
}
改(update)
xml:
<update id="updateUser" parameterType="cn.mianju.pojo.User">
update user
set name = #{name},
pwd = #{pwd}
where id = #{id};
</update>
java:
@Test
public void update(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int i = mapper.updateUser(new User(2, "eee", "fff"));
sqlSession.commit();
sqlSession.close();
}
查(select)
xml:
<select id="getUserList" resultType="cn.mianju.pojo.User">
select * from mybatis.user
</select>
java:
@Test
public void test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.getUserList();
System.out.println(userList);
//关闭
sqlSession.close();
}
流程
编写接口
编写xml中的sql 实现接口的方法
运行测试
参数解析
resultType:返回值类型
parameterType :参数类型
传递sql中需要用到的参数
基本类型参数可以省略这部分声明类型
如果需要传递多个参数,请使用Map来传递 或者注解
在SQL中写入对应的key 就可以获取Map中key对应的value值
id:对应接口中的 需要重写的方法名