标签:Mybatis、JDBC、Maven
1.Mybatis概述
本部分将简要介绍Mybatis,特别是其核心的构建。
- Mybatis是什么?
Mybaits由apache→google→github,原名ibatis,它是基于java的持久层框架,可以看成是我们前面学习的jdbc 的增强版,核心概念包括Daos接口和Mysqlmaps映射文件。开发人员只需要写好sql语句,交给Mybatis处理,然后就可以得到想要的List集合/java对象,非常方便!
- 为什么需要Mybatis?
前面已经说了jdbc操作数据库,为何需要多一个增强版的Mybatis呢?因为他有如下特点:
第一个:将jdbc中重复的代码,如创建对象、接入连接、结果封装、销毁对象等封装了。
第二个:提供了将数据库表查询的结果封装为java对象的能力
第三个:将六步法简化为建立连接【主配置文件】、获取对象【动态代理】、调用方法三步
- 框架是什么东西?
框架就类似于申请表,核心骨架已经订好了,哪个位置怎么写?写多少?都已经订好了,我们只需要按照规定使用即可。其本质是内部已经封装了许多方法,这些方法以前可能需要我们自己手动实现,现在只需按照“使用说明书”提供想要的需求即可。
值得注意的是,每一个框架都是针对具体的业务场景进行抽象和封装的,故不存在万能的框架。
- 软件三层架构模式
在软件开发中,我们将其分为用户界面层[表示层]、业务逻辑层、数据访问层[持久化层]。
表示层controller :与用户打交道,主要是接收用户输入的数据,向用户返回输出的结果
典型框架:SpingMVC
业务逻辑层Logic Layer:中间人,包括接收数据,检查数据,计算,调用数据库
典型框架:Spring
持久化层dao :主要是对数据库的crud操作,将结果交给上层。
典型框架:Mybatis
2.Mybatis快速上手
在Mybatis中仍需要Maven进行监管,故相关配置文件也需要加入。
2.1 数据库表student.sql准备
2.2 在pom.xml中引入Mybatis依赖,引入Mysql驱动,加入单元测试junit
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
2.3 创建实体Student类,对应student表的一行数据[java对象→表]
2.4 创建持久层的Dao接口,定义方法
public interface StudentDao {
List<Student> selectLikefirst(String name);
}
2.5 创建sql映射文件,如StudentDao.xml
要求:放在同名的接口目录下,名字与接口一致,格式为xml。
2.6 创建Mybatis主配置文件,如Mybatis.xml,提供了数据库连接信息和sql映射文件的位置
2.7 【创建使用Myapp类,写入主函数】或者【进行单元测试配置】
【注意】二者都是用了Sqlsession接口来执行sql语句。
2.8 成功
【注意1】如果是采用的insert、update、delete语句,由于Mybatis的opensession方法默认是不自动提交事务,故若想要提交,可:
法1:调用opensession()方法时,参数写true;
法2:最后在单元测试方法后加上sqlsession.commit();
【注意2】不难发现,本次实验并未用到StudentDao接口中的方法,也没有实现其方法,因此不是正规的Mybatis,那么正规的是怎么样的呢?
换言之,怎么实现方法呢?以下分别从手动实现和Mybatis自动实现讲起。
3.Mybatis标准模板_动态代理
首先讲一下怎么手动实现:
从以前的知识,我们知道,定义了StudentDao接口后,我们必须手动实现方法,然后在主函数中调用该方法,因此:
第一步:实现StudentDao接口的方法:
public class implStudentDao implements StudentDao {
SqlSession sqlsession = null;
List<Student> list = null;
@Override
public List<Student> selectStudents() {
//获取sqlsession对象;
try {
sqlsession = datautil.getsqlsession();
//
String sqlId = "com.zhangsan.Dao.StudentDao.selectStudents";
//执行sql语句
list = sqlsession.selectList(sqlId);
for(Student stu:list){
System.out.println(stu);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(sqlsession!=null){
sqlsession.close();
}
}
return list;
}
@Override
public int insertStudents(Student stu) {
int count