Mybatis 框架基于idea的maven环境搭建和初步使用查询
前言
虽然注册账号良久,但是一直忙于学习和工作,一直没有整理记录自己的学习笔记,感谢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数据表格:
在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();
}
}
结果如下,成功!