MyRowMapper<T>

package com.oracle.jdbc;

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Date;
import java.util.HashMap;

import org.springframework.jdbc.core.RowMapper;

/**
 * 
 * @author lxw
 */
public class MyRowMapper<T> implements RowMapper<T> {

	/**
	 * 添加字段注释.
	 */
	private Class<?> targetClazz;

	/**
	 * 添加字段注释.
	 */
	private HashMap<String, Field> fieldMap;

	/**
	 * 构造函数.
	 * 
	 * @param targetClazz
	 *            .
	 */
	public MyRowMapper(Class<?> targetClazz) {
		this.targetClazz = targetClazz;
		fieldMap = new HashMap<>();
		Field[] fields = targetClazz.getDeclaredFields();
		for (Field field : fields) {
			// 同时存入大小写,如果表中列名区分大小写且有列ID和列iD,则会出现异常。
			// 阿里开发公约,建议表名、字段名必须使用小写字母或数字;禁止出现数字开头,禁止两个下划线中间只出现数字。
			fieldMap.put(field.getName(), field);
			// fieldMap.put(getFieldNameUpper(field.getName()), field);
		}
	}

	/**
	 * {@inheritDoc}.
	 */
	@Override
	public T mapRow(ResultSet rs, int arg1) throws SQLException {
		T obj = null;

		try {
			obj = (T) targetClazz.newInstance();

			final ResultSetMetaData metaData = rs.getMetaData();
			int columnLength = metaData.getColumnCount();
			String columnName = null;

			for (int i = 1; i <= columnLength; i++) {
				columnName = metaData.getColumnName(i);
				Class fieldClazz = fieldMap.get(columnName).getType();
				Field field = fieldMap.get(columnName);
				field.setAccessible(true);

				// fieldClazz == Character.class || fieldClazz == char.class
				if (fieldClazz == int.class || fieldClazz == Integer.class) { // int
					field.set(obj, rs.getInt(columnName));
				} else if (fieldClazz == boolean.class || fieldClazz == Boolean.class) { // boolean
					field.set(obj, rs.getBoolean(columnName));
				} else if (fieldClazz == String.class) { // string
					field.set(obj, rs.getString(columnName));
				} else if (fieldClazz == float.class) { // float
					field.set(obj, rs.getFloat(columnName));
				} else if (fieldClazz == double.class || fieldClazz == Double.class) { // double
					field.set(obj, rs.getDouble(columnName));
				} else if (fieldClazz == BigDecimal.class) { // bigdecimal
					field.set(obj, rs.getBigDecimal(columnName));
				} else if (fieldClazz == short.class || fieldClazz == Short.class) { // short
					field.set(obj, rs.getShort(columnName));
				} else if (fieldClazz == Date.class) { // date
					field.set(obj, rs.getDate(columnName));
				} else if (fieldClazz == Timestamp.class) { // timestamp
					field.set(obj, rs.getTimestamp(columnName));
				} else if (fieldClazz == Long.class || fieldClazz == long.class) { // long
					field.set(obj, rs.getLong(columnName));
				}

				field.setAccessible(false);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		return obj;
	}

	/**
	 * 方法首字母大写.
	 * 
	 * @param fieldName
	 *            字段名.
	 * @return 字段名首字母大写.
	 */
	private String getFieldNameUpper(String fieldName) {
		char[] cs = fieldName.toCharArray();
		cs[0] -= 32; // 方法首字母大写
		return String.valueOf(cs);
	}
}

### 实现CRUD操作的简单业务对象示例 #### 创建 Spring Boot 和 MyBatis 集成环境 为了实现一个简单的业务对象来完成 CRUD 操作,需要先配置好 Spring Boot 和 MyBatis 的集成环境。这通常涉及到引入必要的依赖项以及设置数据源和 MyBatis 映射器。 在 `pom.xml` 文件中加入如下 Maven 依赖: ```xml <dependencies> <!-- Other dependencies --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> </dependencies> ``` #### 定义实体类 定义名为 `MyRow` 的 Java 类作为实体类,该类中的属性应与数据库表 `MyTable` 中列名相对应[^1]。 ```java public class MyRow { private Long id; private String name; // Getters and Setters omitted for brevity } ``` #### 编写 Mapper 接口 创建接口用于描述对数据库的操作方法,并通过注解指定 SQL 查询语句或映射文件路径。 ```java @Mapper public interface MyRowMapper { @Insert("INSERT INTO my_table(name) VALUES(#{name})") int insert(MyRow record); @Delete("DELETE FROM my_table WHERE id=#{id}") void deleteById(Long id); @Update("UPDATE my_table SET name=#{name} WHERE id=#{id}") void updateByPrimaryKeySelective(MyRow record); @Select("SELECT * FROM my_table WHERE id=#{id}") MyRow selectByPrimaryKey(Long id); } ``` #### 构建 Service 层逻辑 编写服务层组件负责处理具体的业务需求并调用相应的 DAO 方法执行持久化动作。 ```java @Service public class MyRowService { @Autowired private MyRowMapper mapper; public boolean addNewRecord(String newName){ MyRow newRow = new MyRow(); newRow.setName(newName); return this.mapper.insert(newRow)>0?true:false; } public boolean removeRecordById(long id){ try{ this.mapper.deleteById(id); return true; }catch(Exception e){ System.out.println(e.getMessage()); return false; } } public boolean modifyRecord(MyRow updatedRecord){ try{ this.mapper.updateByPrimaryKeySelective(updatedRecord); return true; }catch(Exception e){ System.out.println(e.getMessage()); return false; } } public MyRow fetchRecordById(long id){ return this.mapper.selectByPrimaryKey(id); } } ``` 以上代码展示了如何利用 Spring Boot 结合 MyBatis 来构建支持基本增删改查功能的服务端应用程序的一部分。这里省略了一些细节比如异常捕获机制、日志记录等,在实际项目开发过程中应当更加完善这些方面以提高系统的健壮性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值