MyBatis入门
MyBatis简介
- MyBatis 本是apache的一个开源项目iBatis, 是一个基于Java的Dao框架。
- MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。(JDBC仅是规范)
- MyBatis 使用简单的 XML或注解用于配置和原始映射,将java普通对象映射为数据库的记录。(ORM---Object Relational Mapping)
创建样本表作准备
创建数据库(mysql)
create database test(id int,name varchar(10),major varchar(20));
创建表
use mybatis;
create table test(id int,name varchar(10),major varchar(20));
写入样本数据
insert into test values(1,'Jack','Math');
insert into test values(2,'Marck','English');
insert into test values(3,'szx','弱鸡');
PS: 这里我用了mycli插件,支持自动补全和语法高亮
建立新的Maven项目
maven项目默认,建好之后如下
导入依赖
编辑pom.xml文件
<?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>org.example</groupId>
<artifactId>MyBatisTest</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<!--MyBatis框架依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</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.12</version>
</dependency>
<!--测试类-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
完成后会自动下载依赖,如果没有则手动导入
建立相关的包(Dao和Domain)
- dao中建IinfoDao接口,其中写的findAll()方法是用来查询的
- domain中的info类实现Serializable接口(方便其对象被序列化)
- 其中Serializable接口只是个标志,里面是空的
- serialVersionUID最好是定义,否则反序列化可能出毛病
结果如图
编写info类(查询结果以类的形式封装)
- 首先查看mybatis数据库的数据类型
- info类中定义的变量名和类型都尽量与数据库中的一样
- 编写info类
//info.class
//自己导包(通常可以自动)
import java.io.Serializable;
public class info implements Serializable {
private static final long serialVersionUID = 1L;
//定义变量
private int id;
private String name;
private String major;
//alt+insert 生成方法
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 getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
//ctrl+o重写toString方法
@Override
public String toString() {
return "id:"+id
+", name:"+name
+", major:"+major;
}
}
编写配置部分
编写log4j.properties
- 在resources目录下新建两个文件分别是log4j.properties和SMConfig.xml
- 其中SMConfig.xml为mybatis的核心配置文件
- 先编写log4j.properties
### log4j.properties ###
### 设置###
log4j.rootLogger = debug,stdout,D,E
### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = E://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 输出ERROR 级别以上的日志到=E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =E://logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
编写SMConfig.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>
<!--配置环境-->
<environments default="mysql">
<!--环境id-->
<environment id="mysql">
<!--事务类型-->
<transactionManager type="JDBC"></transactionManager>
<!--数据源(连接池)-->
<dataSource type="POOLED">
<!--连接数据库的基本信息-->
<!--驱动-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/> <!--注意mysql版本(有无cj)-->
<!--url-->
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<!--数据库用户名-->
<property name="username" value="root"/>
<!--数据库密码-->
<property name="password" value="szx"/>
</dataSource>
</environment>
</environments>
<!--如果不使用注解的方法还要配置映射文件-->
<!--指定映射配置文件位置,映射配置文件指的是每个Dao独立的配置文件-->
<mappers>
<!--包名最好一一对应-->
<!--在resources文件夹中建包com.szx.dao 包下建文件IinfoDao.xml -->
<mapper resource="com/szx/dao/IinfoDao.xml"/>
</mappers>
</configuration>
编写IinfoDao.xml
- 在resources文件夹中建包
- 包下建文件IinfoDao.xml
如果不能建包,那就一层层文件夹地建
![C!--这上面都是规范--E](https://images.cnblogs.com/cnblogs_com/xun-/1760690/o_200508144354idea6.png)
<!-- IinfoDao.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.szx.dao.IinfoDao">
<!--配置查询所有-->
<!--Dao的方法名称-->
<select id="findAll" resultType="com.szx.domain.info">
<!--id必须和方法名对应,resultType指定结果存放在哪个类-->
<!--里面写sql语句-->
select * from user;
</select>
</mapper>
到这一步所有的配置都已经完成,接着写测试类运行
编写测试类
- test文件夹的java中建立相同的包结构
//test.java
package com.szx.test;
import com.szx.dao.IinfoDao;
import com.szx.domain.info;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class Test {
public static void main(String[] args) throws IOException {
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("SMConfig.xml");
//2.创建SqlSessionFactory工厂对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.用工厂生产新的SqlSession对象
SqlSession session = factory.openSession();
//4.使用SqlSession创建Dao接口的代理对象
IinfoDao infoDao = session.getMapper(IinfoDao.class);
//5.使用代理对象执行方法
List<info> infos = infoDao.findAll();
for (info inf:infos) {
System.out.println(inf);
}
//6.释放资源
session.close();
in.close();
}
}