数据访问进化简史,比较简单,不负责能跑起来
- 一、原始的sql
select address from user where name='test'
- 二、jdbc
//若干操作
String sql="select address from user where name='"+name+"'";
//执行
//解析结果
//包括若干个try catch
解决了java到数据库的访问,但是存在大量的复制代码,并且异常需要自己处理
- 三、ibatis2.0代码
<!--大量的XML定义文件--> <select id="queryAddressByName" parameterType="String" resultType="String"> select address from user where name=#{name} </select>
Class UserDao{
//大量的常量定义
final static private String QUERY_ADDRESS_BY_NAME= getClass()+"queryAddressByName";
String queryAddressByName(final String name){
final String address=sqlMapper.selectforObject(QUERY_ADDRESS_BY_NAME, name);
return address;
}
}
主要优势
- sql和java代码分离
- 不需要关注数据库连接和关闭
- 不需要关注数据获取方式
主要不足
- 大量的xml及后续管理问题
- 会看到大量的final static String QUERY_ADDRESS_BY_NAME= getClass()+"queryAddressByName"这样的sqlmapper名字
- 四、Mybatis 3.0
Mybatis 3.0通过引入注解,解决了上述不足
@Select等注解减少XML文件
@repository注解使用接口减少常量定义
- 4.1、@repository
@repository
interface UserMapper{
String queryAddressByName(String name);
}
<select id="queryAddressByName" parameterType="String" resultType="String"> select address from user where name=#{name} </select>
此接口可以通过访问2.0的xml
并且spring的整合直接访问,使用方法名关联,不需要实现类
调用代码
Class UserDao{
@autowired
private userMapper mapper;
String queryAddressByName(final String name){
final String address=mapper.queryAddressByName(name);
return address;
}
}
主要改进:
- 2.0中大量的常量字符串被使用函数名称代替
- 与2.0原有xml资源能平稳过渡
- 4.2、@Select和@Param等
@repository
interface userMapper{
@select("select address from user where name=#{name}")
String queryAddressByName(String name)
}
使用annotation方式下不需要产生xml,调用代码不变
对于同一个mapper接口来说可以混用xml和annotation方式
参数上的annotation
@repository
interface userMapper{
@select("select address from user where name=#{name} and gender=#{gender}"
String queryAddressByName(@param(value="name" String name, @param(value="gender") String gender)
}
参数annotation还可以和xml混搭
@repository
interface userMapper{
String queryAddressByNameAndGender(@param(value="name" String name, @param(value="gender") String gender);
}
<select id="queryAddressByNameAndGender" resultType="String"> select address from user where name=#{name} and gender=#{gender} </select>
主要改进;
- xml被大量减少,管理难度降低
- Ibatis annotation的优势
- 减少xml,减少了java到xml的映射,目前的IDE上java用起来还是要比xml友好
- 通过接口访问而不是类似2.0中字符串指定sqlmapper名,看不到一堆常量String
- 通过在mapper接口参数上的@param可以输入多个参数,减少模糊化的hashmap使用,让接口定义更加精确