在MyBatis+MySQL中,将查询的结果放到Map的几种方式

本文介绍如何使用MyBatis通过两种方式(XML配置与注解)将数据库查询结果映射到Map中,并提供了具体的代码实现及注意事项。

1、基于XML形式,将查询的结果放到Map中

	/**
	 * 将查询到的用户信息放到Map当中,然后从HashMap中获取用户信息
	 */
	@Test
	public void GetUserFromMap(){
		SqlSession sqlSession = MybatisUtils.SqlSessionManualCommit();
		String statement = userNameSpace + "getUserFromMap";
		HashMap<String,Object> user = sqlSession.selectOne(statement, 1);	
		sqlSession.close();
		System.out.println("map");
		System.out.println(user);
		//目的是为了要注意,从hashMap中获取值,要注意key的大小写
		System.out.println(user.get("name"));
		System.out.println(user.get("NAME"));
	}
	<!-- 将查询的结果放到map当中 -->
	<select id="getUserFromMap" parameterType="int" resultType="map">
		SELECT
		ID,NAME,AGE FROM USER WHERE ID=#{id}
	</select>

2、基于注解的方式,将查询的结果放到Map中

	@Test
	public void getUserFromMap(){
		SqlSession sqlSession = MybatisUtils.SqlSessionAutoCommit();
		UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
		HashMap<String,Object> userMap=userMapper.getUserFromMap(1);
		sqlSession.close();
		System.out.println(userMap);	
	}

	@Select("select id,name,age from user where id=#{id}")
	public HashMap<String,Object> getUserFromMap(int id);

3、备注声明

        以上部分笔者仅仅展示了核心代码,其代码细节的部分,详情请见笔者上传到码云的项目mybatis1


