Mybatis 框架快速入门(超详细)

  • MyBatis 框架概述

  • JDBC 编程的分析

    • jdbc 程序的回顾
  • jdbc 问题分析

  • Mybatis 框架快速入门

    • Mybatis 框架开发的准备
  • 搭建 Mybatis 开发环境

    • mybatis的环境搭建
  • 环境搭建的注意事项

  • 1、创建一个新的maven项目

    • 目录结构*
  • 2、在pom.xml中导入相关的依赖

  • 3、准备数据库

  • 4、编写User实体类

  • 5、编写持久层接口 IUserDao

  • 6、编写持久层接口的映射文件 IUserDao.xml

  • 7、编写 SqlMapConfig.xml 配置文件

  • 8、引入log4j.properties文件

  • 9、编写测试类

  • 运行结果

  • 分析

  • 可能遇到的错误

    • Exception in thread “main” org.apache.ibatis.exceptions.PersistenceException:
  • [Error querying database. Cause: java.sql.SQLNonTransientConnectionException:报错解决]( )

  • [Could not find resource xxx/xxxx/xxx.xml报错解决]( )

MyBatis 框架概述

======================================================================

**mybatis 是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。

mybatis 通过 xml 或注解的方式将要执行的各种 statement 配置起来,并通过 java 对象和 statement 中sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。

采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc 进行了封装,屏蔽了 jdbc api 底层访问细节,使我们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。**

JDBC 编程的分析

====================================================================

jdbc 程序的回顾


下面的是使用 jdbc 的原始方法(未经封装)实现了查询数据库表记录的操作。

