vi /etc/my.cnf
[mysqld]
character-set-server=utf8
方法:在系统运行过程中,针对不同数据库类型区分加载不同文件路径下的sqlmap配置。留给开发人员做的事依旧是快乐地编写原始数据库语句,而不再为多数据库兼容问题挠头。分析问题:
1、解决ibatis多数据库兼容的问题,实际上就是让ibatis可以自动选择不同数据库sqlmap配置文件。
2、打开ibatis源码工程并进行代码跟踪,最终定位到com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser.java处,系统中运行的sqlmap节点均从这里统一转化加载的。
3、很明显SqlMapConfigParser源码中的addSqlMapNodelets负责解析“/sqlMapConfig/sqlMap”路径,即也就是sqlmap文件路径。
4、要实现“多数据库兼容”,这里改造下这个方法即可。
解决方法:
1、首选我们在节点新增一个“DBProductName”用于判断数据库种类。当然通过java.sql.DatabaseMetaData也可以获得,但这太依赖于jdbc驱动,还是手动配置保险。
2、重构SqlMapConfigParser的addSqlMapNodelets方法。
" 1)首选获得单个sqlmap文件的位置,如 sqlmap主目录\XXX.xml;
2)依据上面设置的DBProductName属性值获得数据库类型;
3)将sqlmap的文件路径重定位到运行数据库类型文件下。如 sqlmap主目录\mysql\XXX.xml,代表程序当前运行于msql数据库上,并加载系统mysql数据库对应的 sqlmap文件"
4、ok,现在ibatis支持“多数据库兼容”了(完整源码见附件)。
使用方法:
1、编译SqlMapConfigParser.java生成可运行文件SqlMapConfigParser.class(见附件),并将其覆盖添加到ibatis.jar中。
2、在系统sqlmap配置文件存放主目录如src\conf\mapping添加多数据库兼容支持的子目录,如src\conf\mapping\mysql,src\conf\mapping\oracle等
3、以实际项目需要编写多数据库sqlmap配置文件。注意:不同数据库类型需要确保具有相同的sqlmap配置文件名和sql节点名
4、在ibatis主配置文件(如sql-map-config.xml)中,指定当前程序运行数据库类型
1、Ibatis是MyBatis的前身,它是一个开源的持久层框架。它的核心是SqlMap——将实体Bean跟关系数据库进行映射,将业务代码和SQL语句的书写进行分开。
2、Ibatis是“半自动化”的ORM持久层框架。这里的“半自动化”是相对Hibernate等提供了全面的数据库封装机制的“全自动化”ORM实现而言的,“全自动”ORM实现了POJO与数据库表字段之间的映射并且实现了SQL的自动生成和执行。
3、而Ibatis的着力点,则在于POJO与SQL之间的映射关系,即Ibatis并不会为程序员在运行期自动生成并执行SQL,具体的SQL语句需要程序员编写,然后通过映射配置文件将SQL语句所需的参数和返回的结果字段映射到指定POJO中。
4、StudentDao.java文件中的代码:
package com.ghj.dao.impimport java.io.IOExceptionimport java.io.Readerimport java.sql.SQLExceptionimport java.util.HashMapimport java.util.Listimport java.util.Mapimport com.ghj.dao.IStudentDaoimport com.ghj.vo.Studentimport com.ibatis.common.resources.Resourcesimport com.ibatis.sqlmap.client.SqlMapClientimport com.ibatis.sqlmap.client.SqlMapClientBuilder/** * 学生管理数据访问层接口实现类 * * @author 高焕杰 */public class StudentDao implements IStudentDao {private SqlMapClient sqlMapClientpublic StudentDao() {String resource = "config/sqlMapConfig.xml"try {Reader reader = Resources.getResourceAsReader(resource)//读取配置文件sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader)} catch (IOException e) {e.printStackTrace()}}/** * 添加学生信息 * * @author 高焕杰 */@Overridepublic boolean add(Student student) throws SQLException{return sqlMapClient.update("add", student) > 0}/** * 依据用户名删除学生信息 * * @author 高焕杰 */@Overridepublic boolean deleteByUserName(String userName) throws SQLException{return sqlMapClient.delete("deleteByUserName", userName) > 0}/** * 依据用户名更新密码 * * @author 高焕杰 */@Overridepublic boolean updatePasswordByUserName(String userName, String password) throws SQLException{Map<String, Object> params = new HashMap<String, Object>()params.put("userName", userName)params.put("password", password)return sqlMapClient.update("updatePasswordByUserName", params) > 0}/** * 根据学生用户名查询学生信息 * * @author 高焕杰 */@Overridepublic Student findByUserName(String userName) throws SQLException{return (Student)sqlMapClient.queryForObject("findByUserName", userName)}/** * 查询所有学生信息 * * @author 高焕杰 */@Override@SuppressWarnings("unchecked")public List<Student> findAll() throws SQLException{return sqlMapClient.queryForList("findAll")}}student.xml文件中的代码:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "
!-- 为Student类设置一个别名 --><typeAlias alias="student" type="com.ghj.vo.Student"/><!-- 配置表和实体Bean之间的映射关系 --><resultMap id="studentMap" class="com.ghj.vo.Student"><result property="id" column="id"/><result property="userName" column="user_name"/><result property="password" column="password"/><result property="state" column="state"/></resultMap><!-- 添加学生信息 --><insert id="add" parameterClass="student">insert into student values(#id#, #userName#, #password#, #state#)</insert><!-- 依据用户名删除学生信息 --><delete id="deleteByUserName" parameterClass="java.lang.String"> delete from student where user_name=#userName# </delete><!-- 依据用户名更新密码 --><update id="updatePasswordByUserName" parameterClass="java.util.HashMap"> update student set password=#password# where user_name=#userName# </update><!-- 根据学生用户名查询学生信息 --><select id="findByUserName" parameterClass="string" resultMap="studentMap">select * from student where user_name=#userName#</select><!-- 查询所有学生信息 --><select id="findAll" resultMap="studentMap">select * from student</select></sqlMap>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)