Mybatis框架学习01

前言

虽然注册账号良久,但是一直忙于学习和工作,一直没有整理记录自己的学习笔记,感谢CSDN提供这么一个平台,最近在学习java的mybatis框架,于是想着就把最近的学习成果作为在本论坛的第一篇博客文吧。

mybatis的依赖以及其他所需要的依赖引用

mybatis作为一种常用框架来说,它有两种方式被我们所引用.
第一个就是最基础的jar包,关于jar包可以去官网下载,这里我用的idea工具下maven环境引用的依赖,具体pom.xml配置方式可以去 https://mybatis.org/mybatis-3/zh/getting-started.html 查看详细。
其实mybatis的所有基础应用都在上面这个网址上描述的很详细的,而且还是极少数支持中文简体的文档。下面贴上pom.xml中的配置代码:

<dependencies>
        <!--引入mybatis依赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
</dependencies>

我的数据库使用的是oracle,因为window这个电脑没有安装mysql一直在用Oracle数据库,所以下面要引入Oracle数据库的驱动依赖,但是Oracle在maven并没有发行可下载的版本,所以需要自行下载jar包,然后使用以下cmd命令把oracle驱动安装到本地仓库,注意版本号,注意版本号,注意版本号,根据自己数据库和jdk来选择合适的oracle driver版本,别踩坑。

	mvn install:install-file -Dfile=下载的Oracle驱动的jar包路径 -DgroupId=自定义的groupId -DartifactId=自定义的artifactID -Dversion=Oracle驱动版本 -Dpackaging=jar

然后在maven项目的pom中配置依赖即可:

	<!-- 引入oracle数据库依赖-->
        <dependency>
            <groupId>org.oracle</groupId>
            <artifactId>ojdbc</artifactId>
            <version>6</version>
        </dependency>

因为牵扯到数据库,所以我们需要控制台输出反馈日志,这里使用slf4j。这里分享一个网站 https://mvnrepository.com 是用于maven查询插件依赖版本信息的,可以从这里或许自己想要的依赖配置,直接复制到pom中。

	<!-- 引入log4j依赖-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.21</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.21</version>
        </dependency>

以上我们需要在pom中配置的基本上是完结了。

properties文件配置

我把mybatis和slf4j所需要的配置信息,写在了properties文件,在xml中调用。
在resource文件夹下建立log4j.properties文件用于配置日志信息,可配置得到属性很多,但是我们需要目前需要配置只有以下几项:

	#定义输出级别和输出平台,控件台输出
	log4j.rootLogger=debug, stdout
	#设定stdout输出平台 org.apache.log4j.ConsoleAppender(控制台)
	log4j.appender.stdout=org.apache.log4j.ConsoleAppender
	#指定输出的最低级别
	log4j.appender.stdout.Threshold=debug
	# 指定默认值是true,意谓着所有的消息都会被立即输出。 fasle 不输出
	log4j.appender.stdout.ImmediateFlush=true
	#默认情况下是System.out,指定输出控制台-err为红色的提示
	log4j.appender.stdout.Target=system.out
	#org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
	log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
	#指定输入的格式对输出的内容进行格式化
	#%p  输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL
	#%d 输出日志时间点的日期或时间,
	#%l 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数
	#%m 输出代码中指定的消息,产生的日志具体信息
	#%n 输出一个回车换行符,Windows平台为”\r\n”,Unix平台为”\n”输出日志信息换行
	log4j.appender.stdout.layout.ConversionPattern=[%-5p][%d{yyyy-MM-dd HH:mm:ss}][%l]%m%n

在resource文件夹下建立jdbc.properties文件用于数据库连接信息:

	driver=oracle.jdbc.OracleDriver
	url=jdbc:oracle:thin:@127.0.0.1:1521:ORCL
	username=scott
	password=tiger

数据库表格和java实例类创建

首先在数据库建立student数据表格:
student
在com.elvis.com.pojo下建立Student类

package com.elvis.pojo;

import java.sql.Date;

public class Student {
    private String studentid;
    private String name;
    private int age;
    private int sex;
    private Date birthday;
    private int grade;
    private int classId;
    
    public String getStudentid() {
        return studentid;
    }

    public void setStudentid(String studentid) {
        this.studentid = studentid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getSex() {
        return sex;
    }

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

    public Date getBirthday() {
        return birthday;
    }

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

    public int getGrade() {
        return grade;
    }

    public void setGrade(int grade) {
        this.grade = grade;
    }

    public int getClassId() {
        return classId;
    }

    public void setClassId(int classId) {
        this.classId = classId;
    }

    @Override
    public String toString(){
        return "学生信息为:\n" +
                "姓名:" + getName() +
                "\n学号:" + getStudentid() +
                "\n性别:" + (getSex()==0?"女":"男") +
                "\n出生年月日:" + getBirthday().toString() +
                "\n年级:" + getGrade() +
                "\n班级:" + getClassId() +
                "\n年龄:" + getAge();
    }
}

初步配置mybatis-config.xml以及需要的mapper文件

在resource下建立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>
    <!--配置引用的数据库properties文件,优先级最低
    如果没有设置properties文件则也可以单独配置一个properties标签把所有的属性数据写好,设置id引用标签,优先级次低
    也可以在下面environment标签下写定,优先级最高-->
    <properties resource="jdbc.properties"></properties>

