java框架SSM学习——持久层Mybatis之环境搭建

创建的项目中使用Mybatis作为持久层的话,需要多个jar包的支持,如org.mybatis,mysql,log4j,junit等,如果一个个导入太麻烦,所以要用到Maven依赖库(在以前我写的文章里有Maven下载已经配置的全过程)

首先

新建project,选择Maven项目,然后点击next,填好GroupId和ArtifactId即可next和finish

在这里插入图片描述

下一步:

点开目录下的pom.xml,得到的页面为:

在这里插入图片描述

利用标签 dependencies和depandency去导入需要的jar包

比如我要导入org.mybatis,mysql,log4j,junit 的jar包,即可这样操作:

在这里插入图片描述

这里注意:

①grouoId和artifactId是在一键生成dependencies的时候就会自带的标签,填入想要的jar包的名称和文件名即可
②version标签是需要自己打上去,填写需要jar包的版本号

然后此时右下角会出现:

在这里插入图片描述
点击Enable Auto-Import即可导入jar包,下面有下载jar包的进度条。

到此jar包的导入已经完成

下一步我们需要创建Mybatis的主配置文件

首先我们来看看src目录下的三个主要的文件夹:
在这里插入图片描述
而Mybatis的主配置文件要放在resource中
右键点击resource选择新建file文件:
在这里插入图片描述
输入XXX.xml,在这里我是config.xml然后点击OK即可出现一个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">

因为没有配置dtd外部文件,所以dtd的这段代码会报错,那么点开左上角的File,然后点开Setting找到Languages&Frameworks——Schemas and DTDs。

在这里插入图片描述

将http://mybatis.org/dtd/mybatis-3-config.dtd和http://mybatis.org/dtd/mybatis-3-mapper.dtd添加即可。

然后开始配置Mybatis的主配置文件

了解主配置文件里的标签:
<configuration></configuration>
这个标签是约束所有标签的主标签,就是主配置文件的标志。所有标签都在这里面填写。
②<environments></environments>
这个标签是配置环境,属性为default,在这里我们用<environments default="mysql"></environments><environment></environment>
这个标签是配置属性中的环境,在这就是配置mysql的环境,属性为id,在这里我们用<environment id="mysql"></environment><transactionManager></transactionManager>
这个标签是配置事务的,属性为type,这里用<transactionManager type="JDBC"></transactionManager><dataSource></dataSource>
这个标签是配置连接池的连接方式,其属性有三种:POOLED,UNPOOLED,JNDI。在这里用<dataSource type="POOLED"></dataSource>。在标签里我们的值要存放连接数据库的相关事宜。
⑥<mappers></mappers>
这个标签在主配置文件里就是作为导航栏的作用,指示各种操作的xml配置文件,如果没有这个文件就找不到方法而报错。里面写什么下面再讲。

了解了标签,所以现在可以去看看如何正确嵌套配置configuration。
在这里插入图片描述
现在基本的主配置文件以及写好,那如何去使用到mybatis去查询数据库呢?那么我用一个小案例去演示一下

第一步

在数据库中创建一个user数据库,里面有user表,表里的数据用sql语句去创建:

//创建表
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 AUTO_INCREMENT=53 DEFAULT CHARSET=utf8

//插入信息:
INSERT INTO USER (id , username , birthday , sex , address)VALUES
(42 , "伍俊伟" , "2025-03-20 10:27:44" , '男' , "广东省广州市"),
(43 , "大头伟" , "2012-06-21 09:04:03" , '男' , "北京省四环路"),
(45 , "new people" , "1925-07-31 04:05:06" , '男' , "China"),
(46 , "姬霓太美" , "1994-07-22 08:05:06" , '女' , "广东省惠州市"),
(48 , "蔡徐坤" , "2004-07-09 06:08:02" , '女' , "非洲"),
(51 , "孙上天" , "2028-08-18 04:56:06" , '男' , "太阳")

在这里插入图片描述
如何查询到这些数据到控制台呢?

第二步

创建数据库数据的实体类,在java的文件夹下新建package然后再新建一个javabean的package,然后在里面新建实体类User.java,再将数据封装成一个User对象。
在这里插入图片描述

package com.javabean;

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

public class User implements Serializable {
    private int id;
    private String username;
    private String address;
    private String sex;
    private Date birthday;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", address='" + address + '\'' +
                ", sex='" + sex + '\'' +
                ", birthday=" + birthday +
                '}';
    }
}

第三步

在刚刚新建的com包下新建一个package dao,然后在dao包里新建一个接口,接口里写的方法是查询数据库所有的数据的方法。
在这里插入图片描述

package com.dao;

import com.javabean.User;

import java.util.List;

public interface userDao {
    //查询User所有数据
    List<User> findAll();
}

第四步

创建userDao的配置文件:在resource的文件夹下新建new directory,里面写上新建包的名字,我创建了com的包,然后再在com的包下创建
dao的包。在dao包下创建file,名称自定,但是一般都以接口为准,我创建的是:
在这里插入图片描述
至此,结构差不多完整,虽然还缺少个测试类,待会再写。现在去编写userDao的xml配置,首先将下面这段dtd复制到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">

在这个userDao的xml配置里,有几个标签需要知道:

