深入MyBatis-使用入门
前言
一、MyBatis是什么?
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
二、使用步骤
1.创建普通的Maven项目
2.引入依赖
代码如下(示例):
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.it.panghu</groupId>
<artifactId>mybatis-research</artifactId>
<version>1.0.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
目前MySQL版本和驱动版本之间对应关系
Connection/J version | JDBC version | MySQL Server version | JDK version |
---|---|---|---|
5.1 | 3.0,4.0,4.1,4.2 | 5.6,5.7,8.0 | JDK5以上 |
8.0 | 4.2 | 5.6,5.7,8.0 | JDK8以上 |
3.创建对应的数据表
脚本如下(示例):
CREATE TABLE `blog`
(
`id` bigint NOT NULL AUTO_INCREMENT,
`author` varchar(255) DEFAULT NULL,
`title` varchar(255) DEFAULT NULL,
`content` varchar(255) DEFAULT NULL,
`createDate` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
4.与表对应的实例
package com.it.panghu.domain;
import java.io.Serializable;
import java.util.Date;
public class Blog implements Serializable {
private long id;
private String author;
private String title;
private String content;
private Date createDate;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
}
5.创建Mapper接口
package com.it.panghu.mapper;
import com.it.panghu.domain.Blog;
public interface BlogMapper {
/**
* 新增blog
* @param blog Blog
* @return 成功插入行数
*/
int insertBlog(Blog blog);
/**
* 根据id查询blog
* @param id long
* @return 查询结果
*/
Blog selectBlogById(long id);
/**
* 更新blog内容
* @param blog Blog
* @return 更新条数
*/
int updateBlog(Blog blog);
/**
* 根据id删除blog
* @param id long
* @return 删除条数
*/
int deleteBlog(long id);
}
6.编写配置文件
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>
<settings>
<!-- 设置日志输出为LOG4J -->
<!-- <setting name="logImpl" value="LOG4J" />-->
<!--将以下画线方式命名的数据库列映射到 Java 对象的驼峰式命名属性中-->
<setting name= "mapUnderscoreToCamelCase" value="true" />
</settings>
<!--简化类命名空间 -->
<typeAliases>
<package name="com.it.panghu.domain" />
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="UNPOOLED">
<!-- <property name="driver" value="com.mysql.jdbc.Driver" />-->
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/blogs?useSSL=false" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- <package name="com.it.panghu.mapper"/>-->
<!-- <mapper resource="mapper/BlogMapper.xml"></mapper>-->
<mapper class="com.it.panghu.mapper.BlogMapper"></mapper>
</mappers>
</configuration>
BlogMapper.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">
<mapper namespace="com.it.panghu.mapper.BlogMapper">
<insert id="insertBlog" parameterType="Blog">
insert into blog(author, title, content, createDate)
values (#{author}, #{title}, #{context}, #{createDate})
</insert>
<select id="selectBlogById" parameterType="java.lang.Long" resultType="Blog">
select *
from blog
where id = #{id}
</select>
<update id="updateBlog" parameterType="Blog">
update blog
<set>
<if test="author != null">author=#{author}</if>
<if test="title != null">author=#{title}</if>
<if test="context != null">author=#{context}</if>
</set>
where id=#{id}
</update>
<delete id="deleteBlog" parameterType="Blog">
delete from blog where id=#{id}
</delete>
</mapper>
首先有几点是必须要注意的,不然就会莫名其妙的出现batis.binding.BindingException: Invalid bound statement (not found)这个问题:
-
DAO 接口名一定要与 Mapper 文件的名称一模一样
-
Mapper 文件中的 namespace 路径一定要与 DAO 接口的路径一致
-
还有一点特别重要,即 Mapper 文件必须要放置到 resources 目录中,否则不会被编译
-
resources 目录中的 Mapper 文件的路径一定要与 DAO 接口的路径完全一致
-
使用idea在resource文件中创建目前时,需要注意目录层次结构
7.测试类
package com.it.panghu.tests;
import com.it.panghu.domain.Blog;
import com.it.panghu.mapper.BlogMapper;
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.Assert;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
public class MapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void before() {
String resource = "mybatis-config.xml";
try {
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 基于StatementId的方式去执行SQL
* <mapper resource="mapper/BlogMapper.xml"></mapper>
*/
@Test
public void mapperResourceTest() {
try (SqlSession session = sqlSessionFactory.openSession()) {
Blog blog = session.selectOne("com.it.panghu.mapper.BlogMapper.selectBlogById", 1L);
Assert.assertNotNull(blog);
Assert.assertEquals(blog.getId(), 1);
}
}
@Test
public void mapperClassTest() {
try (SqlSession session = sqlSessionFactory.openSession()) {
BlogMapper blogMapper = session.getMapper(BlogMapper.class);
Blog blog = blogMapper.selectBlogById(1L);
Assert.assertNotNull(blog);
Assert.assertEquals(blog.getId(), 1);
}
}
}
总结
以上就是今天要讲的内容,本文仅仅简单介绍了MyBatis的使用,而Mybatis最简单的持久化框架,简单易学。SQL代码从程序代码中彻底分离出来,可以重用,提供XML标签,支持编写动态SQL;提供映射标签,支持对象与数据库的ORM字段关系映射支持缓存、连接池、数据库移植;与JDBC相比,减少了50%的代码量。