关闭

ibatis搭建

977人阅读 评论(0) 收藏 举报
分类:

参考 :http://www.cnblogs.com/ycxyyzw/archive/2012/10/13/2722567.html

         IBatis是一款使用方便的数据访问工具,也可作为数据持久层的框架。和ORM框架(如Hibernate)将数据库表直接映射为Java对象相比,iBatis是将SQL语句映射为Java对象。相对于全自动SQL的Hibernate,iBatis允许你对SQL有完全控制权,可以视为半自动的数据访问工具。
        iBatis的最大优点是简便,轻量级,仅需iBatis的一个jar和数据库的驱动即可运行,而且使用iBatis仅需掌握SQL和XML的用法即可,而不像Hibernate那样需要配置对象间的关系。学习iBatis的过程要比Hibernate快很多,在项目中,若人员水平不大一致时,使用iBatis代替Hibernate作为数据访问工具可以有效提升开发效率。
        不管是iBatis还是Hibernate,都作为访问数据库的工具,它们必然基于JDBC而来,目的解决是JDBC程序开发的繁琐性和代码的冗余性(如加载驱动,建立连接,初始化语句对象,执行数据库操作,返回结果,关闭各个对象这一重复且无技术含量的过程)。

iBatis 的优缺点:

优点:

1、 减少代码量,简单;

2、 性能增强;

3、 Sql 语句与程序代码分离;

4、 增强了移植性;

缺点:

1、 和Hibernate 相比,sql 需要自己写;

2、 参数数量只能有一个,多个参数时不太方便;

           ibatis-2.3.0.677.jar  和 连接数据库所用的包

       SqlConfig.properties  连接数据库的配置文件 

             sqlmap-config.xml   [调用数据库的配置文件 进行连接数据库 ] 加载实体映射文件

        student.java 实体类

         student.xml   写相关查询sql


1、apache开源项目  O/R mapping 的解决方案

2、搭建环境

              导入jar 包   ibatis-2.3.0.677.jar  连接数据库所用的包

              SqlConfig.properties

<span style="font-size:18px;">driver=oracle.jdbc.driver.OracleDriver
url= jdbc:oracle:thin:@localhost:1521
username=root
password=123</span>

3  总配置文件   sqlmap-config.xml 

       

<span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" 
	"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>
  	<settings useStatementNamespaces="true"/>
  	<sqlMap resource="org/myosotis/framework/main/security/dao/domain/User.xml"/>	
</sqlMapConfig></span>

  或者

<span style="font-size:18px;"><?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>
<!-- 引用JDBC属性的配置文件 -->
<properties resource="com/iflytek/entity/SqlMap.properties" />
<!-- 使用JDBC的事务管理 -->
<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/iflytek/entity/Student.xml" />
</sqlMapConfig></span>



4 、实体

       student.java

<span style="font-size:18px;">import java.sql.Date;

public class Student {
// 注意这里需要保证有一个无参构造方法,因为包括Hibernate在内的映射都是使用反射的,如果没有无参构造可能会出现问题
private int id;
private String name;
private Date birth;
private float score;
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;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public float getScore() {
return score;
}
public void setScore(float score) {
this.score = score;
}
@Override
public String toString() {
return "id=" + id + "\tname=" + name + "\tmajor=" + birth + "\tscore="
+ score + "\n";
}
} </span>



5、实体

      student.xml