    <!--配置setting,常用的有设置缓存cacheEnabled标签,再者就是以下的自动转化驼峰命名
    因为数据库字段名称多以_间隔,把以下属性设置为true则可以把这样的字段名自动转化成驼峰命名,便于自动注入,
    例如:student_id ===> studentId,
    当然不用也可以,没有什么不能自己手动设置的-->
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    
    <!--设置多次重用的mapper所引用的实体类包的别名,便于pojo的引用-->
    <typeAliases>
        <package name="com.elvis.pojo"/>
    </typeAliases>

    <!--oracle数据库的设置,environment标签可建立多个,对应不同的数据库,id为唯一标识-->
    <environments default="oracle">
        <environment id="oracle">
            <transactionManager type="JDBC"/>
            <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>

    <!--设置mapper集中管理的文件夹,便于mapper的引用,当然也可以单独引用,
    注意使用这种方式,xml文件名必须和对应的dao层类同路径同名,否则无法自动注入-->
    <mappers>
        <package name="com.elvis.dao"/>
    </mappers>

</configuration>

接下来设置一个用于查询学生信息的mapper文件,由于我们使用的是package标签引用,所以我们需要注意的是需要我们的mapper文件需要和dao层文件同名同路径,把mapper和dao一起丢在dao层包下,可能觉得很乱,我们可以在resource下建立和对应dao层同样的文件夹,把mapper集中管理。
我的dao层类IStudentDao.java建立在com.elvis.dao下,那么对应的IStudentDao.xml文件就位于resource/com/elvis/dao下

<?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为接口全路径-->
<mapper namespace="com.elvis.dao.IStudentDao">
	<!--同样这里的id也是非代理模式只需要保证唯一性就可以了,代理模式则需要和接口方法一致
	resultType属性标明的是返回的数据结果封装到哪一个实体类里面,这里要写明包名+类名,
	还记得我们在mybatis-config里面写的<typeAliases>吗,设置之后就只需要写明class名就好了-->
    <select id="getStudentById" resultType="Student">
        select * from STUDENT where STUDENTID = #{studentId}
    </select>
    <select id="getAllStudent" resultType="Student">
        select * from STUDENT
    </select>
</mapper>

我在这里直接使用的mybatis的代理机制,mybatis的代理机制就是在编写dao层代码时可以只写接口,无须再写所有的实现类,mybatis可以自动生成对应的实现类。以下就是dao的接口:

package com.elvis.dao;


import com.elvis.pojo.Student;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface IStudentDao {
	//Param是注解注入参数,之后我会单独说明注解注入参数的方式和非注释下的多参数传入,只要知道如果参数是单个基本数据类型和String的话,这里是可以省略注解的
   public Student getStudentById(@Param(value = "studentId") String id);
   public List<Student> getAllStudent();
}

Test

好了,目前mybatis初步使用基本都配置完了,在student table中插入几条数据开始测试:

import com.elvis.dao.IStudentDao;
import com.elvis.pojo.Student;
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.Before;
import org.junit.Test;

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

public class StudentInformationTest {
	//SqlSessionFactoryg工厂对象
    private SqlSessionFactory factory;
    //SqlSession 会话对象,这就是我们对于数据库一次连接对象,具体操作都以它进行
    private SqlSession sqlSession;
    //SqlSessionFactory是需要SqlSessionFactoryBuilder读取配置文件之后创建的
    private String resource = "mybatis-config.xml";

    @Before
    public void init() throws IOException {
    	//把配置文件转化成流,用于下步建立SqlSessionFactory,这里getResourceAsStream有多个重载,之后一一讲述各个方法的具体使用
        InputStream inputStream = Resources.getResourceAsStream(resource);
        factory = new SqlSessionFactoryBuilder().build(inputStream);
    }

    @Test
    public void getStudentById(){
    	//打开会话
        sqlSession = factory.openSession();
        //这里是代理模式下自动生成实现类,非代理模式则需要new 一个具体的实现类的实例调用实例方法
        IStudentDao iStudentDao = sqlSession.getMapper(IStudentDao.class);
        Student student = iStudentDao.getStudentById("2016032082");
        System.out.println(student);
        //关闭会话,清除一级缓存,mybatis缓存会在后面去讲
        sqlSession.close();
    }

  }

结果如下,成功!
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值