public static void main(String[] args) {

Connection connection = null;

PreparedStatement preparedStatement = null;

ResultSet resultSet = null;

try {

//加载数据库驱动

Class.forName(“com.mysql.jdbc.Driver”);

//通过驱动管理类获取数据库链接

connection = DriverManager.getConnection(“jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8”, “root”, " root");

//定义 sql 语句 ?表示占位符

String sql = “select * from user where username = ?”;

//获取预处理 statement

preparedStatement = connection.prepareStatement(sql);

//设置参数,第一个参数为 sql 语句中参数的序号(从 1 开始),第二个参数为设置的参数值

preparedStatement.setString(1, “王五”);

//向数据库发出 sql 执行查询,查询出结果集

resultSet = preparedStatement.executeQuery();

//遍历查询结果集

while (resultSet.next()) {

System.out.println(resultSet.getString(“id”) + " “+resultSet.getString(” username"));

}

} catch (Exception e) {

e.printStackTrace();

} finally {

//释放资源

if (resultSet != null) {

try {

resultSet.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

if (preparedStatement != null) {

try {

preparedStatement.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

if (connection != null) {

try {

connection.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

jdbc 问题分析


**1、数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。

2、Sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java代码。

3、使用 preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能多也可能少,修改 sql 还要修改代码,系统不易维护。

4、对结果集解析存在硬编码(查询列名),sql 变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成 pojo 对象解析比较方便。**

Mybatis 框架快速入门

========================================================================

Mybatis 框架开发的准备


在这里插入图片描述

如果使用 Maven 来构建项目,则需将下面的依赖代码置于 pom.xml 文件中:

org.mybatis

mybatis

3.5.5

搭建 Mybatis 开发环境


mybatis的环境搭建

**第一步:创建maven工程并导入坐标

第二步:创建实体类和dao的接口

第三步:创建Mybatis的主配置文件 SqlMapConifg.xml

第四步:创建映射配置文件 IUserDao.xml**

环境搭建的注意事项

**第一个:创建IUserDao.xml 和 IUserDao.java时名称是为了和我们之前的知识保持一致。

在Mybatis中它把持久层的操作接口名称和映射文件也叫做:Mapper

所以:IUserDao 和 IUserMapper是一样的

第二个:在idea中创建目录的时候,它和包是不一样的

包在创建时:com.itheima.dao它是三级结构

目录在创建时:com.itheima.dao是一级目录

第三个:mybatis的映射配置文件位置必须和dao接口的包结构相同

第四个:映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名

第五个:映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名

注意:当我们遵从了第三,四,五点之后,我们在开发中就无须再写dao的实现类。**

1、创建一个新的maven项目

目录结构*

最后完成的目录结构如下:

在这里插入图片描述

2、在pom.xml中导入相关的依赖

pom.xml:

<?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”>

4.0.0

com.keafmd

day01_eesy_01mybatis

1.0-SNAPSHOT

jar

org.mybatis

mybatis

3.5.5

mysql

mysql-connector-java

5.1.49

log4j

log4j

1.2.17

junit

junit

4.13

test

3、准备数据库

创建个数据库eesy_mybatis,入门案例中只使用到了user表。

在这里插入图片描述

sql文件:

DROP TABLE IF EXISTS user;

CREATE TABLE user (

id int(11) NOT NULL auto_increment,

username varchar(32) NOT NULL COMMENT ‘用户名称’,

birthday datetime default NULL COMMENT ‘生日’,

sex char(1) default NULL COMMENT ‘性别’,

address varchar(256) default NULL COMMENT ‘地址’,

PRIMARY KEY (id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into user(id,username,birthday,sex,address) values (41,‘老王’,‘2018-02-27 17:47:08’,‘男’,‘北京’),(42,‘小二王’,‘2018-03-02 15:09:37’,‘女’,‘北京金燕龙’),(43,‘小二王’,‘2018-03-04 11:34:34’,‘女’,‘北京金燕龙’),(45,‘传智播客’,‘2018-03-04 12:04:06’,‘男’,‘北京金燕龙’),(46,‘老王’,‘2018-03-07 17:37:26’,‘男’,‘北京’),(48,‘小马宝莉’,‘2018-03-08 11:44:00’,‘女’,‘北京修正’);

DROP TABLE IF EXISTS account;

CREATE TABLE account (

ID int(11) NOT NULL COMMENT ‘编号’,

UID int(11) default NULL COMMENT ‘用户编号’,

MONEY double default NULL COMMENT ‘金额’,

PRIMARY KEY (ID),

KEY FK_Reference_8 (UID),

CONSTRAINT FK_Reference_8 FOREIGN KEY (UID) REFERENCES user (id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into account(ID,UID,MONEY) values (1,41,1000),(2,45,1000),(3,41,2000);

DROP TABLE IF EXISTS role;

CREATE TABLE role (

ID int(11) NOT NULL COMMENT ‘编号’,

ROLE_NAME varchar(30) default NULL COMMENT ‘角色名称’,

ROLE_DESC varchar(60) default NULL COMMENT ‘角色描述’,

PRIMARY KEY (ID)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into role(ID,ROLE_NAME,ROLE_DESC) values (1,‘院长’,‘管理整个学院’),(2,‘总裁’,‘管理整个公司’),(3,‘校长’,‘管理整个学校’);

DROP TABLE IF EXISTS user_role;

CREATE TABLE user_role (

UID int(11) NOT NULL COMMENT ‘用户编号’,

RID int(11) NOT NULL COMMENT ‘角色编号’,

PRIMARY KEY (UID,RID),

KEY FK_Reference_10 (RID),

CONSTRAINT FK_Reference_10 FOREIGN KEY (RID) REFERENCES role (ID),

CONSTRAINT FK_Reference_9 FOREIGN KEY (UID) REFERENCES user (id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into user_role(UID,RID) values (41,1),(45,1),(41,2);

4、编写User实体类

User类:

package com.keafmd.domain;

import java.util.Date;

/**

  • Keafmd

  • @ClassName: User

  • @Description: user实体类

  • @author: 牛哄哄的柯南

  • @date: 2021-02-06 19:26

*/

public class User {

private Integer id;

private String username;

private Date birthday;

private String sex;

private String address;

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

public Date getBirthday() {

return birthday;

}

public void setBirthday(Date birthday) {

this.birthday = birthday;

}

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

}

public String getAddress() {

return address;

}

public void setAddress(String address) {

this.address = address;

}

@Override

public String toString() {

return “User{” +

“id=” + id +

“, username='” + username + ‘’’ +

“, birthday=” + birthday +

“, sex='” + sex + ‘’’ +

“, address='” + address + ‘’’ +

‘}’;

}

}

5、编写持久层接口 IUserDao

IUserDao:

package com.keafmd.dao;

import com.keafmd.domain.User;

import java.util.List;

/**

  • Keafmd

  • @ClassName: IUserDao

  • @Description: 用户的持久层接口

  • @author: 牛哄哄的柯南

  • @date: 2021-02-06 19:29

*/

public interface IUserDao {

/**

  • 查询所有操作

  • @return

*/

List findAll();

}

6、编写持久层接口的映射文件 IUserDao.xml

**要求:

创建位置:必须和持久层接口在相同的包中。

名称:必须以持久层接口名称命名文件名,扩展名是.xml**

在这里插入图片描述

IUserDao.xml:

<?xml version="1.0" encoding="UTF-8"?>

select * from user

7、编写 SqlMapConfig.xml 配置文件

SqlMapConfig.xml:

<?xml version="1.0" encoding="UTF-8"?> **自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)

最后

由于篇幅限制,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!有需要的程序猿(媛)可以帮忙点赞+点击【学习资料】即可获取!

进入阿里一直到现在。**

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-nwc7yQpW-1711687578314)]

[外链图片转存中…(img-kcGKO3rJ-1711687578315)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

[外链图片转存中…(img-TzL3AwgS-1711687578315)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)

最后

由于篇幅限制,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!有需要的程序猿(媛)可以帮忙点赞+点击【学习资料】即可获取!

[外链图片转存中…(img-pafxOK4D-1711687578315)]

[外链图片转存中…(img-365ShDpq-1711687578316)]

  • 28
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值