<span style="font-size:18px;"><?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使得我们在下面使用Student实体类的时候不需要写包名 -->
<typeAlias alias="Student" type="com.iflytek.entity.Student" />
<!-- 这样以后改了sql,就不需要去改java代码了 -->
<!-- id表示select里的sql语句,resultClass表示返回结果的类型 -->
<select id="selectAllStudent" resultClass="Student">
select * from
tbl_student
</select>
<!-- parameterClass表示参数的内容 -->
<!-- #表示这是一个外部调用的需要传进的参数,可以理解为占位符 -->
<select id="selectStudentById" parameterClass="int" resultClass="Student">
select * from tbl_student where id=#id#
</select>
<!-- 注意这里的resultClass类型,使用Student类型取决于queryForList还是queryForObject -->
<select id="selectStudentByName" parameterClass="String"
resultClass="Student">
select name,birth,score from tbl_student where name like
'%$name$%'
</select>
<insert id="addStudent" parameterClass="Student">
insert into
tbl_student(name,birth,score) values
(#name#,#birth#,#score#);
<selectKey resultClass="int" keyProperty="id">
select @@identity as inserted
<!-- 这里需要说明一下不同的数据库主键的生成,对各自的数据库有不同的方式: -->
<!-- mysql:SELECT LAST_INSERT_ID() AS VALUE -->
<!-- mssql:select @@IDENTITY as value -->
<!-- oracle:SELECT STOCKIDSEQUENCE.NEXTVAL AS VALUE FROM DUAL -->
<!-- 还有一点需要注意的是不同的数据库生产商生成主键的方式不一样,有些是预先生成 (pre-generate)主键的,如Oracle和PostgreSQL。
有些是事后生成(post-generate)主键的,如MySQL和SQL Server 所以如果是Oracle数据库,则需要将selectKey写在insert之前 -->
</selectKey>
</insert>
<delete id="deleteStudentById" parameterClass="int">
<!-- #id#里的id可以随意取,但是上面的insert则会有影响,因为上面的name会从Student里的属性里去查找 -->
<!-- 我们也可以这样理解,如果有#占位符,则ibatis会调用parameterClass里的属性去赋值 -->
delete from tbl_student where id=#id#
</delete>
<update id="updateStudent" parameterClass="Student">
update tbl_student set
name=#name#,birth=#birth#,score=#score# where id=#id#
</update>
</sqlMap></span>

typeAlias标签是设置别名用的,这里我们使用了一个Bean叫做User,声明别名后,在文件的后续部分可以直接使用别名而不用再给出完整类型了,非常方便,如select标签中的resultClass属性。
    这个配置我们使用的是Bean作为返回的结果类型,当然也可以使用Map,非常灵活。Select的id是标识该SQL语句的标识符,要在应用程序中使用到,必须唯一。Select标签体内的部分就是SQL语句了,当然这里是最简单的示例。



6、student.dao

<span style="font-size:18px;">    package com.iflytek.dao;
    import java.util.List;
    import com.iflytek.entity.Student;
 
    public interface StudentDao {
  
    public boolean addStudent(Student student);
 
    public boolean deleteStudentById(int id);
 
    public boolean updateStudent(Student student);

    public List<Student> selectAllStudent();
   
    public List<Student> selectStudentByName(String name);
 
    public Student selectStudentById(int id);
    } 



7 studentDaoImpl

  package com.iflytek.daoimpl;
    import java.io.IOException;
    import java.io.Reader;
    import java.sql.SQLException;
    import java.util.List;
    import com.ibatis.common.resources.Resources;
    import com.ibatis.sqlmap.client.SqlMapClient;
    import com.ibatis.sqlmap.client.SqlMapClientBuilder;
    import com.iflytek.dao.StudentDao;
    import com.iflytek.entity.Student;
  
    public class StudentDaoImpl implements StudentDao {
    private static SqlMapClient sqlMapClient = null;
    // 读取配置文件
    static {
    try {
    Reader reader = Resources
    .getResourceAsReader("com/iflytek/entity/SqlMapConfig.xml");
    sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
    reader.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    public boolean addStudent(Student student) {
    Object object = null;
    boolean flag = false;
    try {
    object = sqlMapClient.insert("addStudent", student);
    System.out.println("添加学生信息的返回值:" + object);
    } catch (SQLException e) {
    e.printStackTrace();
    }
    if (object != null) {
    flag = true;
    }
    return flag;
    }
    public boolean deleteStudentById(int id) {
    boolean flag = false;
    Object object = null;
    try {
    object = sqlMapClient.delete("deleteStudentById", id);
    System.out.println("删除学生信息的返回值:" + object + ",这里返回的是影响的行数");
    } catch (SQLException e) {
    e.printStackTrace();
    }
    if (object != null) {
    flag = true;
    }
    return flag;
    }
    public boolean updateStudent(Student student) {
    boolean flag = false;
    Object object = false;
    try {
    object = sqlMapClient.update("updateStudent", student);
    System.out.println("更新学生信息的返回值:" + object + ",返回影响的行数");
    } catch (SQLException e) {
    e.printStackTrace();
    }
    if (object != null) {
    flag = true;
    }
    return flag;
    }
    public List<Student> selectAllStudent() {
    List<Student> students = null;
    try {
    students = sqlMapClient.queryForList("selectAllStudent");
    } catch (SQLException e) {
    e.printStackTrace();
    }
    return students;
    }
    public List<Student> selectStudentByName(String name) {
    List<Student> students = null;
    try {
    students = sqlMapClient.queryForList("selectStudentByName",name);
    } catch (SQLException e) {
    e.printStackTrace();
    }
    return students;
    }
    public Student selectStudentById(int id) {
    Student student = null;
    try {
    student = (Student) sqlMapClient.queryForObject(
    "selectStudentById", id);
    } catch (SQLException e) {
    e.printStackTrace();
    }
    return student;
    }

8 testIbatis

<span style="font-size:18px;">    package com.iflytek.test;
    import java.sql.Date;
    import java.util.List;
    import com.iflytek.daoimpl.StudentDaoImpl;
    import com.iflytek.entity.Student;
 
    public class TestIbatis {
    public static void main(String[] args) {
    StudentDaoImpl studentDaoImpl = new StudentDaoImpl();
    System.out.println("测试插入");
    Student addStudent = new Student();
    addStudent.setName("李四");
    addStudent.setBirth(Date.valueOf("2011-09-02"));
    addStudent.setScore(88);
    System.out.println(studentDaoImpl.addStudent(addStudent));
    System.out.println("测试根据id查询");
    System.out.println(studentDaoImpl.selectStudentById(1));
    System.out.println("测试模糊查询");
    List<Student> mohuLists = studentDaoImpl.selectStudentByName("李");
    for (Student student : mohuLists) {
    System.out.println(student);
    }
    System.out.println("测试查询所有");
    List<Student> students = studentDaoImpl.selectAllStudent();
    for (Student student : students) {
    System.out.println(student);
    }
    System.out.println("根据id删除学生信息");
    System.out.println(studentDaoImpl.deleteStudentById(1));
    System.out.println("测试更新学生信息");
    Student updateStudent = new Student();
    updateStudent.setId(1);
    updateStudent.setName("李四1");
    updateStudent.setBirth(Date.valueOf("2011-08-07"));
    updateStudent.setScore(21);
    System.out.println(studentDaoImpl.updateStudent(updateStudent));
    }
    } </span>




或者:

       其中的

String PREFIX = "SaleCityInfo.";

      对应xml中

<sqlMap namespace="SaleCityInfo">


     java   dao 层的实现类:

package org.myosotis.framework.main.security.dao;
/**
 * 自定义航段信息维护
 */
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.myosotis.framework.main.security.dao.domain.FrbFltPublic;
import org.myosotis.framework.main.security.dao.domain.Holiday;
import org.myosotis.framework.main.security.dao.domain.Seg;
import org.myosotis.framework.main.security.dao.interf.IFrbFltPublicDao;
import org.myosotis.framework.main.security.dao.interf.IHolidayDAO;
import org.myosotis.framework.main.security.dao.interf.ISegDAO;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

import com.ibatis.sqlmap.client.SqlMapClient;

public class SegDaoImpl extends SqlMapClientDaoSupport implements
		ISegDAO {

	String PREFIX = "Seg.";

	
	@Override
	public List<Seg> getAllSegs(String airline) {
		return getSqlMapClientTemplate().queryForList(
				PREFIX + "getAllSegs",airline);
	}

	
	@Override
	public void deleteSegs(String ids) {
		getSqlMapClientTemplate().delete(PREFIX + "deleteByIds", ids);
		
	}


	@Override
	public void saveSeg(Seg seg) {
		getSqlMapClientTemplate().insert(PREFIX + "insert", seg);
		
	}

	@Override
	public void updateSeg(Seg seg) {
		getSqlMapClientTemplate().update(PREFIX + "update", seg);
	}


	@Override
	public List<Seg> getSeg(String dptPort, String dptCname, String arrPort,
			String arrCname,String airline) {
		Map paraMap = new HashMap();
		paraMap.put("dptPort", dptPort.trim());
		paraMap.put("dptCname", dptCname.trim());
		paraMap.put("arrPort", arrPort.trim());
		paraMap.put("arrCname", arrCname.trim());
		paraMap.put("airline", airline.trim());
		return getSqlMapClientTemplate().queryForList(
				PREFIX + "getSeg", paraMap);
	}
	
}

      对应的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 namespace="SaleCityInfo">

	<!-- Use type aliases to avoid typing the full classname every time. -->
	<typeAlias alias="SaleCity"
		type="org.myosotis.framework.main.security.dao.domain.SaleCity" />

	<resultMap id="SaleCity" class="SaleCity">
		<result column="ID" property="saleCityId" />
		<result column="YYB_CODE" property="yybCode" />
		<result column="YYB_CNAME" property="yybCname" />
		<result column="PROVINCE" property="province" />
		<result column="YYB_CITY" property="cityCname" />
		<result column="YYB_CITY_CODE" property="cityCode" />
	</resultMap>
	

	<select id="getSaleCitys" resultMap="SaleCity">
		SELECT *
		FROM dss_pdata.GS_YYB_CITY order by ID DESC, Yyb_Cname
	</select>


  <select id="getSaleCity" resultMap="SaleCity"
		parameterClass="java.util.Map">
		SELECT *
		FROM dss_pdata.GS_YYB_CITY
		<dynamic prepend="WHERE">
			<isNotEmpty  prepend="and"  property="yybCode">
				YYB_CODE like '%'||#yybCode#||'%'
         	</isNotEmpty>
			<isNotEmpty prepend="and" property="yybCname">
				YYB_CNAME like '%'||#yybCname#||'%'
         	</isNotEmpty>
         	<isNotEmpty prepend="and" property="province">
				PROVINCE like '%'||#province#||'%'
         	</isNotEmpty>
			<isNotEmpty prepend="and" property="cityCname">
				YYB_CITY like '%'||#cityCname#||'%'
         	</isNotEmpty>
			<isNotEmpty prepend="and" property="cityCode">
				YYB_CITY_CODE like '%'||#cityCode#||'%'
         	</isNotEmpty>
		</dynamic>
		order by Yyb_Cname
	</select>  


	<insert id="saveSaleCity" parameterClass="SaleCity">
		INSERT
		INTO
		dss_pdata.GS_YYB_CITY
		(ID,YYB_CODE,YYB_CNAME,PROVINCE,YYB_CITY,YYB_CITY_CODE)
		VALUES  
		(dss_pdata.GS_YYB_CITY_SEQ.NEXTVAL,#yybCode#,#yybCname#,#province#,#cityCname#,#cityCode#)
	</insert>

	<update id="update" parameterClass="SaleCity">
		UPDATE
		dss_pdata.GS_YYB_CITY
		SET
		YYB_CODE=#yybCode#,
		YYB_CNAME=#yybCname#,
		PROVINCE=#province#,
		YYB_CITY=#cityCname#,
		YYB_CITY_CODE=#cityCode#
		WHERE
		ID = #saleCityId#
	</update>
	
	<delete id="deleteByIds" parameterClass="java.lang.String">
		DELETE
		FROM
		dss_pdata.GS_YYB_CITY
		WHERE
		ID IN ($saleCityId$)
	</delete>
	

</sqlMap>

 其中实际重点是:

              查询过程中: 

                      多条件查询,使用动态拼接sql,在查询某些条件时,使用模糊查询。拼接%分号

	<insert id="saveSaleCity" parameterClass="SaleCity">
		INSERT
		INTO
		dss_pdata.GS_YYB_CITY
		(ID,YYB_CODE,YYB_CNAME,PROVINCE,YYB_CITY,YYB_CITY_CODE)
		VALUES  
		(dss_pdata.GS_YYB_CITY_SEQ.NEXTVAL,#yybCode#,#yybCname#,#province#,#cityCname#,#cityCode#)
	</insert>


                          删除中:

                                      在官方文档中,一般是使用ognl来 foreach 来进行 遍历传入的参数。

                                       但好的方法是,一般通过id进行传入参数,直接通过id删除。在前台进行把id拼接成数据库想要的‘ ’,参数:

nl += "'" + r.get('saleCityId') + "'" + ',';

ids = ids.substring(0,ids.length()-1);

<delete id="deleteByIds" parameterClass="java.lang.String">
		DELETE
		FROM
		dss_pdata.GS_YYB_CITY
		WHERE
		ID IN ($saleCityId$)
	</delete>

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:200658次
    • 积分:4013
    • 等级:
    • 排名:第8279名
    • 原创:196篇
    • 转载:71篇
    • 译文:0篇
    • 评论:6条
    最新评论