MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
开发环境搭建
软件 | 版本 |
---|---|
DM 数据库 | DM 8.0 及以上版本 |
JDK | JDK 8 |
Eclipse | 2018-12 (4.10.0) |
mybatis | 3.4.4 |
安装 DM 数据库
请参考 DM 数据库快速上手指南。
数据库安装过程中,请勾选创建 BOOKSHOP
,DMHR
示例库,作为数据库模拟环境,如下图所示:
安装 Java 开发工具包--JDK
双击安装包进行安装,安装步骤简单,点击【下一步】安装即可。以安装目录 D:\java\jdk1.8.0_111
为例,安装完成如下图所示:
安装成功后需要配置 JDK 环境变量,即将 JDK 安装路径的 bin 路径复制到环境变量 path 里,如下图所示:
环境变量配置成功后,可使用 win+R
打开命令提示符,输入 java -version
命令,可以正常出现 JDK 版本号,即环境变量配置成功,如下图所示:
注意JDK 安装完成后还需配置环境变量,环境变量配置不正确会导致项目启动报错。
因环境变量配置错误导致的常见错误代码如下:
Unable to find a javac compiler;
Perhaps JAVA_HOME does not point to the JDK;
安装集成开发环境 eclipse
正确配置 Java 环境变量后,eclipse 可正常打开。
开发示例
MyBatis 框架的搭建
- 准备项目所需 jar 包。
- 新建项目 JAVA_Mybatis,并导入项目所需 jar 包,如下图所示:
注意复制 jar 包到 lib 文件夹后,要选择所有 jar 包,鼠标右键,Build path-->Add to Build path。
- 在 src 源码目录下创建如下包名,完整项目目录结构如下图所示:
- 书写 Mybatis 的主配置文件:mybatis-config.xml,存放在 src 目录下。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>
<!-- <!– 引入 db.properties 文件 –> -->
<properties resource="jdbc.properties"></properties>
<!-- 配置 mybatis 运行环境-->
<environments default="development">
<environment id="development">
<!-- 配置事务管理,采用 JDBC 的事务管理 -->
<transactionManager type="JDBC" />
<!-- POOLED:mybatis 自带的数据源,JNDI:基于 Tomcat 的数据源 -->
<!--使用 DB.properties-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 将 mapper 文件加入到配置文件中 mapper 文件是写 SQL 语句的文件 -->
<mappers>
<!--这里如果是配置文件用/-->
<mapper resource="com/dao/PersonMapper.xml" />
</mappers>
</configuration>
- 添加 jdbc.properties 配置文件,(主要配置 driver、url、username、password 等)。
修改数据库连接信息,只修改 jdbc.properties 里的字段即可。jdbc.properties 文件如下所示:
jdbc.driver=dm.jdbc.driver.DmDriver
jdbc.url=jdbc:dm://localhost:5236
jdbc.username=SYSDBA
jdbc.password=SYSDBA
基础绑定参数示例代码
基本操作使用的数据表为示例库中 Product 的 PRODUCT_CATEGORY 表,对应于数据库表添加实体类 PRODUCT_CATEGORY,其位置放于 com.pojo 下。
操作数据库对应的实体类
PRODUCT_CATEGORY.java 文件如下所示:
package com.pojo;
public class PRODUCT_CATEGORY {
private int PRODUCT_CATEGORYID;
private String NAME;
public int getPRODUCT_CATEGORYID() {
return PRODUCT_CATEGORYID;
}
public void setPRODUCT_CATEGORYID(int pRODUCT_CATEGORYID) {
PRODUCT_CATEGORYID = pRODUCT_CATEGORYID;
}
public String getNAME() {
return NAME;
}
public void setNAME(String nAME) {
NAME = nAME;
}
public PRODUCT_CATEGORY(int pRODUCT_CATEGORYID, String nAME) {
super();
PRODUCT_CATEGORYID = pRODUCT_CATEGORYID;
NAME = nAME;
}
public PRODUCT_CATEGORY() {
super();
}
}
数据访问层接口
ProductCategoryMapper.java 文件如下所示:
package com.dao;
import java.util.List;
import com.pojo.ProductCategory;
public interface ProductCategoryMapper {
public List<ProductCategory> selectAll();
public int selectCount();
public ProductCategory selectProductCategoryById(Integer id);
public void insertProductCategory(ProductCategory ProductCategory);
public void deleteById(Integer id);
public void updateProductCategory(ProductCategory ProductCategory);
}
数据访问层接口对应配置文件
<?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.dao.ProductCategoryMapper">
<!--parameterType 参数类型 -->
<!--resultType 返回结果集类型 -->
<!--查询所有数据-->
<select id="selectAll" resultType="com.pojo.ProductCategory">
select * from PRODUCTION.PRODUCT_CATEGORY;
</select>
<!--查询总条数-->
<select id="selectCount" resultType="int">
select count(*) from PRODUCTION.PRODUCT_CATEGORY;
</select>
<!--根据 ID 查询指定信息-->
<!--有参数有返回值-->
<select id="selectProductCategoryById" parameterType="java.lang.Integer"
resultType="com.pojo.ProductCategory">
select * from PRODUCTION.PRODUCT_CATEGORY WHERE PRODUCT_CATEGORYID = #{PRODUCT_CATEGORYID};
</select>
<!--插入信息-->
<insert id="insertProductCategory" parameterType="com.pojo.ProductCategory" >
INSERT into PRODUCTION.ProductCategory(name)VALUES (
#{name}
);
</insert>
<!--根据 id 删除信息-->
<delete id="deleteById" parameterType="int">
delete from PRODUCTION.PRODUCT_CATEGORY where PRODUCT_CATEGORYID = #{PRODUCT_CATEGORYID};
</delete>
<!--根据 id 修改信息-->
<update id="updateProductCategory" parameterType="com.pojo.ProductCategory">
update PRODUCTION.PRODUCT_CATEGORY set NAME = #{NAME}
where PRODUCT_CATEGORYID = #{PRODUCT_CATEGORYID}
</update>
</mapper>
测试类
TestProduct.java 文件如下所示:
package com.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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.Test;
import com.dao.ProductCategoryMapper;
import com.pojo.ProductCategory;
public class TestProduct {
SqlSession sqlSession = null;
ProductCategoryMapper productCategoryMapper = null;
public void init() {
try {
//1. 生成 sqlsession factory biulder 对象
SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
//2. 加载配置文件作为一个输入流
//这里 Resources 使用的包是 ibatis 包
InputStream resourceAsStream;
resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
//3. 通过会话工厂构造器对象和配置文件流构建一个会话构造工厂
SqlSessionFactory factory = sfb.build(resourceAsStream);
//4. 通过 SQL 会话工厂 //true 设置 mybatis 事务自动提交
sqlSession = factory.openSession(true);
productCategoryMapper = sqlSession.getMapper(ProductCategoryMapper.class);
} catch (IOException e) {
e.printStackTrace();
}
}
//测试插入信息
@Test
public void testInstert(){
productCategoryMapper.insertProductCategory(new ProductCategory(null, "语文"));
}
//测试修改信息
@Test
public void testUpdate(){
ProductCategory productCategory = productCategoryMapper.selectProductCategoryById(4);
productCategory.setNAME("英语");
productCategoryMapper.updateProductCategory(productCategory);
}
//测试根据 id 查询指定人信息
@Test
public void testSelectPersonById(){
ProductCategory productCategory = productCategoryMapper.selectProductCategoryById(1);
System.out.println(productCategory);
}
//测试全查
@Test
public void testSelectAll(){
List<ProductCategory> list = productCategoryMapper.selectAll();
for(ProductCategory p: list){
System.out.println(p);
}
}
//测试删除
@Test
public void testDelete(){
productCategoryMapper.deleteById(5);
}
public static void main(String[] args) {
TestProduct test = new TestProduct();
test.init();
test.testUpdate();
test.testSelectPersonById();
test.testSelectAll();
test.testDelete();
}
}
运行后控制台截图如下所示:
运行后数据库表截图如下所示:
大字段操作示例
- 创建需要操作的含大字段类型的数据表。
CREATE TABLE "PRODUCTION"."TEST_BIG_DATA"
(
"id" INT IDENTITY(1, 1) NOT NULL,
"photo" IMAGE,
"describe" BLOB,
"txt" CLOB);
- 在 D 盘根目录下,创建
DM8 特点.jpg
、达梦产品简介.txt
两个文件,作为大字段存储,如下图所示:
操作数据库对应的实体类
TestBigData.java 文件如下所示:
package com.pojo;
public class TestBigData {
private Integer id;
private byte[] photo; //mybatis 将 Image 和 Blob 映射成 byte[]
private byte[] describe;
private String txt; //mybatis 将 Clob 映射成 String
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public byte[] getPhoto() {
return photo;
}
public void setPhoto(byte[] photo) {
this.photo = photo;
}
public byte[] getDescribe() {
return describe;
}
public void setDescribe(byte[] describe) {
this.describe = describe;
}
public String getTxt() {
return txt;
}
public void setTxt(String txt) {
this.txt = txt;
}
@Override
public String toString() {
return "TestBigData [id=" + id + ", txt=" + txt + "]";
}
public TestBigData(Integer id, byte[] photo, byte[] describe, String txt) {
super();
this.id = id;
this.photo = photo;
this.describe = describe;
this.txt = txt;
}
public TestBigData() {
super();
}
}
数据访问层接口
TestBigDataMapper.java 文件如下所示:
package com.dao;
import java.util.List;
import com.pojo.TestBigData;
public interface TestBigDataMapper {
//插入大字段
public void InsertIntoTestBigData(TestBigData bigdata);
//查询大字段
public List<TestBigData> SelectFromTestBigData();
}
数据访问层接口对应配置文件
<?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.dao.TestBigDataMapper">
<!--parameterType 参数类型-->
<!--resultType 返回结果集类型-->
<!--查询所有数据-->
<select id="SelectFromTestBigData" resultType="com.pojo.TestBigData">
select * from PRODUCTION.TEST_BIG_DATA;
</select>
<!--插入信息-->
<insert id="InsertIntoTestBigData" parameterType="com.pojo.TestBigData" >
INSERT into PRODUCTION.TEST_BIG_DATA("photo","describe","txt")VALUES (
#{photo},#{describe},#{txt}
);
</insert>
</mapper>
测试类
Test_TestBigData.java 文件如下所示:
package com.test;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.List;
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 com.dao.TestBigDataMapper;
import com.pojo.TestBigData;
public class Test_TestBigData {
SqlSession sqlSession = null;
TestBigDataMapper testBigDataMapper = null;
public void init() {
try {
//1. 生成 sqlsession factory biulder 对象
SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
//2. 加载配置文件作为一个输入流
//这里 Resources 使用的包是 ibatis 包
InputStream resourceAsStream;
resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
//3. 通过会话工厂构造器对象和配置文件流构建一个会话构造工厂
SqlSessionFactory factory = sfb.build(resourceAsStream);
//4. 通过 SQL 会话工厂 //true 设置 mybatis 事务自动提交
sqlSession = factory.openSession(true);
testBigDataMapper = sqlSession.getMapper(TestBigDataMapper.class);
resourceAsStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Test_TestBigData test = new Test_TestBigData();
test.init();
//test.testInsert();
test.testSelect();
}
//测试插入大字段表
private void testInsert() {
try {
String filePath = "D:\\DM8特点.jpg";
File file = new File(filePath);
String filePath2 = "D:\\达梦产品简介.txt";
File file2 = new File(filePath2);
InputStream in;
in = new BufferedInputStream(new FileInputStream(file));
byte[] bytes1 = new byte[102400];
byte[] bytes2 = new byte[102400];
in.read(bytes1);
InputStream in2 = new BufferedInputStream(new FileInputStream(file));
in2.read(bytes2);
BufferedReader reader = new BufferedReader(new InputStreamReader
(new FileInputStream(file2),"UTF-8"));
char[] c = new char[10240];
char[] chars = new char[4096];
reader.read(chars);
TestBigData bigData = new TestBigData(null,bytes1,bytes2,new String(chars));
testBigDataMapper.InsertIntoTestBigData(bigData);
in.close();
in2.close();
reader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//测试查询大字段表
private void testSelect() {
List<TestBigData> list = testBigDataMapper.SelectFromTestBigData();
try {
for(TestBigData big:list) {
//打印出id
System.out.println("id = "+big.getId());
//将 photo 列信息输出到指定路径
FileOutputStream fos = new FileOutputStream("D:/"+big.getId()+"_DM8特点.jpg");
fos.write(big.getPhoto());
//将 describe 列信息输出到指定路径
FileOutputStream fos2 = new FileOutputStream("D:/"+big.getId()+"_Blob_DM8特点.jpg");
fos2.write(big.getDescribe());
//将 photo 列信息输出到控制台
System.out.println("txt="+big.getTxt());
fos.close();
fos2.close();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果截图
运行前如下图所示:
运行后控制台输出 Clob 里保存的大字段文本信息,如下图所示:
运行后读取处理 Image 大字段和 Blob 大字段后的信息,如下图所示:
运行后数据库数据信息如下图所示:
示例代码下载
请下载示例代码。