之前我们学习了Java SSM的第一部分Spring,如果有需要了解的小伙伴,可以点击:Java SSM学习(一)_不会Java的MING的博客-CSDN博客
现在我们来学习一下第二部分MyBatis。
1,概述
MyBatis是一款ORM持久层框架,它支持定制化 SQL、存储过程以及高级映射。它的学习你首先需要对JDBC有一定的学习,因为MyBatis就是将JDBC需要手动写参数和获取结果集的操作进行简化,只用使用Maven和xml文件就可以实现将接口和Java中的对象映射为数据库之中的数据。
2,写MyBatis项目
(1)导入依赖
我们就不使用jar来导入依赖,我们直接创建项目,然后使用Maven导入依赖,将一下代码复制粘贴进程序就可以(不用去记忆,大概看一下需要的依赖,记不住也没关系,网上一找全都是资源):
<dependencies>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.11</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<!--servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!--jsp-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<!--jstl-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
</dependencies>
(2)编写Mybatis项目
完成第一步我们就可以开始动手写一个MyBatis的项目,首先,我们需要编写MyBatis的配置文件,这个需要我们建立一个xml文件,然后复制粘贴官网之中的内容就可以了,中文文档网站:https://mybatis.org/mybatis-3/zh/configuration.html(也可以复制我以下的内容),官网给的MyBatis的教程也是非常的清楚。
<?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 default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/tsglxt"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper url="file:TestMapper.xml"/>
</mappers>
</configuration>
我们只用注意datasource之中的内容就可以,数据源,默认是pooled,数据库连接池,其中的四个property是我们需要修改的地方,第一个‘driver’驱动,我们就将我们MySQL的驱动位置填写在此处;第二个’url‘数据库连接,我们可以先链接数据库,然后直接复制url,第三个第四个就是用户名和密码,设置成功就完成了连接。
其中,mappers是Mapper映射器,其目的就是为了让根目录下的mapper映射文件可以正常运行,接下来就是mapper映射文件,TestMapper.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="TestMapper">
<select id="selectStudent" resultType="pojo.Student">
select * from student
</select>
</mapper>
紧接着,我们就可以启动项目了,让配置文件读取一个SqlSessionFactory对象,我们需要写的代码就在MyBatis的官方网站上就有:
public static void main(String[] args) throws FileNotFoundException {
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(new FileInputStream("src/main/java/mybatis/mybatis-config.xml"));
try (SqlSession sqlSession = sqlSessionFactory.openSession(true)){
List<Student> student = sqlSession.selectList("selectStudent");
student.forEach(System.out::println);
}
}
其中,build我们使用FileInputStream就可以读取配置文件,在后面放入配置文件的根目录的地址就可以成功的读取mybatis-config.xml文件了。
然后查看运行结果:
注意的是:其中,pojo包下的Student类,需要使用toString方法,否则只会返回地址。遇到报红,直接抛出异常即可,可能是还需要写依赖,这些网上一查就知道。 到此为止,MyBatis的基本使用方法就已经操作完成了。
(3)配置MyBatis
上面我们已经可以写出一个MyBatis的项目,我们可以注意一下,SqlSessionFactoryBuilder,每一个MyBatis都是以一个SqlSessionFactory的实例为核心,我们是通过SqlSessionFactory来创建多个新的会话,SqlSession对象,这也就是一对多,每一个会话彼此互不影响。这个SqlSessionFactory一般只用创建一次,所以我们可以写一个工具类MyBatisUilt,用来集中创建SqlSessionFactory:
public class MyBatisUile {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(new FileInputStream("src/main/java/mybatis/mybatis-config.xml"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public static SqlSession getSession(boolean autoCommit){
return sqlSessionFactory.openSession(autoCommit);
}
}
这样main之中只用写:
try (SqlSession sqlSession = MyBatisUile.getSession(true)){
List<Student> student = sqlSession.selectList("selectStudent");
student.forEach(System.out::println);
}
还是可以得到结果。
我们还可以通过namespace
来绑定到一个接口上,利用接口的特性,我们可以直接指明方法的行为,而实际实现则是由Mybatis来完成,创建一个接口 TestMapper,然后我们可以直接通过SqlSession来获取实现类,然后通过接口内的行为来获得结果(后续还可以使用注解):
public interface TestMapper {
List<Student> selectStudent();
}
然后,在TestMapper.xml之中,需要将namespace写上testMapper接口的地址,最后将主函数修改,直接通过SqlSession来获取实现类。
public static void main(String[] args) {
try (SqlSession sqlSession = MyBatisUile.getSession(true)){
TestMapper testMapper = sqlSession.getMapper(TestMapper.class);
List<Student> student = testMapper.selectStudent();
student.forEach(System.out::println);
}
}
最终得到结果。 、
(4)命名方式
我们可以为数据起别名,用来简化mapper的书写,我们可以在mybatis-config.xml内的environments之上写以下代码,现在类型就可以起别名了。
<typeAliases>
<typeAlias type="com.test.entity.Student" alias="Student"/>
</typeAliases>
当然,我们而也可以这样:
<settings>
<setting name="" value=""/>
</settings>
驼峰命名:
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
(5)增删改查
<select id="getStudentBySid" parameterType="int" resultType="Student">
select * from student where sid = #{sid}
</select>
<insert id="addStudent" parameterType="Student">
insert into student(name, sscore) values(#{name}, #{sscore})
</insert>
增删改查的大概写法都十分相似,其中的重点就是复杂查询,这个需要大家多去做些相关的题目就可以做到熟能生巧了。
动态SQL:MyBatis的动态Sql十分强大,对于拼接不同条件的sql语句十分有用。
3,注解开发
对于MyBatis而言,注解或者使用xml,我觉得差别并没有太大(主要是MyBatis本身要写的东西就很多),但是,注解的方式还是需要学习一下的。
就接着上面添加语句,我们需要将这个语句绑定在接口中的方法之上
@Insert("insert into student(name, sscore) values(#{name}, #{sscore})")
int addStudent(Student student);
然后,修改一下配置文件之中的映射器注册,可以直接注册在整个包之上。
<mappers>
<package name="com.mapper"/>
</mappers>
4,一些额外的
上面是我认为MyBatis之中比较值得我们去学习的,然后后续如果有精力就可以去多了解一下MyBatis的底层原理和一些缓存机制,动态代理的知识。
到此为止,MyBatis也就整理到这里了,后续还想了解,可以网上搜一下大佬的作品。如果有用,请点个小心心。