实例表现ibatis的基础用法(不断更新)



1.ibatis基础理论知识

半自动化java持久层框架,开源免费,核心还是JDBC,只是将其封装,减少了重复代码的书写(据某个闲的够呛的外国人统计,减少了62%的代码),在编码上更符合面向对象原理。

                   -----------

                            |——什么是持久层: ----先说持久:持久就是把数据保存到可掉电式存储设备中以备后续使用。(从内存保存到磁盘,加以固化) --通过关系型数据库来完成。

                                 ----持久层:在系统逻辑层面上,专注于实现数据持久化的一个相对独立的领域。“层”表示了应该有一个相对独立的逻辑层面,而不是“模块/  单元”,应该有一个较为清晰和严格的逻辑边界。

————

         |______什么是半自动化: 因为ibatis还要程序员自己编写访问数据库的sql语句。 ------{提高了可控性,但是当数据库设计改变时,ibatis配置文件中的sql也要随之更改。}                     



2.ibatis的特点

优点:

1) 简单,配置文件只有两个jar包:     一个是ibatis本身的jar包,一个是连接数据库的jar包

2)关注点分离: 使用ibatis,使用与对象打交道,不会有零散的结果集

3)可移植: 可移植,可以在java,ruby,#c平台上使用

缺点:

1)只能在关系型数据库上使用

2)sql需要程序员编写。如果数据库设计改变,需要改ibatis的配置文件,有点麻烦。


3.实例讲解ibatis

首先配置ibatis的jar包(两个,我使用的是ibatis-2.3.4.726.jar和mysql-connector-java-5.0.4-bin.jar)

工程文件如图:

java文件 :

User: POJO,是持久层对象,也是ibatis直接操作的对象

UserDAO :把参数(User)传到给User.xml上 。


配置文件包括

JDBC连接的属性文件:sqlMap.properties.

ibatis总配置文件sqlMapConfig.xml

每个实体的映射文件,这里是User类的映射文件。 User.xml    在这里由程序员手动编写sql语句


sqlMap.properties 中定义了数据库的连接:

资源文件即key 和value的键值对

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/tt
username=root
password=

总配置文件: 注意--我在总配置文件中直接加入了JDBC数据源,并没有用到工程中的sqlMap.properties。

<?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>
  <!-- 定义了ibatis的事务管理器有3中(JDBC,JTA,EXTERNAL) -->
  <transactionManager type="JDBC" commitRequired="false">
    <!--type属性指定了数据源的链接类型,也有3种类型(SIMPLE,DBCP,JNDI)--> 
    <dataSource type="SIMPLE">
      <property name="JDBC.Driver" value="com.mysql.jdbc.Driver"/>
      <property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost:3306/tt"/>
      <property name="JDBC.Username" value="root"/>
      <property name="JDBC.Password" value=""/>
    </dataSource>
  </transactionManager>

  <!--配置映射文件-->
  <sqlMap resource="com/tt/User.xml"/>
</sqlMapConfig>


解释:

关于ibatis的事务管理器和数据源 :http://blog.csdn.net/not_a_baby/article/details/6756943、


如果引用sqlMap.properties,即以下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
      <properties resource="com/tt/sqlMap.properties" />
      <transactionManager type="JDBC">
            <dataSource type="SIMPLE">
                  <property name="JDBC.Driver" value="${driver}" />
                  <property name="JDBC.ConnectionURL" value="${url}" />
                  <property name="JDBC.Username" value="${username}" />
                  <property name="JDBC.Password" value="${password}" />
            </dataSource>
      </transactionManager> 
      <sqlMap resource="com/tt/User.xml"/>   
</sqlMapConfig>


User的映射文件:【对user的增删改查我只实现了增和改作为示例】

以下就是经常能看到的sqlMap.xml的实例~这部分的代码编写占据ibatis开发的70%左右。

