对ibatis的一点理解

    技术2022-05-20  55

    ibatis简单开发程序

    1、首先在数据库test内创建一个表,表名:t_user,有3个字段,id(这个是主键设置为自动增量),user,date,并向表中插入2行数据

    如果是mysql,执行

    drop table if exists 't_user';

    CREATE TABLE 't_user' (   

     'id'  int(12) NOT NULL auto_increment, 'name' varchar(50default NULL, 'date' date default NULL,   

    PRIMARY KEY  ('id') ) ENGINE=InnoDB DEFAULT CHARSET=GBK;   

    Insertinto  't_user'(name,date) values('ok','2007-03-15'),('ok2','2007-05-15');  

     

    如果是sql,执行脚本

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[t_user]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)drop table [dbo].[t_user]GO

    CREATE TABLE [dbo].[t_user] ( [id] [int] IDENTITY (1, 1) NOT NULL , [name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL , [date] [datetime] NULL ) ON [PRIMARY]GO

     

    2、创建完数据表后,就创建一个SqlMapConfig.xml配置文件(这个名字不能改,因为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><!-- cacheModelsEnabled:是否启动SqlMapClient的缓存机制enhancementEnabled:是否针对POJO启用字节码增加机制以提升getER/setER的调用效用,为延迟加载带来了及大的性能提升lazyLoadingEnabled:是否启用延迟加载机制。    maxRequests:最大并大请求数。     maxSessions:最大Session数,即当前最大允许的开发SqlMapClient数    maxTransactions:最大并发事务数-->     <settings cacheModelsEnabled="true"     enhancementEnabled="true"      lazyLoadingEnabled="true"     maxRequests="32"    maxSessions="10"    maxTransactions="5"     useStatementNamespaces="true" />       <transactionManager type="JDBC">           <dataSource type="SIMPLE">        <!--JDBC驱动-->             <property name="JDBC.Driver" value="sun.jdbc.odbc.JdbcOdbcDriver" />               <property name="JDBC.ConnectionURL" value="jdbc:odbc:ok" />               <property name="JDBC.Username" value="数据库用户" />               <property name="JDBC.Password" value="数据库密码" />           </dataSource>       </transactionManager>        <!--加载SqlMap文件-->       <sqlMap resource="com/study/xiaofeng/maps/User.xml" />   </sqlMapConfig>

     

     

    备注:我使用的是JDBC驱动的odbc的数据源连接,连接的是SQLServer,个人的理解就是sql server提供ODBC接口,jdbc调用ODBC提供的jdbc接口调用,sql server->sqlserver odbc接口->odbc jdbc接口->jdbc,使用JDBC连接数据库步骤为

    (1)、装载并注册数据库的jdbc驱动程序

    class.forname("JDBC驱动")

    下面列出几种数据库的JDBC驱动,其他的请大家在网上找下

          (1)SQL :

          class.forname("com.microsoft.jdbc.sqlserverdriver")

          (2)mysql

          class.forname("com.mysql.jdbc.driver")

          (3)数据源连接方式

          class.forname("sun.jdbc.odbc.jdbcOdbcDriver")

     

    (2)、建立数据库的连接

    connection cnn=java.sql.driverManager.getConnection(JDBC数据源,数据库用户名,数据库密码)

    下面列出几种数据库的JDBC数据源

    格式:jdbc:驱动程序:驱动子项

     

          (1)SQL(microsoft:sqlserver这里算是一个整体)

          jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=数据库

          (2)Mysql

          jdbc:mysql://localhost:3306/数据库名

     

     

          (3)数据源连接方式

     

     

          jdbc:odbc:数据源名

     

    ibatis里代码看不到驱动初始化的forname这些方法,原因是SqlMapClient这个对象创建时,根据传递过来的数据库参数自动进行数据库驱动的装载以及连接

     

    3、再创建一个数据表t_user的映射类User.java(不是一定要取名:表名.java,只是为了方便记而已,文件user.xml里<typeAlias alias="UserObject" type="com.study.xiaofeng.User" />,只要保持映射类名跟这里的type一致就行 )

     

    package com.study.xiaofeng;

    import java.io.Serializable;   import java.util.Date;     public class User implements Serializable{       private int id;       private String name;       private Date date;       public Date getDate() {           return date;       }       public void setDate(Date date) {           this.date = date;       }       public int getId() {           return id;       }       public void setId(int id) {           this.id = id;       }       public String getName() {           return name;       }       public void setName(String name) {           this.name = name;       }   } 

    4、创建一个包括所有需要进行SQL执行的xml文件,User.xml(这里的文件名也不是一定要取名:表名.xml,例如user2.xml也可以,只要文件名跟SqlMapConfig.xml中<sqlMap resource="com/study/xiaofeng/maps/User2xml" /> 这里的名字一致就行

     

    <?xml version="1.0" encoding="UTF-8"?>   <!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"  "http://www.ibatis.com/dtd/sql-map-2.dtd">     <sqlMap namespace="User">       <typeAlias alias="UserObject" type="com.study.xiaofeng.User" />       <resultMap id="userResult" class="UserObject">           <result property="id" column="id" jdbcType="NUMBER" />           <result property="name" column="name" jdbcType="VARCHAR2" />           <result property="date" column="date" jdbcType="DATE" />       </resultMap>         <select id="getByPK" resultMap="userResult" parameterClass="UserObject">           <![CDATA[            select             id,             name,              date            from t_user            where id = #id#            ]]>       </select>              <select id="getById" resultMap="userResult" parameterClass="java.lang.String">           <![CDATA[            select             id,             name,              date            from t_user            where id = $String$           ]]>       </select>         <sql id="Dy_SC">           <dynamic prepend="WHERE">               <isNotNull prepend="AND" property="id">id like #id#</isNotNull>               <isNotNull prepend="AND" property="name">name like #name#</isNotNull>           </dynamic>       </sql>         <select id="getUser" resultMap="userResult">           <![CDATA[            select             id,             name,              date            from t_user            ]]>           <include refid="Dy_SC" />       </select>         <insert id="insertUser" parameterClass="UserObject">           INSERT INTO t_user (name,date) VALUES (#name#,#date#)       </insert>              <insert id="insertUserTest" parameterClass="UserObject">           INSERT INTO t_user (id,name,date) VALUES (#id#,#name#,#date#)       </insert>         <update id="updateUser" parameterClass="UserObject">           <![CDATA[            UPDATE t_user            SET               name=#name#,              date=#date#            WHERE id = #id#           ]]>       </update>         <delete id="deleteUser" parameterClass="java.lang.String">           delete from t_user where id=#value#       </delete>         <statement id="getMaxId" resultClass="java.lang.Integer">           select Max(id) from t_user       </statement>         <statement id="getMax" resultClass="java.util.HashMap">           select Max(id) as id,Max(name) as name,Max(date) as date from t_user       </statement>     </sqlMap> 

    5、到现在再理清下思路,我们创建了数据表t_user,数据表的映射类User.class,数据表操作类user.xml,配置文件SqlMapConfig.xml

    ibatis架构就完成了

     

    整个工程只需要引入ibatis-2.3.0.667.jar一个库,当使用ibatis,首先读取SqlMapConfig.xml文件,根据这个配置文件创建一个SqlMapClient对象,引用的是com.ibatis.sqlmap.client.SqlMapClient,这个对象读取SqlMapConfig.xml配置,装载以及连接数据库,连接成功后,并指向user.xml,将user.xml内的设置读取到SqlMapClient对象内

    当使用SqlMapClient进行操作时,这个对象也有数据库的insert以及update等操作,比如SqlMapClient.queryForList(调用的操作,传递的对象)sqlMap.queryForList("User.getUser", params)其中后面的params是将数据封装成对象,User.getUser的User是命名空间名,然后找getUser,找到后执行里面的select语句,返回记录集userResult,

     

    <select id="getUser" resultMap="userResult">           <![CDATA[            select             id,             name,              date            from t_user            ]]>           <include refid="Dy_SC" />    </select>

     

    然后知道这个记录集名userResult,对应的是com.study.xiaofeng.User,这个记录集的列对应User.java类的属性

    <sqlMap namespace="User">       <typeAlias alias="UserObject" type="com.study.xiaofeng.User" />       <resultMap id="userResult" class="UserObject">           <result property="id" column="id" jdbcType="NUMBER" />           <result property="name" column="name" jdbcType="VARCHAR2" />           <result property="date" column="date" jdbcType="DATE" />       </resultMap>

     

    那么就相当于将select返回的结果数据集保存在User类中,那么只需要对User类进行处理,可以封装成任何自己需要的数据类型,SqlMapClient.Select是封装成一个list并返回它,调用者只需要对list进行读取就可以!


    最新回复(0)