<think>好的,我现在需要帮助用户实现一个使用Java、Tesseract、MyBatis的功能,从批量图片中识别特定标题后的文字,存储到MySQL,然后读取生成Word文档,并且优化MyBatis的批量插入。用户还要求标注代码中的DAO、Service、Entity和Mapper部分。 首先,我得理清整个流程。用户的需求分几个步骤:图片处理、文字识别、数据存储、数据读取和文档生成。每个步骤需要对应的技术组件。 1. **OCR处理部分**:使用Tesseract,可能需要用到Tess4J这个Java封装库。需要确保用户已经安装了Tesseract并正确配置了环境变量,以及Tessdata的语言包。在代码中,需要处理图片,可能要先裁剪或定位特定标题的位置,然后提取后面的文字。这部分可能需要图像处理库,比如OpenCV或者Java自带的BufferedImage操作。但用户的问题中没有提到图像处理,可能需要进一步确认,但根据问题描述,用户只说“特定标题后的文字”,可能需要先识别标题的位置,然后截取后面的内容。这可能比较复杂,但假设用户提供的图片结构固定,标题位置相对固定,可以通过坐标裁剪。或者,可能需要用OCR识别整个图片的文字,然后通过正则表达式匹配特定标题后的内容。这里可能用正则更可行,比如识别出文本后,用正则匹配“标题:(.+)”这样的模式,提取后面的内容。 2. **数据库部分**:使用MyBatis连接MySQL,需要配置数据源,定义实体类(Entity),Mapper接口(DAO层),以及Service层处理业务逻辑。用户提到要优化MyBatis的批量插入,通常MyBatis的批量插入可以通过使用<foreach>标签在Mapper XML中拼接多个VALUES,或者使用ExecutorType.BATCH的SqlSession来执行批量操作。MyBatis-Plus的话有saveBatch方法,但用户同时提到原生的MyBatisMyBatis-Plus的配置冲突,所以需要注意不要在配置文件中同时引入两种框架的配置,这点在用户提供的引用中有提到。 3. **Word文档生成**:可以使用Apache POI库来创建Word文档,将数据库中的内容读取后写入到.docx文件中。 接下来需要分模块设计代码结构: - **Entity类**:对应数据库中的表,比如TextContent,包含字段id、title、content、filePath等。 - **DAO/Mapper接口**:定义数据库操作方法,比如批量插入insertBatch,和查询方法selectAll。 - **Service层**:处理OCR识别、调用DAO进行数据存储,以及生成Word文档的业务逻辑。 - **Controller或主程序**:协调整个流程,调用Service方法。 关于MyBatis批量插入的优化,用户可能指的是减少数据库的往返次数,使用批量操作。在MyBatis中,可以使用动态SQL的foreach标签,或者在代码中手动创建批量插入的语句。例如,在Mapper XML中: ```xml <insert id="insertBatch" parameterType="list"> INSERT INTO text_content (title, content, file_path) VALUES <foreach collection="list" item="item" separator=","> (#{item.title}, #{item.content}, #{item.filePath}) </foreach> </insert> ``` 但需要注意,MySQL的JDBC驱动默认不支持一次插入多条记录的批量操作,而是通过rewriteBatchedStatements参数来优化,需要在连接字符串中加上rewriteBatchedStatements=true。或者在MyBatis中使用BatchExecutor,通过SqlSession的批量模式来执行多次插入,合并成一批提交。 这里可能用户需要的是使用MyBatis的批量模式,即开启SqlSession的批量执行器,然后在Service层循环调用insert方法,最后统一提交。例如: ```java SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH); try { TextContentMapper mapper = sqlSession.getMapper(TextContentMapper.class); for (TextContent item : list) { mapper.insert(item); } sqlSession.commit(); } finally { sqlSession.close(); } ``` 但这种方式可能比动态SQL的foreach方式效率稍低,但具体取决于数据量和数据库配置。需要根据实际情况选择优化方式。 现在考虑代码结构: 1. **Entity类**:TextContent,包含字段和getter/setter。 2. **Mapper接口**:定义insertBatch和selectAll方法。 3. **Mapper XML**:编写对应的SQL语句,特别是批量插入的SQL。 4. **DAO层**:这里可能Mapper接口就是DAO,如果使用MyBatis的话,通常不需要额外的DAO实现,直接使用Mapper。 5. **Service层**:OCRService负责处理图片识别,DataService处理数据库操作,WordService处理生成Word。 6. **主程序**:调用Service层的方法,完成整个流程。 关于Tesseract的使用,需要注意图片的预处理,比如转为灰度、二值化、调整DPI等,可能提高识别率。用户可能需要这方面的指导,但问题中没有提到,可能需要默认处理。 在代码示例中,需要标注各部分属于Entity、Mapper、DAO、Service。例如: - @Entity标注类,虽然Java Persistence API中常用,但MyBatis不需要,但用户可能需要知道哪个是实体类。 - Mapper接口使用@Mapper注解(如果使用MyBatis-Spring的话)。 - Service类使用@Service注解,或者手动实例化。 现在,编写代码示例时需要注意: - OCR处理部分:使用Tess4J的Tesseract实例,设置语言,读取图片文件,进行识别。 - 数据库操作:配置MyBatis的SqlSessionFactory,使用Spring或独立使用。 - 批量插入优化:在Service中调用Mapper的批量插入方法,或者在循环中使用Batch模式。 用户可能没有使用Spring,所以可能需要传统的MyBatis配置方式,通过SqlSessionFactoryBuilder读取配置文件。 在问题中,用户引用的内容是关于MyBatisMyBatis-Plus的配置冲突,所以在代码中需要确保只引入其中一个配置。因此,在示例中应使用原生的MyBatis配置,或者MyBatis-Plus,但不能同时存在。 最后,生成Word文档使用Apache POI的XWPFDocument,创建段落,添加文本内容。 现在需要检查各部分是否符合要求,并确保代码示例的正确性,比如导入正确的包,处理异常等。</think>我将分步骤说明如何实现这个需求,并提供符合MyBatis规范的代码示例: 一、系统架构设计 ``` 应用架构 ├── Entity # 数据实体 ├── Mapper # MyBatis接口 ├── DAO # 数据访问层(由MyBatis自动实现) ├── Service # 业务逻辑层 └── Main # 流程控制 ``` 二、核心实现步骤 1. 实体类定义(Entity) ```java // TextContent.java public class TextContent { private Long id; private String title; private String content; private String filePath; // 省略getter/setter } ``` 2. MyBatis Mapper接口 ```java // TextContentMapper.java public interface TextContentMapper { // 批量插入优化方法 @Insert("<script>" + "INSERT INTO text_content (title, content, file_path) VALUES " + "<foreach collection='list' item='item' separator=','>" + "(#{item.title}, #{item.content}, #{item.filePath})" + "</foreach>" + "</script>") void insertBatch(@Param("list") List<TextContent> contents); @Select("SELECT * FROM text_content") List<TextContent> selectAll(); } ``` 3. 服务层实现(Service) ```java // OCRService.java public class OCRService { public String extractText(File imageFile) { ITesseract instance = new Tesseract(); instance.setDatapath("tessdata"); // Tesseract训练数据路径 try { return instance.doOCR(imageFile) .replaceAll(".*特定标题:(.*?)(\\n|$)", "$1"); // 正则提取标题后内容 } catch (TesseractException e) { throw new RuntimeException("OCR识别失败", e); } } } // DataService.java public class DataService { private final SqlSessionFactory sqlSessionFactory; public void batchInsert(List<TextContent> contents) { try (SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH)) { TextContentMapper mapper = session.getMapper(TextContentMapper.class); contents.forEach(mapper::insert); session.commit(); // 批量提交优化[^1] } } } // WordService.java public class WordService { public void generateDoc(List<TextContent> data, String outputPath) { XWPFDocument doc = new XWPFDocument(); data.forEach(item -> { XWPFParagraph p = doc.createParagraph(); p.createRun().setText("标题:" + item.getTitle()); p.createRun().setText("内容:" + item.getContent()); }); try (FileOutputStream out = new FileOutputStream(outputPath)) { doc.write(out); } } } ``` 4. 主流程控制 ```java public class MainProcessor { public void process(File[] imageFiles) { // 初始化依赖 OCRService ocrService = new OCRService(); DataService dataService = new DataService(MyBatisUtil.getSqlSessionFactory()); WordService wordService = new WordService(); // 处理图片 List<TextContent> contents = Arrays.stream(imageFiles) .map(file -> new TextContent( null, "默认标题", ocrService.extractText(file), file.getAbsolutePath())) .collect(Collectors.toList()); // 数据库操作 dataService.batchInsert(contents); List<TextContent> dbData = dataService.selectAll(); // 生成文档 wordService.generateDoc(dbData, "output.docx"); } } ``` 三、MyBatis配置优化建议 在`mybatis-config.xml`中配置: ```xml <settings> <setting name="defaultExecutorType" value="BATCH"/> <!-- 启用批量模式 --> <setting name="jdbcTypeForNull" value="NULL"/> <!-- 处理空值 --> </settings> ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值