MyBatis是一个基于java的持久层框架,它的底层封装了jdbc,使我们不用与jdbc api打交道,就可以完成数据库持久层的操作。使用MyBatis框架,开发者只需要关注sql语句本身,不必像传统jdbc编程那样,花费大量时间处理加载驱动、创建连接、创建statement、执行查询、遍历结果集、释放资源等一系列重复步骤。
MyBatis采用ORM思想(object relational mapping 对象关系映射),解决实体和数据库之间的映射问题。
* O:面向对象领域的Object(JavaBean对象)
* R:关系数据库领域的Relational(表的结构)
* M:映射Mapping(XML的配置文件)
MyBatis通过xml或注解的方式将要执行的各种sql配置起来,并通过MyBatis框架执行该sql语句,将结果映射成java对象返回。
为了便于阅读和理解,此处对jdbc查询数据库表数据的操作进行回顾
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try{
// 加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 通过驱动管理类获取数据库连接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8","root", "root");
//定义 sql 语句 ?表示占位符
String sql = "select * from user where username = ?";
//获取预处理 statement
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, "张三");
// 查询数据库,获取结果集
resultSet = preparedStatement.executeQuery();
//遍历结果集
while(resultSet.next()){
System.out.println(resultSet.getString("id")+resultSet.getString("username"));
}
}catch (Exception e){
e.printStackTrace();
}finally {
//释放资源
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
问题分析:
首先添加打包方式,以jar的方式进行打包
jar
然后添加依赖坐标,主要添加mysql(数据库)、mybatis(持久层框架)、log4j(日志)和junit(单元测试)的依赖
org.mybatis
mybatis
3.5.4
mysql
mysql-connector-java
8.0.19
log4j
log4j
1.2.17
junit
junit
3.8.2
test
主要包含姓名、年龄、联系方式和住址4个信息。其中getter,setter和toString方法可以通过右键-generater...使用IDE自动生成。
package com.aifocus.domain;
import java.io.Serializable;
public class UserInfo implements Serializable {
/**
* 姓名
*/
String userName;
/**
* 年龄
*/
int age;
/**
* 联系方式
*/
String phoneNumber;
/**
* 地址
*/
String address;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "UserInfo{" +
"userName='" + userName + '\'' +
", age=" + age +
", phoneNumber='" + phoneNumber + '\'' +
", address='" + address + '\'' +
'}';
}
}
该接口用于查询userinfo表中的所有用户信息
package com.aifocus.dao;
import com.aifocus.domain.UserInfo;
import java.util.List;
/**
* 用户信息持久层接口
*/
public interface UserInfoMapper {
/**
* 查询所有用户信息
* @return 用户信息列表
*/
List findAll();
}
注意:resources路径下对应的包路径,无法使用“.”做分割,com/aifocus/dao需要分别创建(类似文件夹创建)
添加UserInfoMapper.xml文件的Mapper约束
编写findAll的sql查询语句
其中,
该文件位于resouces目录下的根路径,用于配置数据库连接、事务、映射文件等信息
首先添加mybatis配置文件的config约束
配置mybatis环境
映射文件配置(注:映射文件配置需写在configuration标签中)
至此,使用Mybatis编写的查询所有用户信息的基本架构已经完成。接下来进行测试程序的编写。
package com.aifocus.dao;
import com.aifocus.domain.UserInfo;
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.InputStream;
import java.util.List;
/**
* UserInfoMapper方法单元测试类
*/
public class UserInfoMapperTest {
public static void main(String[] args) throws Exception {
// 1. 读取配置文件,要用来加载SqlMapperConfig中的配置文件信息
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
// 2. 创建一个sqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
// 3. 使用工厂生成一个sqlSession对象
SqlSession session = factory.openSession();
// 4. 使用sqlSession创建dao接口的代理对象[没有创建UserInfoMapper接口的实现,就是这里做了动态代理]
UserInfoMapper userInfoMapper = session.getMapper(UserInfoMapper.class);
// 5. 使用代理对象执行方法
List userInfoList = userInfoMapper.findAll();
for(UserInfo user:userInfoList){
System.out.println(user);
}
// 6. 释放资源
session.close();
in.close();
}
}
第一步:创建Maven工程,并导入坐标
第二步:创建实体类和Dao的接口
第三步:创建SqlMapConfig.xml主配置文件
第四步:创建UserInfoMapper.xml映射配置文件
1. 创建UserInfoMapper.xml和UserInfoMapper.java名称保持一致(便于查找问题)
2. 在src下的java和resource下创建目录时是不一样的。java下穿件的是包com.aifocus.dao是三级结构,在resouce下是一级结构
3. mybatis的映射配置文件位置必须和dao接口的包结构相同
4. 映射配置文件的mapper标签的namespace属性的取值必须是dao的全限定类名
5. 映射配置文件的操作配置(select),id属性的取值必须是接口的方法名
注:遵从了345点要求,在开发中,就无须再写Mapper的实现类。
使用上述MyBatis进行开发,还没有直接使用JDBC简单?尤其是编写测试类的时候,很多陌生的东西出现了。其实上述调用是为了让大家了解mybatis是如何加载配置文件,框架是如何省略我们接口实现。在实际应用开发中,上述调用过程会被封装,我们直接使用@Resource注解,就能拿到该对象,进行持久层操作。
欢迎大家一起交流学习