导入MyBatis框架包以及所需仓库(Maven技术在云端下载)
4.0.0
com.bdqn
T369-MyBatis
war
1.0-SNAPSHOT
T369-MyBatis Maven Webapp
http://maven.apache.org
com.mysql
mysql-connector-j
8.2.0
org.mybatis
mybatis
3.5.16
log4j
log4j
1.2.17
junit
junit
4.13.2
test
T369-MyBatis
src/main/resources
**/*.properties
**/*.xml
MyBatis框架的核心配置文件中设置的是MyBatis框架的全局信息,包括数据库连接及事务信息、MyBatis框架运行所需的各种特性,以及一些影响MyBatis框架运行时的行为的属性。需要注意的是该配置文件的元素节点是有先后顺序的。
configuration 根节点
properties 描述一些外部的、可替代的属性
settings 修改MyBatis的运行时行为
typeAliases 为Java类型指定一个别名
typeHandlers 类型处理器
objectFactory 对象工厂
plugins 插件
environments 环境配置
environment 一组环境配置
》transactionManager 事务管理器
》dataSource 数据源
databaseIdProvider 启动多数据库厂商支持
mapper 映射器
在应用程序设计中,实体类通常对应需求中的业务实体,并与关系型数据库中的表结构存在对应关系。通过实体类映射SQL语句实现持久化操作时MyBatis框架最常见的工作模式。
MyBatis框架一般采用POJO编程模型定义实体类,POJO可以简单地理解为符合JavaBean规范的普通的Java对象,该对象没有特殊的继承或实现关系(java.io.Serializable接口除外),使用私有属性存储对象状态,访问属性必须通过相应的getter和setter方法,符合面向对象封装的要求。
package com.bdqn.entity;
import java.io.Serializable;
/**
* @author 崔书健
*/
//@Alias("book")
public class Book implements Serializable {
private static final long serialVersionUID = 42L;
private int bid;
private String bName;
private String author;
private String pubComp;
private String pubDate;
private int bCount;
private float price;
public String toString() {
return "book{bid="+this.bid+",bName="+this.bName+",author="+this.author+",pubComp="+this.pubComp+",pubDate="+this.pubDate+",bCount="+this.bCount+",price="+this.price+"}";
}
public int getBid() {
return bid;
}
public void setBid(int bid) {
this.bid = bid;
}
public String getbName() {
return bName;
}
public void setbName(String bName) {
this.bName = bName;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPubComp() {
return pubComp;
}
public void setPubComp(String pubComp) {
this.pubComp = pubComp;
}
public String getPubDate() {
return pubDate;
}
public void setPubDate(String pubDate) {
this.pubDate = pubDate;
}
public int getbCount() {
return bCount;
}
public void setbCount(int bCount) {
this.bCount = bCount;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
}
在MyBatis框架下,Mapper接口是指用于 绑定到SQL映射语句的接口,又称映射器,通常于SQL映射文件配合使用。对应用而言,Mapper接口即为DAO接口,定义了对数据进行持久化操作的API。
package com.bdqn.mapper;
import com.bdqn.entity.Book;
import java.util.List;
public interface BookMapper {
/**
* 统计图书数量的方法
* @return
*/
public int count();
/**
* 查询用户列表
* @return
*/
public List getBookList();
}
定义与用户操作相关的SQL映射文件,该文件时一个XML文件,如以下实例
本文章使用JUnit进行测试,结果在控制台输出
在静态代码块中创建SqlSessionFactory实例,并定义两个静态方法,分别用于创建SqlSession和关闭SqlSession。
package com.bdqn.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;
/**
* @author 崔书健
*/
public class MyBatisUtil {
private static SqlSessionFactory factory;
static{
try {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
factory = new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
throw new RuntimeException("初始化失败",e);
}
}
public static SqlSession createSqlSession(){
return factory.openSession(false); // false表示关闭自动提交用于事务控制
}
public static void closeSqlSession(SqlSession sqlSession){
if (sqlSession != null){
sqlSession.close();
}
}
}
创建测试类
package com.bdqn.mapper;
import com.bdqn.entity.Book;
import com.bdqn.utils.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import java.io.InputStream;
import java.util.List;
import java.util.logging.Logger;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* @author 崔书健
*/
public class SysBookMapperTest {
private SqlSession sqlSession;
/**
* 在每一个测试用例执行之前做的事情
* @throws Exception
*/
@Before
public void setUp() throws Exception{
sqlSession = MyBatisUtil.createSqlSession();
}
/**
* 在每一个测试用例执行之后做的事情
*/
@After
public void tearDown(){
MyBatisUtil.closeSqlSession(sqlSession);
}
/**
* 测试查询总数据量(myBatis框架基本使用)
*/
@Test
public void testCount(){
int count = sqlSession.getMapper(BookMapper.class).count();
System.out.println("总数据量:" + count);
assert true;
}
/**
* 测试查询数据列表
*/
@Test
public void testBookListQuery(){
List list = sqlSession.getMapper(BookMapper.class).getBookList();
for (Book book : list) {
System.out.println(book);
}
assert true;
}
}