MyBatis基础学习
提示:以下是本篇文章正文内容,下面案例可供参考
Mybatis
戳这!!!
中文版官方文档
1、基本概念
- mybatis是 MyBatis SQL Mapper Framework for Java (sql映射框架),可以把数据库表中的一行数据 映射为 一个java对象。一行数据可以看做是一个java对象。操作这个对象,就相当于操作表中的数据
- mybatis是一个sql映射框架,提供的数据库的操作能力。增强的JDBC,使用mybatis让开发人员集中写sql就可以了,不必关心Connection,Statement,ResultSet的创建,销毁,sql的执行。
- 开发人员提供sql语句–>mybatis处理sql—>开发人员得到List集合或java对象(表中的数据)
2、主要类介绍
-
Resources: mybatis中的一个类, 负责读取主配置文件
import org.apache.ibatis.io.Resources; InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
-
SqlSessionFactoryBuilder : 创建SqlSessionFactory对象
import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.ibatis.session.SqlSessionFactory; SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //创建SqlSessionFactory对象 SqlSessionFactory factory = builder.build(in);
-
SqlSessionFactory : 重量级对象, 程序创建一个对象耗时比较长,使用资源比较多。在整个项目中,有一个就够用了。
SqlSessionFactory:接口,接口实现类: DefaultSqlSessionFactory,SqlSessionManager SqlSessionFactory作用: 获取SqlSession对象 SqlSession sqlSession = factory.openSession(); openSession()方法说明: openSession() :无参数的, 获取是非自动提交事务的SqlSession对象 openSession(boolean): openSession(true) 获取自动提交事务的SqlSession. openSession(false) 非自动提交事务的SqlSession对象
-
SqlSession
SqlSession接口 :定义了操作数据的方法,例如: selectOne(),selectList(),selectMap(),insert(),update(), delete(), commit(), rollback() SqlSession接口的实现类: DefaultSqlSession,SqlSessionManager
3、mybatis使用步骤
mybatis使用步骤:
(1)定义dao接口 ,StudentDao
(2)定义mapper文件 StudentDao.xml
(3)定义mybatis的主配置文件 mybatis-config.xml
(4)创建dao的代理对象,使用mybatis的动态代理机制, 使用SqlSession.getMapper(dao接口),获取dao接口对于的实现类对象, StudentDao dao = SqlSession.getMapper(StudentDao.class);
(5) 调用方法:List students = dao.selectStudents();
要使用dao对象,需要使用getMapper()方法,
怎么能使用getMapper()方法,需要哪些条件
(1)获取SqlSession对象, 需要使用SqlSessionFactory的openSession()方法。
(2)创建SqlSessionFactory对象。 通过读取mybatis的主配置文件,能创建SqlSessionFactory对象
4、测试
结构:
导入相关依赖
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<!--单元测试-->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!--mysql依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
</dependencies>
<build>
<!-- 将配置文件在部署编译时,自动放到类路径下,即classes路径下 -->
<resources>
<resource>
<directory>src/main/java</directory><!--所在的目录-->
<includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory><!--所在的目录-->
<includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
- 创建student表,表结构如下,id 设为主键,不自动增长
- 创建与表 student 对应的实体类 Student
public class Student { private Integer id; private String name; private String email; private Integer age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Student{" + "id=" + id + ", name='" + name + '\'' + ", email='" + email + '\'' + ", age=" + age + '}'; } }
- 定义dao接口 ,StudentDao
import java.util.List; public interface StudentDao { // 查询所有学生信息 List<Student> selectStudents(); // 插入一条学生信息 int insertStudent(Student student); }
- 定义mapper文件 StudentDao.xml,如果使用IDEA必须放在 resources 目录下
<?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.example.dao.StudentDao"> <!-- <select>: 查询数据, 标签中必须是 select 语句 id: sql 语句的自定义名称,推荐使用 dao 接口中方法名称, 使用名称表示要执行的 sql 语句 resultType: 查询语句的返回结果数据类型,使用全限定类名 1. id="selectStudents" 中 id 的赋值,是上面接口对应的方法名称 2. id,name,email,age 名字和实体类 Student 定义的属性保持一致 --> <!-- resultType 这里填写你的返回值类型,一般是一个java对象 --> <!-- com.example.domain.Student--> <select id="selectStudents" resultType="com.example.domain.Student"> <!--要执行的 sql 语句--> select id,name,email,age from student order by id </select> <!-- 插入数据 --> <insert id="insertStudent" > insert into student values(#{id},#{name},#{email},#{age}) </insert> <!-- 更新数据 --> <update id="updateStudent"> update student set age = 18 where id=#{id} </update> <!-- 删除数据 --> <delete id="deleteStudent"> delete from student where id=#{id} </delete> </mapper>
- 定义mybatis的主配置文件 mybatis-config.xml
在此之前可以把连接mysql 数据库的四个属性及属性值封装到一个文件中,命名为:db.properties
主配置文件 mybatis-config.xml# 数据库连接的4个基本要素 jdbc.user=root jdbc.password=123456 # mysql 5 #driverClass=com.mysql.jdbc.Driver # mysql 8 # 可以设置字符集 jdbc.url=jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC&characterEncoding=utf8 jdbc.driverClass=com.mysql.cj.jdbc.Driver
<?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> <!-- 指定连接 mysql 数据库的信息 --> <properties resource="db.properties"/> <!-- 配置日志功能 mybatis.xml 文件加入日志配置,可以在控制台输出执行的 sql 语句和参数 必须在 标签 environments前 --> <settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> <!-- 定义别名 --> <typeAliases> <!-- 这个包下的所有类,类名就是别名,不区分大小写 可以有多个package,此方式比较多 --> <package name="com.example.domain"/> <package name="com.example.vo"/> <!-- 第一种方式--> <!-- <typeAlias type="com.example.domain.Student" alias="Student"/>--> </typeAliases> <environments default="development"> <!-- environments default="development" 取别名,自定义--> <environment id="development"> <!-- transactionManager:mybatis提交事务,回顾事务的方式 type: 事务的处理的类型 1)JDBC : 表示mybatis底层是调用JDBC中的Connection对象的,commit, rollback 2)MANAGED : 把mybatis的事务处理委托给其它的容器(一个服务器软件,一个框架(spring)) --> <transactionManager type="JDBC"/> <!-- dataSource:表示数据源,java体系中,规定实现了javax.sql.DataSource接口的都是数据源。 数据源表示Connection对象的。 在项目中一般使用阿里提供的 druid 作为 dataSource type:指定数据源的类型 1)POOLED: 使用连接池, mybatis会创建PooledDataSource类 2)UPOOLED: 不使用连接池, 在每次执行sql语句,先创建连接,执行sql,在关闭连接 mybatis会创建一个UnPooledDataSource,管理Connection对象的使用 3)JNDI:java命名和目录服务(windows注册表) --> <!-- type="POOLED" 表示使用连接池 --> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driverClass}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.user}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <!-- sql mapper(sql映射文件)的位置--> <mappers> <!--第一种方式:指定多个mapper文件--> <!--<mapper resource="com/example/dao/StudentDao.xml"/> <mapper resource="com/example/dao/OrderDao.xml" />--> <!--第二种方式: 使用包名 name: xml文件(mapper文件)所在的包名, 这个包中所有xml文件一次都能加载给mybatis 使用package的要求: 1. mapper文件名称需要和接口名称一样, 区分大小写的一样 2. mapper文件和dao接口需要在同一目录 --> <package name="com.example.dao"/> <!-- <package name="com.example.dao2"/> <package name="com.example.dao3"/>--> </mappers> </configuration>
- 创建工具类,获取 SqlSession 对象
package com.example.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 factory = null; static { // 从类路径开始读 String config="mybatis-config.xml"; // 需要和你的项目中的文件名一样 try { // 读取主配置文件 InputStream in = Resources.getResourceAsStream(config); //创建SqlSessionFactory对象,使用SqlSessionFactoryBuild factory = new SqlSessionFactoryBuilder().build(in); } catch (IOException e) { e.printStackTrace(); } } //获取SqlSession的方法 public static SqlSession getSqlSession() { SqlSession sqlSession = null; if( factory != null){ // 获取SqlSession sqlSession = factory.openSession();// 非自动提交事务 // factory.openSession(true); // 自动提交事务,默认为 false } return sqlSession; } }
- 测试类
结果:package com.example; import com.example.dao.StudentDao; import com.example.domain.Student; import com.example.utils.MyBatisUtils; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.util.List; public class TestMyBatis { @Test public void testSelectStudents(){ /** * 使用mybatis的动态代理机制, 使用SqlSession.getMapper(dao接口) * getMapper能获取dao接口对于的实现类对象。 */ // 获取SqlSession SqlSession sqlSession = MyBatisUtils.getSqlSession(); StudentDao dao = sqlSession.getMapper(StudentDao.class); //dao=com.sun.proxy.$Proxy5 jdk的动态代理 System.out.println("dao="+dao.getClass().getName()); //调用dao的方法, 执行数据库的操作 List<Student> students = dao.selectStudents(); for(Student stu: students){ System.out.println("学生="+stu); } } @Test public void testInsertStudent(){ SqlSession sqlSession = MyBatisUtils.getSqlSession(); StudentDao dao = sqlSession.getMapper(StudentDao.class); Student student = new Student(); student.setId(1006); student.setName("赵四"); student.setEmail("zhaosi@qq.com"); student.setAge(28); int nums = dao.insertStudent(student); sqlSession.commit(); // 如果不手动提交,则不会修改数据库的内容 System.out.println("添加对象的数量:"+nums); } }
查询
插入,但不提交事务,把测试代码sqlSession.commit();
注释掉
插入,并且提交事务
最后,可能会有小部分同学,明明导包了,并且配置文件也放到指定目录了,但报错还是找不到,解决方法:
- 重新加载pom.xml文件
- 重新编译构建项目
在右边导航边找到 Maven ,点到自己的项目,先clean,此时左边项目中的 target 会删除,在点击compile,重新编译,会再出现target目录
总结
谢谢大家的阅读,欢迎指出错误~~
如果觉得博主写的过的去,不如点个赞,嘿嘿