ibatis学习
一、简介
iBatis是一款简单的数据访问工具,也可作为数据持久层的框架。对比于Hibernate虽然在对象属性的扩展上修改麻烦,但是对SQL的集中管理和主动权。 iBatis的最大优点是简便,轻量级,仅需iBatis的一个jar和数据库的驱动即可运行,而且使用iBatis仅需掌握SQL和XML的用法即可,而不像Hibernate那样需要配置对象间的关系。而且iBatis比Hibernate易学。 iBatis和Hibernate目的都是解决是JDBC程序开发的繁琐性和代码的冗余性(如加载驱动,建立连接等重复且无技术含量的过程)。
二、ibatis 应用
iBatis的配置关系图:
1. 导入 ibatis-2.3.4.726.jar
2. 数据库配置 jdbc.properties文件
jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=utf8 jdbc.username=root jdbc.password=123
3. iBatis的配置文件 SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd"> <sqlMapConfig> <properties resource="jdbc.properties" /> <transactionManager type="JDBC"> <dataSource type="SIMPLE"> <property name="JDBC.Driver" value="${jdbc.driverClassName}" /> <property name="JDBC.ConnectionURL" value="${jdbc.url}" /> <property name="JDBC.Username" value="${jdbc.username}" /> <property name="JDBC.Password" value="${jdbc.password}" /> </dataSource> </transactionManager> <sqlMap resource="ibatis/resources/User.xml" /> </sqlMapConfig>
4. iBatis 映射文件 User.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd"> <sqlMap> <typeAlias alias="User" type="ibatis.model.User" /> <select id="getAllUsers" resultClass="User"> select * from users </select> </sqlMap>
5. 应用程序
public class IBatisDemo { public static void main(String[] args) throws IOException, SQLException { String config = "ibatis/SqlMapConfig.xml"; Reader reader = Resources.getResourceAsReader(config); SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader); List<User> list = sqlMap.queryForList("getAllUsers"); for (User user : list) { System.out.println(user); } } }
三、ibatis 增删改查
a. 为了简化我们SQL输入参数的配置,我们写一个类来专门负责处理输入参数,把它们封装成一个Map类型,代码如下:
public class ParameterMap extends HashMap<Object, Object> { private static final long serialVersionUID = 1L; public ParameterMap(Object... parameters) { for (int i = 0; i < parameters.length - 1; i += 2) { super.put(parameters[i], parameters[i + 1]); } } }
b. 在映射文件User.xml 中声明且使用这个类型:
<typeAlias alias="User" type="ibatis.model.User" /> <select id="getUserByName" parameterClass="java.lang.String" resultClass="User"> select * from users where USERNAME=#VARCHAR# </select> <select id="getUserByRealNameAndMobile" parameterClass="parameterMap" resultClass="java.util.HashMap"> select * from users where REALNAME=#realName:VARCHAR# and MOBILE=#mobile:VARCHAR# </select> <insert id="addUser" parameterClass="parameterMap"> insert into users(USERNAME,PASSWORD,REALNAME,MOBILE,EMAIL) values(#userName:VARCHAR#,#password:VARCHAR#,#realName:VARCHAR#,#mobile:VARCHAR#,#email:VARCHAR#) </insert> <update id="updateUser"> update users set PASSWORD='123456' </update> <delete id="deleteUser" parameterClass="java.lang.Integer"> delete from users where ID=#INT# </delete>
c. 应用程序:
User user = sqlMap.queryForObject("getUserByName", userName); ParameterMap parameterMap = new ParameterMap("realName", "sarin","mobile", "15940990000"); HashMap result = sqlMap.queryForObject("getUserByRealNameAndMobile", parameterMap); ParameterMap parameterMap = new ParameterMap("userName", "sarin", "password", "123", "realName", "sarin", "mobile", "1","email","@"); sqlMap.update("addUser", parameterMap); sqlMap.update("updateUser"); sqlMap.delete("deleteUser", userId);
select 中的<sql>和<include>
<sql id="select-user"> select * from users </sql> <sql id="select-count"> select count(*) as value from users </sql> <sql id="where-age-over-value"> <![CDATA[ where age > #value:INT# ]]> </sql> <select id="getUserAgeOver" resultClass="hashmap"> <include refid="select-user" /> <include refid="where-age-over-value" /> </select> <select id="getUserCountAgeOver" resultClass="int"> <include refid="select-count" /> <include refid="where-age-over-value" /> </select>
四、 spring整合ibatis
1. sqlMapConfig.xml, user.xml和jdbc.properties同上, applicationContext.xml如下:
<context:component-scan base-package="com.ibatis.model"/> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:jdbc.properties</value> </list> </property> </bean> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </bean> <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="configLocation" value="classpath:sqlMapConfig.xml"/> <property name="dataSource" ref="dataSource"/> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
应用程序:
@Component public class UserDaoImpl extends SqlMapClientDaoSupport implements UserDao { @Resource(name = "sqlMapClient") private SqlMapClient sqlMapClient; @PostConstruct public void initSqlMapClient(){ super.setSqlMapClient(sqlMapClient); } @Override public List<User> getAllUsers() { return getSqlMapClientTemplate().queryForList("getAllUsers"); } } @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(value="classpath:applicationContext.xml") public class AttendDAOTest { @Resource private UserDaoImpl userDaoImpl; @Test public void selectTest() { List<User> users = userDaoImpl.getAllUsers(); for(int i = 0; i<users.size();i++) { System.out.println(users.get(i).getUsername()); } } }