<mapper></mapper>
在各自配置文件中的主标签,其中有namespace属性,其他属性不予讨论,在这没有用到。
②<select></select><insert></insert><update></update><delete></delete>
以上四种标签都是操作数据库对应操作的标签,有几个常用的属性:id、resultType、resultMap、ParameterType。在select中只用到id和resultType

虽然此次只用到select的标签,但是剩下的三个标签:插入、更新、删除也是可以归在一起讨论的。所以就一起写出来了。由此xml中的代码为:

<mapper namespace="com.dao.userDao">
    <select id="findAll" resultType="com.javabean.User">
        select * from user
    </select>
</mapper>
其中namespace+id组成了方法的全限定类名,以及resultType属性意思是返回值的类型,也需要用返回值类型的全限定类名。

写完userDao的xml,还需要去连接导航的主XML文件,由此我们回到Mybatis的主配置文件config.xml中搭上连接userDao.xml的线。需要用到的标签为:

<mappers></mappers>
主要用来指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件

所以在config.xml中加上这段代码:

<mappers>
    <mapper resource="com/dao/userDao.xml"></mapper>
</mappers>

第五步

编写测试类去获取数据库数据输出到控制台上。在创建Maven项目的时候自带的三个包:主java文件包,resource包以及test包。在test包的java文件包里创建一个java文件,我命名为UserTest
在这里插入图片描述
打入代码:

import com.dao.userDao;
import com.javabean.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;


import java.io.InputStream;
import java.util.List;

public class UserTest {
    @Test
    public void testFindAll()throws Exception{
        //将配置文件读入字节流
        InputStream is = Resources.getResourceAsStream("config.xml");
        //生成SqlSessionFactory的建造器
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //用建造器生成SqlSessionFactroy
        SqlSessionFactory factory = builder.build(is);
        //用SqlSessionFactroy生成SqlSession对象
        SqlSession session= factory.openSession();
        //生成useDao的代理对象
        userDao userDao = session.getMapper(com.dao.userDao.class);
        //用代理对象里的findAll方法
        List<User> list = userDao.findAll();
        //输出查询到的结果
        for(User user : list){
            System.out.println(user);
        }
        //关闭资源
        is.close();
        session.close();
    }
}

细节操作我都在代码中备注好了,至此就完成了测试,最后的测试结果为:
在这里插入图片描述

得到这个结果就说明了我能通过Mybatis来获取到数据库的数据了。就完成了初步对Mybatis的操作。还有很多东西还没讲,我只是讲了使用Mybatis的一个简单的流程,但是大致的使用都是这么去操作的,只不过在其中添加更多的配置,这些配置我会在目录中慢慢讲解完。

细节讲解:

①log4j的jar包有什么用
log4j是一个功能强大的日志组件,提供方便的日志记录,在获取到数据前发生什么,获取数据库后又发生了什么,都会有日志的记录,就方便自己去了解全过程以及一些属性变化导致的日志的改变。比如最直观的变化莫过于,在DataSource中设置属性type为POOLED或者UNPOOLED的变化,这是如果你不开日志,是不可能发现有什么变化。POOLED是从放在连接池中的连接拿出来,然后结束连接再把连接放回连接池,日志记录了这个过程。而UNPOOLED则是直接新建一个连接,着就没有连接连接池的操作,就能看到变化。

②JUnit的jar包有什么用呢?
JUnit 是一个 Java 编程语言的单元测试框架,在我写的测试类中如果我没有用JUnit的话就运行不了没有,因为java默认能运行的只有main方法,但是我用了JUnit的话就可以将要运行的方法变成测试方法,然后直接就可以运行,需要用到一个注释:

@Test

方法就放在@Test下即可

③在创建User实体类的时候implements了一个接口:Serializable
这是一个序列化接口,就是形成了一个持久化的效果,用序列化将对象写入磁盘,然后如果在以后再去调用,就可恢复对象,而不是局限于一个对象的生命周期中。

④一定要写这么多包吗?
这看你自己的编码习惯,现在我写的是只有一个dao的查询,那如果有多个dao和多个方法呢?这样分开包来存放,首先就是很直观,还有就是结构明显,养成一个良好的编码习惯是很重要的,不然累的是看你代码的人,还有你找代码的时候混在一起就会增加开发时间。还有一个就是要知道在三个基础包里,java包是可以直接建立package的,如果在resource和test中并没有package的选项,所以要建包或者建立xml文件就选择directory。
⑤在测试方法中写的流程为什么是这样?
这个需要你去先了解到Mybatis的核心组件:
SqlSessionFactoryBuilder(构造器)
SqlSessionFactroy(工厂接口)
SqlSession(会话)
SQL Mapper(映射器)

以及他们之间各自的联系,在其中用到了代理对象,我在后面的目录中单独开了一个讲解点,所以具体可以去参考下一个讲解点。

总的来说,其实建立一个简单的Mybatis的查询,要明白入口在哪,查询条件在哪,以及导航方向到哪。我在文中已经写得很清楚了,整个过程以及其中的细节讲解,对于Mybatis的入门能写出第一个查询就相当于成功了,进阶的东西我在后面的目录中会慢慢完成讲解!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值