<?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>
    <select id="selectUser" parameterClass="int" resultClass="com.tt.User">
    </select>

    <insert id="insertUser" parameterClass="com.tt.User">
       <![CDATA[
                 insert into user (name, age,sex, location)
                 values (
                              #name:VARCHAR#,
                              #age:INT#,
                              #sex:VARCHAR#,
                              #location:VARCHAR#
                             )]]>
        <selectKey resultClass="int" keyProperty="id">
            SELECT
            LAST_INSERT_ID() AS ID
         </selectKey>
    </insert>


    <delete id="deleteUser" parameterClass="int">
    </delete>


    <select id="selectUsers" parameterClass="com.tt.User">
    </select>

    <update id="updateUser" parameterClass="com.tt.User">
        update user
        <dynamic prepend="set">
            <isNotNull prepend="," property="name">
                name = #name:VARCHAR#
                         </isNotNull>
            <isNotNull prepend="," property="sex">
                sex = #sex:VARCHAR#
                         </isNotNull>
            <isNotNull prepend="," property="location">
                location = #location:VARCHAR#
                         </isNotNull>        
            <isNotNull prepend="," property="age">
                age = #age#
                        </isNotNull>
        </dynamic>
        where id = #id#
    </update>

</sqlMap>


解释:

ibatis映射 :

1) 关于主键:

ibatis支持数据库逐渐的自动生成,包括与预生成主键(插入数据之前就知道哪个是主键 eg:oracle)和 后生成主键(插入数据之后知道谁是主键, eg:mysql)

生成的主键会设置到同名属性中   -----keyProperty属性指定主键属性

selectKey的位置表示 是预生成主键 还是 后生成主键

2)对于sql语句中包含> 或者 <号的情况(where条件中可能会有),使用<![CDATA[*********]]> 来包含。*******表示被包含的sql语句,也可以只包含一个> 或者<符号

3)sql的输入参数parameterClass

插入语句入参: parameterClass = ‘包.类’

查询语句入参:可以设为类名,map,或者string,int ,long 等。 只有一个原声类型(string,int,long)作为入参是,可以使用#value#来引用。

   例如:

<select id ="selectUser" parameterClass ='long' resultClass = 'com.tt.User'>
 select * from User where id = #value#
</select>

我的例子中,没有id。以上是用法示例、

4)返回值参数类型

resultClass = 'com.tt.User'   -当结果集列名和类属性名完全对应的时候,使用resultClass

resultMap = 'xxx';                    ---当有些列不对应的时候。  resultMap 是一个POJO的映射,需要先定义xml的映射,才能被使用。

                    例如:

<resultMap id="mapUser" class="com.tt.mapUser">
		<result property="name" column="name"/>
		<result property="age" column="age"/>
	</resultMap>
则需要在com.tt包下建立一个POJO类对应,属性成员为name, age 。 只表示想知道的列

5)sql中参数的引用

引用parameterClass有三种方式 :

1. 原生类型 -- int , string , long  ---使用#value#         #value#不是关键字,可变

2. map类型参数,使用#keyName#来引用,keyName为健名

3.对象参数,  使用#propertyName# 使用对象的属性的名字。    比如上面的name =#name# 等。

6)模糊查询中参数的引用

了解## 和$$ 的区别。

#xxxx#是把 xxxx作为一个参数传入

$xxxx$是把xxxx整体直接拼接到sql语句上

在模糊查询是,要----》 ‘%$Name$%’


7)动态sql --ibatis的亮点

prepend表示链接关键字,可以为任何字串,当为sql关键字是,ibatis子欧诺个判断是否添加该关键字。


8)结果集映射继承

继承是为了映射定义的复用。

例如

<resultMap id="baseUser" class="com.tt.User">
		<result property="name" column="name"/>
		<result property="age" column="age"/>
	</resultMap>
	<resultMap id="User2" class="com.tt.User" extends="com.tt.User.baseUser">
		<result property="sex" column = "sex"/>
	</resultMap>


9)ibatis的分页查询   ---【待完善】

10)sql注入    ---【待完善】

11)ibatis可以配置缓存

12)ibatis各种id的命名

DAO层中接口名字SQL语句id的名字保持一致,


User.java    --注意属性名要与User.xml文件中的属性相对应、

package com.tt;

/**对象模型
 * 
 * @author taoyutong.pt
 *
 */
public class User {
	private int id;
	private String name;
	private int age;
	private String sex;
	private String location;
	public void setLocation(String location) {
		this.location = location;
	}
	public String getLocation() {
		return location;
	}
	public void setGender(String gender) {
		this.sex = gender;
	}
	public String getGender() {
		return sex;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public int getAge() {
		return age;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getId() {
		return id;
	}

}


UserDAO 接口:

package com.tt;

import java.sql.SQLException;
import java.util.List;

/**
 * UserDAO 
 * @author taoyutong.pt
 *
 */
public interface  UserDAO {
	
	//增
	public int insertUser(User user)throws SQLException;
	//删
	public int deleteUser(int id)throws SQLException;
	//改
	public int updateUser(User user)throws SQLException;
	//查
	public User queryUser(int id) throws SQLException;
	
	public List<User> queryUserByDynamic(User user)throws SQLException;


}

UserDAOImpl 实现类:

package com.tt;

/**
 * UserDAO实现类
 */
import java.io.IOException;
import java.io.Reader;
import java.sql.SQLException;
import java.util.List;
import com.ibatis.sqlmap.client.SqlMapClient;


public class UserDAOImpl implements UserDAO{
	//sqlMapClient
	private static SqlMapClient sqlMapClient =null;
	
	static {
		try {
			Reader reader = com.ibatis.common.resources.Resources
					.getResourceAsReader("com/tt/sqlMapConfig.xml");
			sqlMapClient = com.ibatis.sqlmap.client.SqlMapClientBuilder
					.buildSqlMapClient(reader);
			reader.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	@Override
	public int insertUser(User user)throws SQLException{
		return (Integer)sqlMapClient.insert("insertUser",user);
	}
	
	@Override
	public int deleteUser(int id)throws SQLException{
		
		return (Integer)sqlMapClient.delete("deleteUser" ,id);
	}
	
	@Override
	public int updateUser(User user)throws SQLException{
		
		return sqlMapClient.update("updateUser",user);
	}
	
	@Override
	public User queryUser(int id) throws SQLException{
		
		return (User)sqlMapClient.queryForObject("selectUser",id);			
	}

	@Override
	public List<User> queryUserByDynamic(User user)throws SQLException{
		return sqlMapClient.queryForList("selectUsers",user);
			
	}
}

AppMain.java   测试

package com.tt;

import java.sql.SQLException;

public class AppMain {

	public static void main(String args[]) throws SQLException{
		UserDAO userDAO = new UserDAOImpl();
		
		User user =new User();
		user.setAge(22);
		user.setGender("man");
		user.setLocation("dalian");
		user.setName("bulu");
		System.out.println(userDAO.insertUser(user));//返回自增ID
		user.setName("tt");
		System.out.println(userDAO.updateUser(user));//
	}
}





  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这是一个用iBator生成iBatis有关代码的例子。 特别说明: Eclipse应该是3.4.1以上版本, 并且安装了iBator插件。否则可用iBator的命令行版本或ant工具。 测试用数据是: CREATE TABLE PERSON( id INTEGER NOT NULL, firstName VARCHAR (40) NOT NULL, lastName VARCHAR (40) NOT NULL, PRIMARY KEY (ID) ); insert into PERSON values (1,'ng','Huang'); insert into PERSON values (2,'zh','Ni'); insert into PERSON values (3,'zy','Huang'); src下有三个目录: ibator/config:配置文件,其中: ibatorConfig.xml:iBaotr的配置文件,指示iBator如何生成代码,其中classPathEntry要指向一个 jdbc 驱动程序。 sqlMapConfig.properties:数据库配置,配置数据库密码等 AppSqlConfig.java:应用程序配置,如果目录结构相同,不必修改 SqlMapConfig.xml:SqlMap配置,在最后应该加上每个表的Map文件,特别注意useStatementNamespaces="true"不能为false org:生成的代码,分为三个目录,目录名在ibatorConfig.xml中指定 注意:其中生成的person_SqlMap.xml中的: <select id="ibatorgenerated_selectByPrimaryKey" resultMap="ibatorgenerated_BaseResultMap" > 经过修改了, 删除了parameterClass="org....的内容 test:一个测试主程序。运行它能得到数据库中的数据。 如何使用这个例子: 1、下载后解压缩 2、导入到Eclipse中 3、运行test/Test.java,看看结果 4、删除org及其下的三个目录及文件 5、在ibator/config/ibatorConfig.xml中的右键菜单,选择Generate iBATIS Artifacts 5、将自动生成org中的所有代码,研究一下这些代码 6、修改中的person_SqlMap.xml中的: <select id="ibatorgenerated_selectByPrimaryKey" resultMap="ibatorgenerated_BaseResultMap" > 7、再次执行test/Test.java,看看结果 8、研究ibator/config中的各个文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值