Day01 Mybatis学习

Day01 Mybatis学习

一、MyBatis框架概述

mybatis是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql语句本身, 而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。 mybatis通过xml 或注解的方式将要执行的各种statement配置起来,并通过java对象和statement 中 sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并 返回。 采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc进行了封装,屏蔽了 jdbc api 底层访问细节,使我 们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。 为了我们能够更好掌握框架运行的内部过程,并且有更好的体验,下面我们将从自定义 Mybatis 框架开始来 学习框架。此时我们将会体验框架从无到有的过程体验,也能够很好的综合前面阶段所学的基础。

二、JDBC编程分析

在学习Mybatis之前首先要对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/mybatischaracterEncoding=utf-8","ro ot", "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) {
			e.printStackTrace();
				}
			}
		}
	}
上边使用 jdbc 的原始方法(未经封装)实现了查询数据库表记录的操作。

问题分析:
1、数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题
2、Sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java代码。
3、使用 preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能多也可能少,修改 sql 还要修改代码,系统不易维护。
4、对结果集解析存在硬编码(查询列名),sql 变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成 pojo 对象解析比较方便。

三、Mybatis开发环境的搭建

在这里要注意的是搭建Mybatis首先要搭建好maven工程,我的maven版本,点击直接下载
apache-maven-3,.6.3
下载下来,在自己本地创建一个maven文件夹
在这里插入图片描述
接着把下载好的包放进去解压,并创建本地仓库
在这里插入图片描述
接在在这个目录下用编辑器打开settings.xml
在这里插入图片描述
最好修改两处:
第一处:放进本地仓库的路径(E://maven//LocalWarehouse)
在这里插入图片描述
第二处:加上了一个阿里的源,因为自带的在创建mybatis的依赖包的时候下的特别慢,建议加上
在这里插入图片描述
附上代码:

<mirror>  
    <id>nexus-aliyun</id>  
    <mirrorOf>central</mirrorOf>    
    <name>Nexus aliyun</name>  
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>  
</mirror>

接着就是环境变量的配置:
1、首先创建一个MAVEN_HOME
在这里插入图片描述
变量值就是你刚才在本地创建的路径
2、在Path里面新建:%MAVEN_HOME%\bin
在这里插入图片描述
配置好在本地确认一下:打开cmd,输入mvn -v
在这里插入图片描述
这样就是配置成功了(前提应该是要配置好jdk)。

四、搭建Mybatis 开发环境

标题本人的项目结构:

在这里插入图片描述

1、创建maven工程

我自己用的是IDEA,直接在File新建project,选择Maven
在这里插入图片描述
第二处刚学可以不用使用,选择好SDK,直接下一步
在这里插入图片描述
这两处就是对于的项目名称以及类似左边的多及目录建议加上,Artifacld可以自定义填写,接着直接finish。
接着在右上角File,找到settings,
在这里插入图片描述
在这里插入图片描述
接在在里面把1,2,3都换成自己本地的目录,点击ok
创建好会弹出pom.xml, 如图所示:
在这里插入图片描述

二、添加 Mybatis3.4.5 的坐标

接着就是添加mybatis和mysql的依赖,日志和JUnit可以不用加:

<?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.lnw</groupId>
    <artifactId>day01_eesy_01mybatis</artifactId>
    <version>1.0-SNAPSHOT</version>
	
	<!--mybatis依赖-->
	<!--添加 Mybatis3.4.5 的坐标-->
    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>

	<!--mysql依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.19</version>
        </dependency>


        <!-- 日志 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        
        <!-- JUnit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

</project>

正常的是代码写好,这些依赖也会自动加载好,在右下角会有下载转圈,出现下面这两个就是已经加载好了
在这里插入图片描述
如果代码爆红,没有自动添加,在pom.xml右击
在这里插入图片描述
点击Reimport或者Download,一般爆红都是依赖没有下载好,耐心等待下载完成即可。

三、编写User实体类

package com.lnw.domain;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable {
    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 + '\'' +
                '}';
    }
}

三、编写持久层接口 IUserDao

package com.lnw.dao;
import com.lnw.domain.User;
import java.util.List;
//用户的持久层接口
public interface IUserDao {
    //查询所有操作
    List<User> findAll();
}

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

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

