MyBatis 是一个基于 java 的持久层ORM( Object Relational Mapping,对象关系映射)
框架,内部封装了 jdbc,开发者只需要关注 sql 语句 本身,而不需要处理加载驱动、创建连接、创建 statement、关闭连接,资源等繁杂的过程。
MyBatis 通过 xml 或注解,两种方式将要执行的各种 sql 语句配置起来,并通过 java 对象和 sql 的 动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。
(1)注册驱动
(2)获取连接
(3)获取数据库操作对象
(4)执行SQL语句
(5)处理查询结果集
(6)释放资源
这些导致
(1)代码比较多,开发效率低
(2)需要关注 Connection ,Statement, 9ResultSet 对象创建和销毁
(3)对 ResultSet 查询的结果,需要自己封装为 List
(4)重复的代码比较多些
(5)业务代码和数据库的操作混在一起。
String driver = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://127.0.0.1:3306/mydb";
String user = "root";
String pwd = "123456";
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
//1、注册驱动(连接的数据库)
Class.forName(driver);
//2、获取连接
conn = DriverManager.getConnection(url,user,pwd);
//3、获取数据库操作对象(专门执行sql语句的对象)
stmt = conn.createStatement();
//4、执行SQL语句(DQL DML....)
String sql = "select empno,empname as name,sal from emp2 where empno=7369";
rs = stmt.executeQuery(sql);
//5、处理查询结果集(只有当第四步执行的是select语句的时候,才有处理查询结果集)
while (rs.next()){
/*
(1)下标取值;下标从 1 开始
*/
String empno = rs.getString(1);
String empname = rs.getString(2);
String sal = rs.getString(3);
System.out.println(empno + " " + empname + " " + sal);
/*
(2)数据类型取值
*/
int empno1 = rs.getInt(1);
String empname1 = rs.getString(2);
Double sal1 = rs.getDouble(3);
System.out.println(empno1 + " " + empname1 + " " + sal1);
/*
(3)字段名取值
*/
String empno2 = rs.getString("empno");
//如果执行的SQL语句中有别名,需要使用别名字段取值
String empname2 = rs.getString("name");
String sal2 = rs.getString("sal");
System.out.println(empno2 + " " + empname2 + " " + sal2);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
//6、释放资源;从小到大关闭
if (rs != null) {
try {
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
mybatis是 MyBatis SQL Mapper Framework for Java (sql映射框架)
把数据库表中的一行数据 映射为 一个java对象
一行数据可以看做是一个java对象;操作这个对象,就相当于操作表中的数据
MyBatis框架
【1】提供了创建和销毁、关闭Connection ,Statement, ResultSet等对象能力
【2】提供了执行sql语句的能力
【3】提供了循环sql, 把sql的结果转为java对象, List集合的能力
首先以SqlSession的方式使用mybatis框架
首先我们先设置一下maven的本地仓库
CREATE TABLE `user` (
`user_id` int(10) NOT NULL COMMENT '用户名ID',
`user_name` varchar(100) DEFAULT NULL COMMENT '用户名',
`email` varchar(80) DEFAULT NULL COMMENT '用户邮箱',
`age` int(5) DEFAULT NULL COMMENT '年龄',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
4.0.0
org.example
maven-demo
1.0-SNAPSHOT
pom
1.8
1.8
UTF-8
junit
junit
4.12
test
com.fasterxml.jackson.core
jackson-databind
2.12.3
org.mybatis
mybatis
3.5.1
mysql
mysql-connector-java
5.1.9
org.junit.jupiter
junit-jupiter
RELEASE
compile
src/main/java
**/*.properties
**/*.xml
false
org.apache.maven.plugins
maven-compiler-plugin
16
package com.example.domain;
public class User {
private int userId;// 对应数据表User user_id
private String userName;// 对应数据表User user_name
private String email; // 对应数据表User email
private int age;// 对应数据表User age
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
UserDao.java
用于 定义操作数据库的方法
package org.example.dao;
import org.example.domain.User;
import java.util.List;
/**
* 用户的持久层接口
* 继承该接口的类,实现接口中的方法,就可以实现对user表的增删改查
*/
public interface UserDao {
/**
* 查询user列表
* @param user 单个user用户 [入参是user对象]
* @return user的list
*/
List selectUserList(User user); // 方法名和mapper.xml中的id值一致
/**
* 插入user
* @param user
* @return
*/
int insertUser(User user);// 方法名和mapper.xml中的id值一致
}
UserDao接口定义了两个方法,继承了该接口的类,要实现这两个接口方法。
上面两个接口中的方法,入参是一个实体类User对象,即之前步骤3 定义一行表数据对应一个java对象,操作该对象就是操作数据表这行数据。
创建一个mybatis使用的配置文件 SQL映射文件
编写SQL语句,一般一个表对应一个SQL映射文件,这个文件就是xml文件
sql映射文件(sql mapper)
编写SQL语句,mybatis负责执行这些SQL语句
UserDao.xml
insert into user values(#{userId},#{userName},#{email},#{age})
主配置文件提供了数据库的连接信息 和 SQL映射文件的位置 信息,一个项目一个主配置文件。
mybatis-config.xml
每个表都会配置一个mapper 即xml文件。
通过mybatis访问数据库
package org.example;
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.example.domain.User;
import org.example.utils.MyBatisUtil;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class TestMyBatis {
/**
* 查询user列表
*/
@Test
public void testSelectUserList(){
try {
//访问mybatis读取user数据
//1、定义mybatis主配置文件名称,从类路径的根开始(target/clasess)
String config = "mybatis-config.xml";
//2、读取config表示的文件
InputStream in = Resources.getResourceAsStream(config);
//3、创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//4、创建SqlSessionFactory对象
SqlSessionFactory factory = builder.build(in);
//5、获取SqlSession对象,从SqlSessionFactory中获取SqlSession(非自动提交事务,如果增删改需要手动提交事务)
SqlSession sqlSession = factory.openSession();
//6、指定要执行的SQL语句标识;sql映射文件中的 namespace + "." + 标签的id值
String sqlId = "org.example.dao.UserDao.selectUserList";
//7、执行sql语句,通过sqlId找到语句
List userList = sqlSession.selectList(sqlId);
//8、输出结果
for (User user:userList){
System.out.println("查询用户="+user);
}
//9、关闭SQLSession对象
sqlSession.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 查询user列表
*/
@Test
public void testMyBatisUtil(){
try {
SqlSession sqlSession = MyBatisUtil.getSqlSession();
String sqlId = "com.example.dao.UserDao.selectUserList";
//7、执行sql语句,通过sqlId找到语句
List userList = sqlSession.selectList(sqlId);
//8、输出结果
for (User user:userList){
System.out.println("查询用户="+user);
}
//9、关闭SQLSession对象
sqlSession.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 插入
*/
@Test
public void testInsertUser(){
SqlSession sqlSession = null;
try {
sqlSession = MyBatisUtil.getSqlSession();
String sqlId = "com.mycompany.dao.UserDao.insertUser";
//7、执行sql语句,通过sqlId找到语句
User user = new User();
user.setUserId(5);
user.setUserName("zhangfei");
user.setEmail("[email protected]");
user.setAge(16);
int nums = sqlSession.insert(sqlId,user);
//mybatis默认不是自动提交事务的, 所以在insert ,update ,delete后要手工提交事务
sqlSession.commit();
System.out.println("更新用户条数="+nums);
//9、关闭SQLSession对象
sqlSession.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
MyBatisUtil.java
package org.example.utils;
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;
public class MyBatisUtil {
public MyBatisUtil() {
}
public static SqlSession getSqlSession() throws IOException {
String config = "mybatis-config.xml";
InputStream ins = Resources.getResourceAsStream(config);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(ins);
SqlSession sqlSession = factory.openSession();
return sqlSession;
}
}
后续使用sqlSession,就实例化这个工具类MyBatisUtils类
(1)Resources
mybatis中的一个类, 负责读取主配置文件
// 1、定义mybatis主配置文件名称,从类路径的根开始(target/clasess)
String config = "mybatis-config.xml";
// 2、读取config表示的文件
InputStream in = Resources.getResourceAsStream(config);
(2)SqlSessionFactoryBuilder
创建SqlSessionFactory对象
// 3、创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
// 4、创建SqlSessionFactory对象
SqlSessionFactory factory = builder.build(in);
完整目录
(1)找不到mybatis-config.xml文件或者对应的dao以及SQL映射文件
三种解决方案:
【1】maven clean一下,然后compile一下,会重新生成target目录
【2】Rebuild Project,再重新运行,就会在target目录下出现mybatis-config.xml文件
【3】以上两种方式不行,直接手动将src/resources/mybatis-config.xml文件拷贝至target/classes目录下
(2)dao接口的 方法 和 dao.xml映射文件中的 id 要保持一致(重点)
(3)数据库表中的列名,要和Java实体类中的字段,dao.xml映射文件的属性字段保持一致(重点)
junit:单元测试, 一个工具类库,做测试方法使用的。单元:指定的是方法, 一个类中有很多方法,一个方法称为单元
使用单元测试
(1)需要加入junit依赖
junit
junit
4.11
test
(2)创建测试类
src/test/java目录中创建类
(3)创建测试方法
【1】public 方法
【2】没有返回值 void
【3】方法名称自定义,建议名称是test + 测试方法名称
【4】方法没有参数
【5】方法的上面加入 @Test ,方法可以单独执行;不用使用main方法