zoukankan      html  css  js  c++  java
  • 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());
            }
        }
    }

    五、 ibatis分页

  • 相关阅读:
    dockerfile 详解
    kubectl简介
    关于高级事件的使用
    关于拖拽延伸出来的一些效果
    照片墙的制作过程及其出现的问题
    关于360度全景照片的问题总结
    实战演练-记账本App (五)
    人月神话阅读笔记02
    实战演练-记账本App(四)
    实战演练-记账本App(三)
  • 原文地址:https://www.cnblogs.com/anxiao/p/11602548.html
Copyright © 2011-2022 走看看