`
software_developer
  • 浏览: 34945 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

初学者使用MyBatis中遇到的问题

阅读更多

 问题一:bind标签使用的问题

<select id="findBooks" parameterType="Book" resultType="Book"
      useCache="false">
      <!-- if _parameter.getName() is null,NullPointerException will be throw! -->
      <!-- <bind name="nameParam" value="'%'+_parameter.getName()+'%'"/> <bind 
         name="authorParam" value="'%'+_parameter.getAuthor()+'%'"/> -->
      select * from t_book
      <where> 
         <if test="name != null">
            name like concat(concat('%',#{name}),'%')
         </if>
         <if test="author != null">
            and author like concat(concat('%',#{author}),'%')
         </if>
         <if test="category != null and category.id != null">
            and category = #{category.id}
         </if>
      </where>
</select>

由于要进行模糊查询,所以要对传入过来的值前后添加%

当使用bind进行绑定时,传入的值如果是NULL,就会抛出空指针异常,而且if标签下又没有bind标签,所以遇到传入的值可以为空的情况下,bind则不能使用。

解决办法:

1,使用concat方法,但是不同的数据库使用方式不一样.

Oracle: concat(concat('%',#{name}),'%')

Mysql:  concat('%',#{name},'%')

2,通过java代码中构建好传入到配置文件中

 

问题二:向数据库中插入数据时如果由一个字段没有设置就会抛出异常(UncategorizedSQLException: Error setting null for parameter #4 with JdbcType OTHER . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property.

例如:
<insert id="saveBook" parameterType="Book">
   <selectKey resultType="string" order="BEFORE" keyProperty="id">
	SELECT SYS_GUID() FROM DUAL
   </selectKey>
  insert into t_book(id,name,publishDate,author,price,category,quantity)
  values(#{id},#{name},#{publishDate},#{author},#{price},
#{category,jdbcType=VARCHAR,typeHandler=CategoryTypeHandler},#{quantity})
</insert>
 如果传入的book类型的name属性或其他属性没有设置值就抛出上面的异常。

解决办法:

mybatis-config.xml配置文件中设置jdbcTypeForNull的值为NULL,默认是OTHER

<settings>

      <setting name="jdbcTypeForNull" value="NULL"/>

</settings>

 

问题三:向数据库中插入一个对象时,其关联的对象属性不能直接通过OGNL来进行设置,需要写一个类型转换器.

例如:

Book.java(外键一个图书类型)

public class Book implements Serializable {
	private static final long serialVersionUID = 8634505584095346474L;

	private String id;
	private String name;
	private Date publishDate;
	private String author;
	private Float price;
	private Category category;
	private Long quantity;
	
                getter ,setter方法省略…

}

 

 

Category.java

 

public class Category implements Serializable {
	private static final long serialVersionUID = 8964146416205979692L;

	private String id;
	private String name;
	private String spell;
	private String comments;

	public Category() {
		super();
	}

	public Category(String id) {
		super();
		this.id = id;
	}
	getter ,setter方法省略…
}

 mapper配置文件(BookMapper.xml)中的insert语句(这种配置会报错)

<insert id="saveBook" parameterType="Book">
   <selectKey resultType="string" order="BEFORE" keyProperty="id">
       SELECT SYS_GUID() FROM DUAL
   </selectKey>
   insert into t_book(id, ,name,publishDate,author,price,category,quantity)
    values(#{id},#{name},#{publishDate},#{author},#{price},#{category.id},
    # {quantity})
</insert>

 

 

解决办法(感觉有其它更好的解决办法)

配置如下:

<insert id="saveBook" parameterType="Book">
   <selectKey resultType="string" order="BEFORE" keyProperty="id">
       SELECT SYS_GUID() FROM DUAL
 </selectKey>
   insert into t_book(id, ,name,publishDate,author,price,category,quantity)
  values(#{id},#{name},#{publishDate},#{author},#{price},
 #{category,jdbcType=VARCHAR,typeHandler=CategoryTypeHandler},#{quantity})
</insert>

其中jdbcTypetypeHandler需要指定; CategoryTypeHandler.java是自定义的类型处理器。

CategoryTypeHandler.java代码如下:

public class CategoryTypeHandler extends BaseTypeHandler<Category> {
	@Override
	public void setNonNullParameter(PreparedStatement ps, int i,
			Category parameter, JdbcType jdbcType) throws SQLException {
		if (jdbcType == null) {
		      ps.setString(i, parameter.getId());
		} else {
		      ps.setObject(i, parameter.getId(), jdbcType.TYPE_CODE); // see r3589
		}
	}
	@Override
	public Category getNullableResult(ResultSet rs, String columnName)
			throws SQLException {
		return null;
	}
	@Override
	public Category getNullableResult(ResultSet rs, int columnIndex)
			throws SQLException {
		return null;
	}
	@Override
	public Category getNullableResult(CallableStatement cs, int columnIndex)
			throws SQLException {
		return null;
	}
}

 然后配置在mybatis-config里配置处理器和别名

<typeAliases>
<typeAlias type="com.bookshop.book.typehandler.CategoryTypeHandler" alias="CategoryTypeHandler"/>
</typeAliases>
<typeHandlers>
<typeHandler handler="com.bookshop.book.typehandler.CategoryTypeHandler" />
</typeHandlers>

 

关于问题三特别说明下:上面提到通过OGNL进行设置会出错,在我后面的测试中,通过OGNL又成功了,
所以问题三可能不是一个问题。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    MyBatis-Spring配置教程,非常适合初学者

    【MyBatis-Spring配置教程】是一份专为初学者设计的教程,旨在帮助学习者快速掌握如何在Spring框架中整合并使用MyBatis。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射,而Spring则是一个...

    Mybatis初学者的课件和案例

    Mybatis 是一款流行的Java持久层框架,它简化了数据库操作,让开发者能够更方便地将SQL语句与Java代码相结合。...实践中遇到问题时,可以查阅Mybatis的官方文档或在线社区资源,不断优化和提升自己的技能。

    初学Spring+SpringMVC+MyBatis框架(适合初学者看相对完整些)

    初学者在学习SSM的过程中,可能会遇到的问题包括:配置文件的错误、依赖冲突、SQL执行异常、事务管理不正确等。解决这些问题需要对Java、MVC模式和数据库操作有基本的理解。通过实践和查阅相关文档,可以逐步掌握SSM...

    mybatis所有Dome(适用于初学者)

    MyBatis 是一款深受开发者...通过学习这个资源中的示例,初学者可以逐步掌握MyBatis的基本用法和高级特性,为后续的项目开发打下坚实基础。在实践中,如果遇到任何问题,都可以及时与提供者联系,以便得到帮助和解答。

    mybatis中文api

    1. **动态SQL**:MyBatis允许在映射文件中使用条件语句,使得SQL可以根据传入的参数动态生成,避免了大量的if-else或者switch-case代码。 2. **映射文件和接口绑定**:MyBatis允许将Mapper接口与XML映射文件或注解...

    Mybatis增删改查使用例

    7. **动态SQL(Dynamic SQL)**:Mybatis允许在SQL语句中使用条件判断,如`&lt;if&gt;`、`&lt;choose&gt;`、`&lt;when&gt;`、`&lt;otherwise&gt;`等标签,以实现更灵活的查询逻辑。 在“Mybatis增删改查使用例”中,你可以期待以下内容: -...

    Mybatis3中文文档

    Mybatis3中文文档是针对Java开发人员的重要参考资料,它详细阐述了Mybatis这一流行持久层框架的使用方法和核心概念...无论你是初学者还是经验丰富的开发者,都可以从中获取有价值的信息,提升数据库操作的效率和质量。

    eclipse mybatis generator插件及使用

    Eclipse MyBatis Generator插件是一款强大的自动化代码生成工具,它极大地简化了开发过程中与数据库交互的代码编写工作。...无论你是初学者还是经验丰富的开发者,都应该尝试使用这个工具来提升你的开发体验。

    mybatis-3.0.5_api

    描述中的“这个api可以让不是很熟悉mybatis的朋友,更好的解决问题”强调了API对于初学者或者不熟悉MyBatis的开发者的重要性。API文档通常包含类、接口、方法的详细说明,以及它们的使用示例,帮助开发者快速理解和...

    mybatis初识

    了解以上基本概念后,可以通过实践《第1课 初识MyBatis》上机实践.docx中的例子,进一步熟悉MyBatis的配置、映射文件的编写、以及如何在实际项目中使用MyBatis进行数据操作。通过实际动手,你将更深入地掌握MyBatis...

    MyBatis中文帮助文档

    ### MyBatis中文帮助文档知识点概述 ...无论是初学者还是经验丰富的开发者,都能快速上手并利用其优势进行高效的数据库操作。通过本文档,希望能够帮助开发者更好地理解和使用MyBatis,以满足不同的项目需求。

    myBatis3.2.2(含源码、文档)

    同时,文档的存在意味着有官方或社区编写的使用指南、API参考等,这些对于初学者和经验丰富的开发者都极具参考价值。 描述中提到的“想要设置免费怎么无法设置呢”可能是指用户在尝试将某个功能或服务设为免费,但...

    Eclipse集成mybatis插件

    MyBatis-Eclipse插件是开发者在Eclipse中使用MyBatis时的重要辅助工具,它可以提供诸如自动生成Mapper接口、XML配置文件和实体类等便捷功能,减少手动编写这些代码的时间。集成这个插件后,开发者可以更高效地进行...

    myBatis中文API

    10. **最佳实践与常见问题**:提供一些实际开发中的经验分享,解决可能遇到的问题。 这份MyBatis中文文档将帮助开发者深入理解并熟练运用MyBatis,提升开发效率,减少与数据库交互时的复杂度。无论是初学者还是有...

    MyBatis Plus全套学习资料(带源码和笔记)

    配套的学习笔记通常会包含作者在学习过程中遇到的问题及解决方案,实战案例解析,有助于快速掌握MyBatis Plus的使用技巧和最佳实践。 总之,MyBatis Plus是提升开发效率的利器,这套学习资料能够帮助开发者系统性地...

    mybatis-3.2.2的jar包以及源代码,另外还有mybatis的PDF文档

    这个版本发布于2014年,尽管现在已经有了更新的版本,但3.2.2仍然具有一定的学习价值,特别是对于初学者或者需要研究旧项目的人来说。这个版本包含了MyBatis的核心jar包,使得开发者可以在项目中引用并使用MyBatis的...

    MyBatis3入门到精通教程

    MyBatis的动态SQL功能非常强大,允许在XML映射文件中使用if、choose、when、otherwise、where、trim、foreach等标签编写条件语句,极大地提高了SQL的灵活性。 7. **缓存机制** MyBatis内置了两级缓存,一级缓存在...

    mybatis-3.4.4

    对于初学者,了解MyBatis的基本配置、Mapper接口的创建、XML映射文件的编写、以及如何进行CRUD操作是非常重要的。同时,掌握MyBatis的动态SQL和插件扩展能力可以帮助提高开发效率和代码质量。对于有经验的开发者,源...

    mybatis3.4.3中文版.zip

    在这个压缩包文件中,包含的是MyBatis的3.4.3版本的中文文档,对于初学者或需要中文参考的开发者来说非常有帮助。 MyBatis的主要功能包括: 1. **动态SQL**:MyBatis允许在映射文件中编写复杂的SQL语句,甚至可以...

Global site tag (gtag.js) - Google Analytics