文章目录
前言
随着互联网技术的快速发展,对于我们这些java开发工程师的而言每一个web项目都离不开框架的使用,在刚结束掉第一阶段的JavaSE的学习后,现在正式开始进军Java进阶篇,以下是本人最近几日通过自学学到的一些关于SSM框架中MyBatis框架的知识,通过对一些简单的操作来进行一个学习总结,如果有帮助,请留下一个大指姆以示鼓励~~~
提示:以下是本篇文章正文内容,下面案例可供参考
一、框架的介绍
(1)框架的概念
介绍:所谓框架,我们可以把它看做是软件的半成品,它完成了软件开发过程中通用的操作,程序员仅仅需要少有的加工过程即可,从而减少了开发者的步骤以此提高了开发效率。
(2)常见的框架(服务端)
2.1、MVC框架部分
说明:简化Servelet开发步骤的框架,主要是与服务器打交道,常见的框架有以下:
- Struts2
- SpringMVC
2.2、持久层框架部分
说明:该框架主要是完成对数据库的操作,几乎替代了JDBC技术的使用,常见的框架有以下:
- apache DBUtils
- Hibernate
- Spring JPA
- MyBatis
2.3、胶水框架
说明:顾名思义,用于粘合的框架,该部分的内容会较多,需要熟悉的话,建议去百度,一时半会儿我也扯不清。该类的具体框架如下:
- Spring
(3)SSM框架是什么?
在当前的JavaWeb(企业级信息系统开发+互联网开发)开发领域每个工程师都需要掌握与熟知的一项框架技术,SSM框架具体是指 MVC 框架中的 SpringMVC ,持久层框架中的MyBatis框架 以及 Spring框架作为其胶水框架,用于粘合SpringMVC与 MyBatis ,因此 SSM=SpringMVC+Spring+MyBatis。 今天我带来的内容是其中的MyBatis框架的简单介绍与使用。
二、MyBatis框架的介绍与使用
(1)MyBatis框架的介绍
1、MyBatis框架的前身是iBatis框架,他是一个半自动的ORM框架
2、ORM的介绍:ORM(Object Relational Mapping)对象关系映射时,将Java中的一个对象与数据表中的记录一 一对应。ORM框架提供了实体类与数据类表的映射关系通过映射文件(mapper.xml,类似于接口的实现类接下来会讲)的配置实现对象的持久化。
(2)MyBatis框架的特点
1、支持自定义SQL存储过程
2、对原有的JDBC代码进行封装,几乎消除了所有JDBC代码,让开发者只关注SQL本身
3、支持XML与注解配置方式自定义完成ORM操作,从而实现了映射。
映射的说明:所谓映射就是对象的属性对应的数据表的列的关系。(如果不明白,后面通过案例说明)
三、MyBatis框架的使用
说了这么多,接下来 我们就开始正式走进它吧~~
(1)MyBatis框架的部署(即:将框架引入到我们的项目中)
1.1、创建Maven项目
项目结构如下
1.2、在pom.xml中添加需要的依赖
所需要的依赖都可以在官网去下载,作为一个开发者要熟知这些操作
官网地址:https://mvnrepository.com/
添加需要的Mysql依赖,之前说过了MyBatis是一个ORM框架,主要是与数据库打交道的所以我们需要对应的数据库依赖
添加需要的Mybais依赖(与上面的操作一样)
这里 由于我已经写好了项目,我就将所有需要配置的依赖全部发出来吧,方便后面的项目运行
<?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.yzy</groupId>
<artifactId>mybatis-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
1.3、创建一个数据表的实验对象【可以使用可视化工具Navicat】
创建一个学生表 tb_students
可视化结果
1.4、创建MyBatis配置文件【mybatis-config】(后期需要使用的数据源)
在resource中创建 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>
<!--在environment配置数据库连接信息-->
<!--在environment标签中可以定义多个environment标签,每个environment标签都可以定义一套连接配置-->
<!--default属性,用来指定使用哪个environment标签-->
<!---->
<environments default="mysql">
<environment id="mysql">
<!--transactionManager标签用于配置数据库管理方式-->
<transactionManager type="JDBC"></transactionManager>
<!--dataSouce标签用来配置数据库连接信息-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/java2107?characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--将映射文件StudentMapper添加到主配置文件mybatis-config.xml文件中-->
<mappers>
<mapper resource="mappers/StudentMapper.xml"></mapper>
</mappers>
</configuration>
1.5 创建实体类对象【Student】与 DAO接口【StudentDAO】
实体类Student对象代码如下
@Data
@AllArgsConstructor//带有全部参数的构造器
@NoArgsConstructor//带有无参的构造器
@ToString//ToString 方法
public class Student {
/**
* 注意 实体类中的属性要与数据库中的字段类型与数量相匹配
*/
private int stuId;
private String stuNum;
private String stuName;
private String stuGender;
private int stuAge;
}
StudentDAO接口
public interface StudentDAO {
//MyBatis 进行操作
/*
1、如果操作方法具有一个简单的类型或者字符串类型的参数,在Mapper配置中可以直接通过#{str}直接获取
2、如果操作方法有一个对象类型的参数,在Mapper配置中可以直接通过#{attrName}获取对象的指定属性值(attrName必须是参数对象的属性)
3、如果操作方法有一个Map类型的参数,在Mapper配置中可以直接通过#{key}获取key对应的value
4、如果操作方法有多个参数,..........
*/
public int insertStudent(Student student);
public int deleteStudent(int stuId);
public int updateStudent(Student student);
public List<Student> listStudents();
public Student queryStudent(String stuNum);
public List<Student> listStudentsByPage(@Param("start") int start,
@Param("pageSize") int pageSize);
//获取数据数目
public int count();
}
1.6、创建DAO接口的映射文件
在rusource文件下创建mapper文件夹,再在文件夹下创建【StudentMapper.xml】
StudentMapper.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文件相当于DAO接口的“实现类” ,namespace属性要制定实现的DAO接口的全限定名-->
<mapper namespace="com.yzy.dao.StudentDAO"><!--namespace 后面跟需要实现的接口对象的路径 -->
<!--useGeneratedKeys 设置添加操作是否需要回填生成的主键-->
<!--keyProperty 设置会填的主键值赋值到参数对象的那个属性-->
<insert id="insertStudent" useGeneratedKeys="true" keyProperty="stuId">
insert into tb_students(stu_num,stu_name,stu_gender,stu_age)
values (#{stuNum},#{stuName},#{stuGender},#{stuAge})
</insert>
<delete id="deleteStudent" >
delete from tb_students where stu_num=#{stuNum}
</delete>
<update id="updateStudent">
update tb_students
set
stu_name=#{stuName},
stu_gender=#{stuGender},
stu_age=#{stuAge}
where
stu_Num=#{stuNum}
</update>
<!--resultType 指定该查询结果封装的对象的实体类-->
<!--resuletSets 指定当前的操作返回的集合类型(可以省略)-->
<!--第一种查询方式
<select id="listStudents" resultType="com.yzy.pojo.Student" >
select sid stuId,stu_num stuNum,stu_name stuName,stu_gender stuGender,stu_age stuAge
from tb_students
</select>
-->
<!--第二种查询方式 ,通过定义映射关系-->
<!--resultMap用于定义实体类与数据表与数据表的映射关系(ORM)-->
<resultMap id="studentMap" type="com.yzy.pojo.Student">
<id column="sid" property="stuId"/>
<result column="stu_num" property="stuNum"/>
<result column="stu_name" property="stuName"/>
<result column="stu_gender" property="stuGender"/>
<result column="stu_age" property="stuAge"/>
</resultMap>
<!--resultMap 用于引用一个实体的映射关系,当配置resultMap之后 resultType就可以省略-->
<select id="listStudents" resultMap="studentMap" >
select sid ,stu_num,stu_name ,stu_gender ,stu_age
from tb_students
</select>
<select id="queryStudent" resultMap="studentMap">
select sid,stu_num,stu_name,stu_gender,stu_age from tb_students where sid=#{stuNum}
</select>
<select id="listStudentsByPage" resultMap="studentMap">
select sid,stu_num,stu_name,stu_gender,stu_age
from tb_students
limit #{start},#{pageSize}
</select>
<select id="count" resultType="int">
select count(1) from tb_students
</select>
</mapper>
说明:StudentMapper.xml文件下的 id中的名字必须和DAO接口中的抽象方法名字一模一样
四、单元测试(测试以上的代码)
添加单元测试的依赖(前面已经把所有需要的依赖全部发了出来)
测试 insertStudent
@Test
public void insertStudent() {
//加载MyBatis配置文件
//会话(连接)
SqlSession sqlSession= MyBatisUtil.getSqlSession();
//通过会话获取DAO对象
StudentDAO studentDAO=sqlSession.getMapper(StudentDAO.class);
//测试studentDAO中的方法
int i=studentDAO.insertStudent(new Student(0,"00003","陈留","女",22));
sqlSession.commit();//进行事务提交
System.out.println("受影响的行数:"+i);
}
测试deleteStudent
@Test
public void deleteStudent() {
//加载MyBatis配置文件
try {
//获取数据源
InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
//会话工厂 SqlSessionFactory表示MyBatis的会话工厂
SqlSessionFactory factory=builder.build(is);
//会话(连接),SqlSession代表着Mybatis与数据的会话,所谓会话就是 连接 的意思,而SqlSession是通过工厂会话模式获取
SqlSession sqlSession=factory.openSession();
//通过会话获取DAO对象,通过MyBatis提供的sqlSession调用getMapper获取DAO接口对象,括号中填 需要 具体指向的DAO对象
StudentDAO studentDAO=sqlSession.getMapper(StudentDAO.class);
//测试studentDAO中的方法
int i=studentDAO.deleteStudent(1);
sqlSession.commit();//进行事务提交
System.out.println("受影响的行数:"+i);
} catch (IOException e) { e.printStackTrace();
}
}
测试updateStudent
@Test
public void updateStudent(){
//修改表记录
try {
InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
//会话工厂
SqlSessionFactory factory=builder.build(is);
//会话(连接)
SqlSession sqlSession=factory.openSession();
//通过会话获取DAO对象
StudentDAO studentDAO=sqlSession.getMapper(StudentDAO.class);
//测试studentDAO中的方法
int i=studentDAO.updateStudent(new Student(0,"00001","王文","女",20));
sqlSession.commit();//进行事务提交
System.out.println("受影响的行数:"+i);
} catch (IOException e) {
e.printStackTrace();
}
}
测试listStudents
@Test
public void listStudents(){
//查询表中信息
try {
InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
//会话工厂
SqlSessionFactory factory=builder.build(is);
//会话(连接)
SqlSession sqlSession=factory.openSession();
//通过会话获取DAO对象
StudentDAO studentDAO=sqlSession.getMapper(StudentDAO.class);
List<Student> list = studentDAO.listStudents();
for (Student lis: list) {
System.out.println(lis);
}
} catch (IOException e) {
e.printStackTrace();
}
}
测试 QueryStudents
@Test
public void QueryStudents(){
//根据组件查询一条信息
try {
InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
//会话工厂
SqlSessionFactory factory=builder.build(is);
//会话(连接)
SqlSession sqlSession=factory.openSession();
//通过会话获取DAO对象
StudentDAO studentDAO=sqlSession.getMapper(StudentDAO.class);
Student student = studentDAO.queryStudent("00001");
System.out.println(student);
} catch (IOException e) {
e.printStackTrace();
}
}
测试listStudentByPage
@Test
public void listStudentByPage(){
try {
//1、获取数据源
InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
//2、通过sql对话创建者工厂创建一个 build对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3、通过工厂创建者对象 builder 来创建一个 会话工厂
SqlSessionFactory factory = builder.build(is);
//4、通过会话工厂来连接会话
SqlSession sqlSession = factory.openSession();
//5、通过会话获取DAO对象,通过MyBatis提供的sqlSession调用getMapper获取DAO接口对象的class文件,括号中填 需要 具体指向的DAO对象
StudentDAO studentDAO = sqlSession.getMapper(StudentDAO.class);
List<Student> students = studentDAO.listStudentsByPage(0, 3);
for (Student list: students) {
System.out.println(list);
}
} catch (IOException e) {
e.printStackTrace();
}
}
测试getCount
@Test
public void getCount(){
try {
//1、获取数据源
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//2、通过工厂创建者来创建一个会话工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3、通过工厂创建者builder来创建一个会话
SqlSessionFactory factory = builder.build(is);
//4、通过会话工厂对象来创建sql会话
SqlSession sqlSession = factory.openSession();
//5、通过sqlSession来获取StudentDAO类的映射文件
StudentDAO studentDAO = sqlSession.getMapper(StudentDAO.class);
int nums = studentDAO.count();
System.out.println("数据库中的学生一共有:"+nums);
} catch (IOException e) {
e.printStackTrace();
}
}
# 补充部分 >封装工具类 >说明:该部分为扩展部分,看不懂不强求,毕竟今天的内容是简单了解MyBatis即可,这个工具类是为了方便代码的使用,为了简化在测试类中对工厂部分的简化,其中第一个插入方法我已经使用了这个工具类,是能运行的。该方法的操作流程类似于JDBC的封装技术
package com.yzy.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 MyBatisUtil {
private static SqlSessionFactory factory;
private static final ThreadLocal<SqlSession> local=new ThreadLocal<SqlSession>();
static {
try {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
//会话工厂
factory=builder.build(is);
}catch (IOException e){
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
SqlSession sqlSession= local.get();
if (sqlSession == null){
sqlSession=factory.openSession();
local.set(sqlSession);
}
return sqlSession;
}
public static <T extends Object> T getMapper(Class<T> c){
SqlSession sqlSession=getSqlSession();
return sqlSession.getMapper(c);
}
}
总结
如果代码和我是一样的话,应该不会出什么问题,如果有问题就留下评论,我会及时回复。