batis学习总结
昨天用了一天的时间初步简单的学习了一下ibatis框架。由于这个框架比较小,所以学习的速度比较快,学了这一天,基本上就可以用到项目开发过程中了。
一、是什么
iBATIS一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2001年发起的开放源代码项目。最初侧重于密码软件的开发,现在是一个基于Java的持久层框架。
它的核心思想是将sql语句与项目代码分离,使得sql语句的灵活性大大加强。
参考的资料:《ibatis in action》《sql map》、ibatis官网
Ibatis框架:
1、只有一个jar:ibatis.jar
2、需要两个配置文件:sqlMapConfig.xml和sqlMap.xml
其中sqlMapConfig.xml文件一般名字不改,而且只有一个,主要是配置数据源,类似于hibernate中的hibernateConfig.xml文件。
sqlmap.xml文件的文件名并不是固定的,可以由用户自定义,也不是必须唯一的,可以是多个,类似于hibernate中的hbm.xml文件,且需要将其配置到sqlMapConfig.xml中。
二、与hibernate简单比较
网上经常看到Hibernate和ibatis作比较,我也只是大概了解了一点。很多人说到ibatis的性能好一些。究竟性能高体现到哪里的具体的测试我并没有做过, 但是可以从理论上得到:
1、ibatis支持批处理,也就是ibatis支持批量更新数据,而hibernate是不支持的,理论上ibatis在这一点上的性能大大高于hibernate。
2、ibatis要程序员自己手写sql语句,而hibernate是hibernate框架生成sql,那么系统一个是直接执行sql,一个是要先经过hibernate N层复杂的框架,理论上,ibatis的性能要高。
然而ibatis框架确实很小,功能尚缺,与hibernate相比,hibernate可以从实体类直接生成数据库,也可以从数据库直接生成映射实体 类,开发过程更加完善统一。而ibatis则需要必须首先建立数据库。并且ibatis现在支持的数据库较少。
Hibernate的映射机制是实体类对应数据库表,采用注解或者配置文件来映射,相当于一对一直接映射。而ibatis的映射机制是在sqlmap.xml文件中的sql语句中实现映射。如下图:
Hibernate的映射:
Ibatis映射:
三、示例
下面的示例中讲解了大部分ibatis中的内容,当然也不全面,比如rowhandler部分、动态sql、事务管理等就没有写到这个示例中:
步骤:
1、建立数据库
2、新建java project
3、引入相关jar:ibatis.jar和数据库驱动jar
4、编写配置文件sqlMapConfig.xml
5、编写sqlMap.xml
6、编写测试代码
代码:
1、entity class:
- public class Account {
- private int userid;
- private String username;
- private String password;
- private String groupname;
- public int getUserid() {
- return userid;
- }
- public void setUserid(int userid) {
- this.userid = userid;
- }
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public String getGroupname() {
- return groupname;
- }
- public void setGroupname(String groupname) {
- this.groupname = groupname;
- }
- }
2、sqlMapConfig :
- <?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="sqlmap.properties"/>
- <transactionManager type="JDBC">
- <dataSource type="SIMPLE">
- <property value="com.mysql.jdbc.Driver" name="JDBC.Driver"/>
- <property value="mysql://localhost/demo1" name="JDBC.ConnectionURL"/>
- <property value="root" name="JDBC.Username"/>
- <property value="root" name="JDBC.Password"/>
- </dataSource>
- </transactionManager>
- <sqlMap resource="userAccount.xml"/>
- </sqlMapConfig>
3、sqlMap.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>
- <select id="getAllUsers" resultClass="com.air.Account">
- SELECT * FROM USER_ACCOUNT order by USERID
- </select>
- <!-- 无映射 -->
- <select id="getAllUsers1" resultClass="com.air.Account"
- parameterClass="string">
- SELECT * FROM USER_ACCOUNT WHERE GROUPNAME=#groupName#
- </select>
- <!-- 内联映射->实体类 -->
- <select id="getAllUsers2" resultClass="com.air.Account"
- parameterClass="string">
- SELECT USERID as userid, USERNAME as username, PASSWORD as
- password, GROUPNAME as groupname FROM USER_ACCOUNT WHERE
- GROUPNAME=#groupName#
- </select>
- <!-- 内联映射->MAP类 -->
- <select id="getAllUsers3" resultClass="hashmap"
- parameterClass="string">
- SELECT * FROM USER_ACCOUNT WHERE GROUPNAME=#groupName#
- </select>
- <!-- 显示映射->实体类 -->
- <resultMap id="accoutResult" class="com.air.Account">
- <result property="userid" column="USERID" />
- <result property="username" column="USERNAME" />
- <result property="password" column="PASSWORD" />
- <result property="groupname" column="GROUPNAME" />
- </resultMap>
- <select id="getAllUsers4" resultMap="accoutResult"
- parameterClass="string">
- SELECT * FROM USER_ACCOUNT WHERE GROUPNAME=#groupName#
- </select>
- <!-- 显示映射->MAP类 -->
- <resultMap id="mapResult" class="hashmap">
- <result property="userid" column="USERID" />
- <result property="username" column="USERNAME" />
- <result property="password" column="PASSWORD" />
- <result property="groupname" column="GROUPNAME" />
- </resultMap>
- <select id="getAllUsers5" resultMap="mapResult"
- parameterClass="string">
- SELECT * FROM USER_ACCOUNT WHERE GROUPNAME=#groupName#
- </select>
- <!-- XML -->
- <select id="selectXML" parameterClass="string" resultClass="xml"
- xmlResultName="log">
- SELECT * FROM USER_ACCOUNT WHERE GROUPNAME=#groupName#
- </select>
- <select id="getOneUser" resultClass="com.air.Account"
- parameterClass="string">
- SELECT * FROM USER_ACCOUNT WHERE GROUPNAME=#groupName#
- </select>
- <!-- 自动参数映射 -->
- <insert id="insertOneUser1" parameterClass="com.air.Account">
- INSERT INTO USER_ACCOUNT
- (
- USERNAME, PASSWORD, GROUPNAME
- )VALUES(
- #username#,#password#,#groupname#
- )
- </insert>
- <!-- 内联参数映射 -->
- <insert id="insertOneUser2" parameterClass="com.air.Account">
- INSERT INTO USER_ACCOUNT
- (
- USERNAME, PASSWORD, GROUPNAME
- )VALUES(
- #username:VARCHAR#,
- #password:VARCHAR#,
- #groupname:VARCHAR#
- )
- </insert>
- <!-- 外联参数映射 -->
- <parameterMap id="parameterMapEx" class="com.air.Account">
- <parameter property="username" jdbcType="VARCHAR"/>
- <parameter property="password" jdbcType="VARCHAR"/>
- <parameter property="groupname" jdbcType="VARCHAR"/>
- </parameterMap>
- <insert id="insertOneUser3" parameterMap="parameterMapEx">
- INSERT INTO USER_ACCOUNT
- (
- USERNAME, PASSWORD, GROUPNAME
- )VALUES(
- ?,?,?
- )
- </insert>
- <!-- 自动生成的键 -->
- <insert id="insertOneUser4" parameterClass="com.air.Account">
- INSERT INTO USER_ACCOUNT
- (
- USERID,USERNAME, PASSWORD, GROUPNAME
- )VALUES(
- #userid#,
- #username#,
- #password#,
- #groupname#
- )
- <selectKey
- keyProperty="userid"
- resultClass="int">
- SELECT LAST_INSERT_ID()
- </selectKey>
- </insert>
- <!-- 存储过程 -->
- <parameterMap id="pro" class="java.util.Map">
- <parameter property="name" jdbcType="VARCHAR"
- javaType="string" mode="IN"/>
- </parameterMap>
- <procedure id="pro_insert" parameterMap="pro">
- {call new_proc(?)}
- </procedure>
- </sqlMap>
4、test class
- public class Demo1 {
- /**
- * @param args
- * @throws SQLException
- */
- @SuppressWarnings({ "unchecked", "unchecked" })
- public static void main(String[] args) throws SQLException {
- // TODO Auto-generated method stub
- String resource = "./SqlMapConfig.xml";
- Reader reader;
- try {
- reader = Resources.getResourceAsReader(resource);
- SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
- //List list = sqlMap.queryForList("selectXML", "NBA");
- // for (int i = 0; i < list.size(); i++) {
- // Account cc = (Account) list.get(i);
- // System.out.println(cc.getUserid() + " " + cc.getUsername()
- // + " " + cc.getPassword() + " " + cc.getGroupname());
- // }
- // for (int i=0;i<list.size();i++){
- // Map m=(Map)list.get(i);
- // System.out.print((String)m.get("userid").toString()+" ");
- // System.out.print((String)m.get("username")+" ");
- // System.out.print((String)m.get("password")+" ");
- // System.out.print((String)m.get("groupname")+" ");
- // System.out.println();
- // }
- // for (int i = 0; i < list.size(); i++) {
- // String s = (String) list.get(i);
- // System.out.println(s);
- // }
- // Account ac=(Account)sqlMap.queryForObject("getOneUser","IBM");
- // System.out.println(ac.getUserid());
- //selectkey
- // Account iac=new Account();
- // iac.setUsername("ALEXhhhh");
- // iac.setPassword("DALIAN");
- // iac.setGroupname("MS");
- //
- // Integer returnValue=(Integer)sqlMap.insert("insertOneUser4",iac);
- //
- // System.out.println(returnValue.intValue());
- // //显示插入后的结果
- // @SuppressWarnings("unchecked")
- // List list = sqlMap.queryForList("getAllUsers1","MS");
- //
- // for (int i = 0; i < list.size(); i++) {
- // Account cc = (Account) list.get(i);
- // System.out.println(cc.getUserid() + " " + cc.getUsername()
- // + " " + cc.getPassword() + " " + cc.getGroupname());
- // }
- //调用存储过程
- // @SuppressWarnings("unchecked")
- // Map m=new HashMap(1);
- //
- // m.put("name", new String("LISI"));
- // sqlMap.update("pro_insert",m);
- // //Integer i=(Integer)sqlMap.queryForObject("pro_insert",m);
- //
- // System.out.println("call procedure ok!");
- //批处理
- // Account c1=new Account();
- // c1.setUsername("ZHOUQI");
- // c1.setPassword("QINGDAO");
- // c1.setGroupname("CN");
- //
- // Account c2=new Account();
- // c2.setUsername("WANGWU");
- // c2.setPassword("NANJING");
- // c2.setGroupname("CN");
- //
- // sqlMap.startBatch();
- //
- // sqlMap.insert("insertOneUser3",c1);
- // sqlMap.insert("insertOneUser3",c2);
- //
- // sqlMap.executeBatch();
- //显示插入后的结果
- // @SuppressWarnings("unchecked")
- // List ls = sqlMap.queryForList("getAllUsers1","CN");
- //
- // for (int i = 0; i < ls.size(); i++) {
- // Account cc = (Account) ls.get(i);
- // System.out.println(cc.getUserid() + " " + cc.getUsername()
- // + " " + cc.getPassword() + " " + cc.getGroupname());
- // }
- //RowHandle生产XML
- // XmlRowHandler rh=new XmlRowHandler();
- // sqlMap.queryWithRowHandler("getAllUsers1", "CN", rh);
- // String xmlDoc=rh.getXmlDocument();
- //
- // System.out.println(xmlDoc);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }