还是老规矩看一下百度百科中的解释:
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
听着很迷糊,看着文字也迷糊。不过这个这个适合有一个疑问了,mybatis既然是一个框架,那么其与jdbc有什么区别呢?不多是链接数据库吗?
其实mybatis是对jdbc的依次再包装,有点像是工具库类commons-dbutils的升级,然而其可以通过配置文件和映射来方便我们操作数据库。
其实这些都是理论是迷糊的,还是老规矩直接用实例进行简单演示。
前提
因为采用的maven进行的实例演示,所以需要对IDE中创建maven显目,以及maven是什么需要简单的了解,这个可以看我写的关于maven了解的基础文章。
而下面进行配置的适合通过修改pom.xml进行环境依赖。当然如果不想这样,还是喜欢下载jar包,然后进行配置也行。
-
导入mysql的java驱动包。毕竟连接数据库,无论使用什么框架都需要有这个基础。
根据自己的数据库版本,进行配置。
因为安装的mysq5.0版本,所以驱动也是对应的,这个需要再pom.xml中配置
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.37</version> </dependency>
-
导入mybatis的依赖包
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency>
-
在mysql中创建数据库以及表。
CREATE DATABASE `testmybatis` ; USE `testmybatis`; DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `SNAME` varchar(10) default NULL, `SAGE` int(3) default NULL, `SSEX` varchar(2) default NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO testmybatis.student (SNAME, SAGE, SSEX)VALUES('张三', '17', '男');
环境进行配置,然后下面进行简单演示。
实例演示
配置文件
核心配置文件
核心配置文件一般也是一个xml,其习惯命名为mybatis-config.xml。而这个文件名如果项目有其它名字,也可以。在后面和spring进行整合的话,配置文件可以省略的。
核心配置文件的具体作用是配置连接环境以及mybatis的全局配置信息。
因为我使用的maven创建的项目,所以配置文件在:
其具体简单格式如下:
<?xml version="1.0" encoding="utf-8"?>
<!--配置文件中可以使用哪些标签,这个地方是配置这是一个mybatis文件,使用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://localhost:3306/testmybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- <mapper resource="映射文件这个地方配置sql语句,后面具体演示"></mapper>-->
<mapper resource="mappers/StudentMapper.xml"></mapper>
</mappers>
</configuration>
其实这个配置信息,具体配置是什么作用就行,如果非要记住也可以,也可以黏贴复制使用。
操作的mapper接口类
前面核心配置文件说需要导入映射文件,这个对用的之前聊的DAO,也就是对数据库进行操作的类,其实又有不同的地方,每个mapper的类都是接口也仅仅接口,不需要具体实现的类。虽然类不需要但是其需要的是mapper配置的文件。
具体的mapper接口内容:
package com.xzd.mapper;
public interface StudentMapper {
int insertStudent();
}
创建mybatis映射(mapper)文件
补充概念-----ORM
ORM其全英文是Object Relationship Mapper, 其意思是一种对象关系映射。
- 对象(Object):java实体类对象。
- 关系(Relationship): 关系型数据库
- 映射(Mapper): 二者之间的对应关系。
其实Java终端一些概念和数据库中的概念,在映射的时候如下:
java概念 | 数据库概念 |
---|---|
类 | 表 |
属性 | 字段 |
对象 | 某行记录 |
映射文件
映射文件也是一个xml,前面说了mapper类只是接口没有实现类,但是具体的一些对数据库操作的sql却似写在映射文件中的。
但是这个时候又有一些规则:
-
映射文件的命名规则
数据库中对应的实体类的类名+Mapper.xml, 比如我的例子中数据库表student,但是其对应的类是Student,所以配置映射文件为StudentMapper.xml。
-
这里又有两个一致
- 其实为了方便在写映射类(StudentMapper.java)的时候两者名字一样,只是后缀不一样。
- 映射类(StudentMapper.java)中的方法,和映射文件中的id一直保持一致。这个说话有点绕,具体看配置文件可知。
配置文件:
<?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.xzd.mapper.StudentMapper">
<!-- 这个配置文件id和 mapper类中的方法一样-->
<insert id="insertStudent">
INSERT INTO testmybatis.student VALUES('赛貂蝉', '15', '女')
</insert>
</mapper>
测试类
这个就直接写测试类,是官网文档的api的使用:
package com.xzd.test;
import com.xzd.mapper.StudentMapper;
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 java.io.IOException;
import java.io.InputStream;
public class Test_mabtis {
@Test
public void test1() throws IOException {
// 通过IO操作配置文件 所以说这个配置文件可以改名字,一般默认是mybatis-config.xml
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
// SqlSession类似与jdb中connection,但是其通过SqlSession工厂而创建的,而这个工厂却是通过工厂的构造类SqlSessionFactoryBuilder得到工厂
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 返回SqlSessionFactory
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
// 得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 这个通过代理模式,传入什么类返回什么类
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
// 这个回执行映射文件中的插入语句
int result = studentMapper.insertStudent();
// 上面两句其实可以合成一句来实现
// 这个参数就是直接将<mapper namespace="com.xzd.mapper.StudentMapper"> 和<insert id="insertStudent">结合起来
// int result1 = sqlSession.insert("com.xzd.mapper.StudentMapper.insertStudent");
System.out.println(result);
// 默认事务是打开的,所以需要提交
sqlSession.commit();
// 关闭sqlSession
sqlSession.close();
}
}
然后执行可以插件数据库:
补充
先不说传递参数问题先让sql语句定死。增删改在定死的时候差不多,需要在配配置文件上进行设置返回类型:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H4qjbVS4-1673268828283)(F:\文档\笔记\java\MyBatis\1:mybatis简介.assets\image-20230109205203435.png)]
例子伪代码
<?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.xzd.mapper.StudentMapper">
<!-- 这个配置文件id和 mapper类中的方法一样-->
<insert id="insertStudent">
INSERT INTO testmybatis.student
VALUES ('赛貂蝉', '15', '女')
</insert>
<select id="getStudent" resultType="com.xzd.domain.Student">
SELECT * FROM testmybatis.student WHERE SNAME='张三'
</select>
<select id="getAllStudent" resultType="com.xzd.domain.Student">
SELECT * FROM testmybatis.student
</select>
</mapper>
package com.xzd.mapper;
import com.xzd.domain.Student;
import java.util.List;
public interface StudentMapper {
int insertStudent();
Student getStudent();
List<Student> getAllStudent();
}
调用代码一样,就不再演示了,直接看结果了。