首页 > 代码库 > batis的一些细节问题(传参数方面)
batis的一些细节问题(传参数方面)
一、相关配置
三个配置文件(前两个文件的名称是任意起的)
1)环境配置文件conf.xml
在环境配置文件中有<typeAliases>标签,该标签内部可以定义<package>标签来统一定义mapping.xml文件所在的包,这样在mapping.xml文件中即可仅定义
2)映射文件mapping.xml
3)日志配置文件log4j.xml
二、util工具类,获取静态SessionFactory
public static SqlSessionFactory getSqlSessionFactory() throws IOException{
Reader r = Resources.getResourceAsReader("conf.xml");
return new SqlSessionFactoryBuilder().build(r);
}
Mybatis提供的Resources类上获取配置文件信息的方法有很多 此处使用类上的静态方法getResourceAsReader来获取配置文件的属性(作为一个字符输入流读入内存
三、实现映射
1、纯XML文件
1)数据库连接信息配置在conf.xml文件中
2)对象与表之间的映射配置在mapper.xml文件中
3)配置完成,获取SessionFactory,启动session执行对数据库的操作
2、接口+XML文件
接口与XML文件相关联需要遵守Mybatis的约定:
①mapper.xml文件中的namepace要写为接口的全名
②定义的操作(insert/delete/update/select)标签的id(即定义的sql语句的名称)要和接口中的方法名相同
③根据约定配置后,Mybatis将自动实现接口来进行数据库操作
3、接口+注解
接口与上面相同
相应的注解:@Select("") @Update("") @Insert("") @Delete("")
注解中的字符串为sql语句,具体写法与XML文件中配置相同
四、传参
1)常规传参方式
创建一个JavaBean,对象属性为要传的参数
映射文件中SQL语句的paramType属性为该JavaBean,语句中属性为#{属性名}
2)其他方式
方法:mthod(参数1,参数2,参数3·········)
①将方法中的参数放在一个Map集合中,方法的参数改为这个Map集合
在映射文件的SQL语句中参数获取使用#{key}来获取
②将方法中的参数索引作为参照(索引从0开始计数)
方法中:参数1,参数2,参数3······
映射中:#{0} ,#{1} ,#{2}
③使用Mybatis给我们提供的注解@Param
在接口中的方法定义时,参数前加入@Param注解 注解内容为映射文件中属性的名称
@Param("参数1")在映射文件中调用时#{参数1}
五、表中字段名称和实体类JavaBean中对象的属性名称不一致时
1)插入数据时 影响不大,在SQL语句定义中传值时将占位符的参数设置为对象属性名即可
2)查询数据时
方法1、通过SQL查询语句中设置字段名别名为对象属性名即可
方法2(麻烦)、将resultType设置为map,返回数据存在map中 map的键为字段名值为字段数据,然后将map数据存为对应的对象属性
方法3(重要)、通过定义标签resultMap,使用其中的id/result等标签来定义对象属性和数据库表字段名的映射,然后在查询语句定义标签中原来的resultType改为resultMap,值为定义好的resultMap标签的id,即可将数据库中的字段和对象中的属性建立映射关系。
六、配置文件中的占位符
#{} 与 ${} 的区别?
#{}生成的SQL语句有占位符 ? ,数据来自实体类对象的属性
${}生成的SQL语句没有占位符?,数据优先来自属性文件db.properties
${}可能涉及sql注入,会有危险,但是当需要传的参数为表名时,因为#{}传入的是占位符,自带有字符串符号‘‘ 所以会报错,这时必须使用${}进行sql注入
同时,如果需要从属性文件***.properties读取信息时,需要使用${}
关于两者区别与联系参考
http://blog.csdn.net/pfnie/article/details/53230994
batis的一些细节问题(传参数方面)