zoukankan      html  css  js  c++  java
  • Mybatis-入门演示

    MyBatis:持久层框架

    前言

    之前有看过和学习一些mybatis的文章和内容,但是没有去写过文章记录下,现在借鉴b站的狂神视频和官方文档看来重新撸一遍入门。有错误请多指教。

    内容

    数据访问层-相当于之前web项目中dao层,数据库的交互,包括增删改查;

    持久化就是将数据在持久状态和瞬时状态转化的过程。内存是断电即失。所以需要数据的持久化。

    JDBC技术:Connection、PrepareStatement、ResultSet.

    为什么要使用框架代替jdbc呢?

    ​ 因为之前的jdbc的操作总是是重复单一的,在开发的时候要执行sql语句直接操作数据库,要经过加载驱动等操作,为了高效的开发,避免繁琐的操作,框架就诞生了。框架对jdbc进行封装,mybatis只需关注sql语句直接操作数据库,封装了操作的很多细节,这样可以将更多时间精力放在sql语句的编写上。

    特点:灵活容易上手,用的多,封装jdbc;MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

    演示使用

    现在演示mybatis的一个helloworld程序,看看是怎么样去使用。

    pom.xml

    整个项目的maven管理文件。

    <?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.yhy.learn</groupId>
        <artifactId>mybatisDemo</artifactId>
        <packaging>pom</packaging>
        <version>1.0-SNAPSHOT</version>
        <modules>
            <module>mybatis-01</module>
        </modules>
    
        <dependencies>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.5.4</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.15</version>
            </dependency>
    
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>
    
        </dependencies>
    
        <build>
            <resources>
                <resource>
                    <directory>src/main/resources</directory>
                    <includes>
                        <include>**/*.xml</include>
                        <include>**/*.properties</include>
                    </includes>
                </resource>
    
                <resource>
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.xml</include>
                        <include>**/*.properties</include>
                    </includes>
                </resource>
            </resources>
        </build>
    
    
    
    </project>
    

    工具类

    package com.yhy.utils;
    
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.Configuration;
    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;
    
    /**
     * @Author: yhy
     * @Date: 2020/5/12
     * @Time: 11:45
     * 工具类
     * 获取sqlsession工厂
     */
    public class MybatisUtils {
        private static SqlSessionFactory sqlSessionFactory;
        static {
            try {
    //            利用mybatis在一开始就获得了sqlsessionfactory
                String resource = "mybatis-config.xml";
                InputStream inputStream = Resources.getResourceAsStream(resource);
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    //    有了工厂就可以获得实例来使用,sqlsession就可以面向数据库操作jdbc
        public static SqlSession getSqlSession(){
            return sqlSessionFactory.openSession();
        }
    
    
    
    }
    
    

    pojo的user类

    映射数据库的user表

    package com.yhy.pojo;
    
    /**
     * @Author: yhy
     * @Date: 2020/5/12
     * @Time: 10:58
     * 用户表的pojo层
     */
    public class User {
        private int id;
        private String name;
        private String pwd;
    
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
    
        public String getPwd() {
            return pwd;
        }
    
        public void setPwd(String pwd) {
            this.pwd = pwd;
        }
    
    }
    

    dao层的UserDao接口

    package com.yhy.dao;
    
    import com.yhy.pojo.User;
    
    import java.util.List;
    
    public interface UserDao {
        List<User> getUserList();
    }
    

    dao的接口实现xml

    用这个文件代替了之前dao层中的接口实现类,之前的话需要编写jdbc的全部,查询编写sql,获取结果集,遍历结果集,关闭连接。现在的话就是简化了步骤。

    <?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">
    <!--namespace=绑定一个对应的Dao/Mapper接口 原本是写接口,但是现在不用怎么做-->
    <mapper namespace="com.yhy.dao.UserDao">
    
        <!--select查询语句-->
        <select id="getUserList" resultType="com.yhy.pojo.User">
           select * from mybatis.user
       </select>
    
    </mapper>
    

    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>
        <typeAliases>
            <package name="com.yhy.pojo"/>
        </typeAliases>
        <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/mybatis?characterEncoding=UTF-8"/>
                    <property name="username" value="root"/>
                    <property name="password" value="root"/>
                </dataSource>
            </environment>
        </environments>
        //作用域,删掉就是全局
        //这里的配置可以是直接放在resource文件下,就直接写上xml名称就行,放在dao层的话就需要写全路径
        <mappers>
            <mapper resource="com/yhy/dao/UserMapper.xml"/>
        </mappers>
    </configuration>
    

    测试

    package com.yhy.dao;
    
    import com.yhy.pojo.User;
    import com.yhy.utils.MybatisUtils;
    import org.apache.ibatis.session.SqlSession;
    import org.junit.Test;
    
    import java.util.List;
    
    /**
     * @Author: yhy
     * @Date: 2020/5/12
     * @Time: 12:15
     */
    public class UserDaoTest {
    //借调工具类来使用测试
        @Test
        public void test(){
            SqlSession sqlSession = MybatisUtils.getSqlSession();
    
            UserDao mapper = sqlSession.getMapper(UserDao.class);
            List<User> userList = mapper.getUserList();
    
            for (User u: userList){
                System.out.println(u);
    
            }
    
            sqlSession.close();
    
    
        }
    
    
    }
    

    先将结果贴在下面

    image-20200512143352609

    演示两种mappers作用效果

    • 1.将UserMapper.xml放在dao层下,跟着userdao配置就和我上面写的一样。最后效果如下,但是前提是你得在你项目的pom.xml设置好有效的作用域,要不然就疯狂报错,说找不到这个UserMapper.xml文件。
      image-20200512162240033
      pom.xml需要配置如下,这里是配置能够得读取到src下的有效配置文件。
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>
    
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>
        </resources>
    </build>
    
    • 2.是直接将UserMapper.xml放在src下的resource文件下,和总的mybatis-config.xml配置文件放置在一起。这样在mybatis-config.xml里面就直接如下这样写文件名就行了。
     <mapper resource="UserMapper.xml"/>
    

    image-20200512143952637

    最后效果和第一种方法是一样的,都能够读取到数据。

    • 个人觉得这两种方法来说,第一种可以对项目的整体设计管理更加方便一点,就像接口和实现类都是靠近的,方便进一步的审查和优化,第二种在做小的demo的时候是很方便的,但是一旦多个配置文件时候就可以有点难找。

    记录错误

    1. maven创建项目一开始经常会有的错误,就是设定的jdk版本问题,一开始我都是手动去修改project的setting,比较麻烦。默认的版本一般是jdk1.4或者是jdk1.5,但大家往往不是这个版本,所以会报错不支持发行版本5什么的。

    解决:现在记录下,永久得起配置好。到自己maven下载文件夹下找到配置文件,并在里面修改settings.xml

    image-20200512151703715

    image-20200512151630090

    修改:如下,我的是jdk11。所以可以根据自己的版本来修改。

    image-20200512151902737

    初步学习

    测试代码中的几个关键类,三者的关系都是从上到下生成。

    image-20200512155009281

    SqlSessionFactoryBuilder这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。

    SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例,这样也是开发的规范。

    每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域,同时好的开发习惯,要在使用之后,将其关闭。

  • 相关阅读:
    js 面试的坑:变量提升
    meta 标签大全
    一个极为简单的requirejs实现
    AMD 的 CommonJS wrapping
    浅解析js中的对象
    javascript运动系列第二篇——变速运动
    开发汉澳即时通信网,2006年上线,QQ死期到了
    SpringMVC中的异步提交表单
    HDU 3698 DP+线段树
    黑马程序猿_反射、内省、泛型
  • 原文地址:https://www.cnblogs.com/yhycoder/p/12876880.html
Copyright © 2011-2022 走看看