名称:必须以持久层接口名称命名文件名,扩展名是.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="com.lnw.dao.IUserDao">
    <!-- 配置查询所有用户 -->
    <select id="findAll" resultType="com.lnw.domain.User">
        SELECT * FROM user
    </select>
</mapper>

五、编写 SqlMapConfig.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>
    <!-- 全局变量 -->
    <properties>
        <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/db_mybatis?serverTimezone=GMT%2B8"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </properties>

    <!--配置环境-->
    <environments default="mysql">
        <!--配置mysql的环境-->
        <environment id="mysql">
            <!-- 配置事务类型 -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 配置数据源(连接池) -->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 指定映射文件 -->
    <mappers>
        <mapper resource="com/lnw/dao/IUserDao.xml"/>
    </mappers>
</configuration>

**注意:**我自己的mysql是8以上,

<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/db_mybatis?serverTimezone=GMT%2B8"/>

如果低于8,则需要修改:

<property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/db_mybatis/>

六、编写测试类

package com.lnw.test;

import com.lnw.dao.IUserDao;
import com.lnw.domain.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import javax.annotation.Resources;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MybatisTest {
    // Resources.class.getResourceAsStream("SqlMapConfig.xml");
    //入门案例

    public static void main(String[] args) throws Exception{
    try {
        //1.读取配置文件
        InputStream in = Test.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        //3.使用工厂生产SqlSession对象
        SqlSession session = factory.openSession();
        //4.使用SqlSession创建Dao接口的代理对象
        IUserDao userDao = session.getMapper(IUserDao.class);
        //5.使用代理对象执行对象
        List<User> users = userDao.findAll();
        for (User user : users){
            System.out.println(user);
        }

//        String resource = "SqlMapConfig.xml";
//        InputStream inputStream = Test.class.getClassLoader().getResourceAsStream(resource);
//        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
//        SqlSession session = factory.openSession();
//        IUserDao userDao = session.getMapper(IUserDao.class);
//        List<User> users = userDao.findAll();
//        for (User user : users){
//            System.out.println(user);
//        }
        //6.释放资源
        session.close();
        in.close();
        //inputStream.close();
    }catch (Exception e){
        e.printStackTrace();
    }


    }
}

运行结果:

在这里插入图片描述
我的Navicat中的数据:
在这里插入图片描述

附sql语句:

-- 创建数据库
CREATE DATABASE IF NOT EXISTS db_mybatis CHARACTER SET utf8;
-- 创建数据表
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','女','北京修正');

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis是一个开源的持久层框架,它可以帮助开发人员简化数据库操作。如果你想学习MyBatis,下面是一个学习路线的建议: 1. 数据库基础:在学习MyBatis之前,建议先掌握数据库的基本概念和SQL语言。了解关系型数据库的原理、表设计和常用的SQL语句会对学习MyBatis有很大帮助。 2. MyBatis入门:开始学习MyBatis之前,可以先了解一下MyBatis的基本概念和核心特性。阅读官方文档或者参考一些入门教程可以帮助你快速上手。 3. 配置文件:学习如何配置MyBatis的核心配置文件,包括数据源、映射文件、类型处理器等。了解不同配置项的作用和常用配置方式。 4. 映射文件:深入学习MyBatis的映射文件,了解如何使用SQL语句进行数据库操作,并学习动态SQL的使用技巧。掌握映射文件中各种标签的含义和用法。 5. 注解方式:学习使用注解方式来配置和使用MyBatis。了解常用的注解和使用方式,与映射文件相比,注解方式更加简洁和灵活。 6. 缓存机制:了解MyBatis的缓存机制,包括一级缓存和二级缓存的原理和使用方式。了解如何配置和优化缓存,提高系统的性能。 7. 整合框架:学习如何将MyBatis与其他框架进行整合,如Spring和Spring Boot。掌握整合的配置方式和常见问题的解决方法。 8. 实践项目:通过实践项目来巩固所学的知识,可以自己动手搭建一个简单的Web应用或者实现一些常见的数据库操作。在实践中不断提升自己的技能。 以上是一个大致的学习路线,你可以根据自己的实际情况和学习进度进行调整。希望对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值