近日,由于公司项目应用开发的逻辑层使用的是iBatis。上网查了些资料,自己写了点demo入门。感觉良好。iBatis实在是比Hibernate很容易入门,贡献出来与各路菜鸟分享(后文附源码),希望得到大神指教。转载请保留本文出处:http://itred.cnblogs.com ; 作者:itRed。
ORM框架中操作数据库的逻辑层中,Hibernate和iBatis相对来说是比较受欢迎的。Hibernate是“全自动”的,能够完全生成SQL语句;而iBatis是“半自动化”的,需要程序员根据自己的应用程序写相应的SQL语句。但是,在实际的开发过程中还是应根据实际情况进行选择。(iBatis的优缺点比较)
优点 | 缺点 |
与JDBC相比减少了很多的代码量;入门简单;架构级性能较强; Sql语句和程序代码的分离;简化项目中的分工; 增强了移植性。 |
Sql语句需要程序员自己写; 参数数量只能一个,但是如果需要多个参数时, 需要将参数打包封装成Map等; |
在进行iBatis应用程序开发之前首先需要对iBatis这个技术有一定的了解。iBatis是apache下的一个开源项目,因为其小巧,上手很快深受程序员的喜爱。iBatis的核心是SqlMap。
本案例将详细介绍iBatis操作MySQL数据库。 利用iBatis对数据库中的记录进行简单的增删改查操作。测试方法main,显示结果到控制台。部分结果直接查看数据库信息。虽然demo比较简单,但是很能起到抛砖引玉的作用。
数据准备:
数据库名称:ibatis
表名称:student
本人数据库中的数据信息:
案例解析及源码:
在正式操作数据库之前需要做一些准备工作,部分备注详见源码注释中:
首先需要导入ibatis的相关jar包,以及连接数据库的驱动jar包;在新建的项目文件下建一个Student的实体Bean。
package com.red; import java.util.Date; /** * Student实体类 * @author Red * */ public class Student { //保证一个无参数方法。反射机制 private int sid=0; private String sname=null; private String major=null; private Date birth=null; private int score=0; public int getSid() { return sid; } public void setSid(int sid) { this.sid = sid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public String getMajor() { return major; } public void setMajor(String major) { this.major = major; } public Date getBirth() { return birth; } public void setBirth(Date birth) { this.birth = birth; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } @Override public String toString() { //重写toString方法,方便控制台显示 String content="sid="+sid+"\tsname:"+sname+"\tmajor:"+major+"\tbirth:"+birth+"\tscore:"+score; return content; } }
建一个接口以及它的实现类,为了测试方便直接将main方法放到该接口实现类中;
package com.red; import java.util.List; /** * 接口 * @author Red * */ public interface IStudentDAO { public void addStudent(Student student); public void deleteStudentById(int id); public void updateStudentById(Student studnet); public List<Student> queryAllStudent(); public List<Student> queryStudentByName(String name); public Student queryStudentById(int id); }
package com.red; 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; public class IStudentDAOImpl implements IStudentDAO { private static SqlMapClient sqlMapClient=null; static{ try{ Reader reader=Resources.getResourceAsReader("com/red/SqlMapConfig.xml"); sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader); reader.close(); }catch (Exception e) { e.printStackTrace(); } } public void addStudent(Student student) { try { sqlMapClient.insert("insertStudent", student); } catch (SQLException e) { e.printStackTrace(); } } public void deleteStudentById(int id) { try { sqlMapClient.delete("deleteStudentById",id); } catch (SQLException e) { e.printStackTrace(); } } public List<Student> queryAllStudent() { List<Student> studentList=null;; try { studentList=sqlMapClient.queryForList("selectAllStudent"); } catch (SQLException e) { e.printStackTrace(); } return studentList; } public Student queryStudentById(int id) { Student student=null; try { student=(Student) sqlMapClient.queryForObject("selectStudentById",id); } catch (SQLException e) { e.printStackTrace(); } return student; } /** * 模糊查询 */ public List<Student> queryStudentByName(String name) { List<Student> studentList=null; try { studentList=sqlMapClient.queryForList("selectStudentByName", name); } catch (SQLException e) { e.printStackTrace(); } return studentList; } public void updateStudentById(Student student) { try { sqlMapClient.update("updateStudentById", student); } catch (SQLException e) { e.printStackTrace(); } } public static void main(String[] args) { IStudentDAO dao=new IStudentDAOImpl(); /** * 查询所有的学生对象*/ for(Student student:dao.queryAllStudent()){//遍历student对象 System.out.println(student); } /** * 查询指定id的学生对象 Student student=dao.queryStudentById(1); System.out.println(student); //以上两行代码可缩写为: System.out.println(dao.queryStudentById(1)); */ /** * 插入学生对象数据 Student student=new Student(); student.setSid(3); student.setSname("小明"); student.setMajor("应用化学"); student.setBirth(Date.valueOf("2013-09-09")); student.setScore(88); dao.addStudent(student); */ /** * 删除指定id的学生数据 dao.deleteStudentById(1); */ /** * 修改数据对象 Student student=new Student(); student.setSid(3); student.setSname("朱小明"); student.setMajor("嵌入式开发"); student.setBirth(Date.valueOf("2013-09-09")); student.setScore(68); dao.updateStudentById(student); */ /** * 模糊查询 for(Student student:dao.queryStudentByName("t")){ System.out.println(student); } */ } }
建立一个SqlMap.properties的文件,该属性文件主要负责数据库的链接
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/ibatis username=root password=123456
建立一个SqlMapConfig.xml文件,主要负责ibatis的配置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQLL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd"> <sqlMapConfig> <properties resource="com/red/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/red/Student.xml"/> </sqlMapConfig>
建立实体类的映射文件(SQL语句就在其中)
<?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="student" type="com.red.Student"/> <!-- 配置表和实体之间的映射关系 --> <resultMap class="com.red.Student" id="student"> <result property="sname" column="SNAME"/> <result property="major" column="MAJOR"/> <result property="birth" column="BIRTH"/> <result property="score" column="SCORE"/> </resultMap> <select id="selectAllStudent" resultClass="student"> SELECT SID,SNAME,MAJOR,BIRTH,SCORE FROM `ibatis`.`student` </select> <select id="selectStudentById" parameterClass="int" resultClass="student"> SELECT SID,SNAME,MAJOR,BIRTH,SCORE FROM `ibatis`.`student` WHERE SID=#sid# </select> <insert id="insertStudent" parameterClass="student"> INSERT INTO `ibatis`.`student`(SID,SNAME,MAJOR,BIRTH,SCORE) values(#sid#,#sname#,#major#,#birth#,#score#) </insert> <delete id="deleteStudentById" parameterClass="int"> DELETE FROM `ibatis`.`student` WHERE sid=#sid# </delete> <update id="updateStudentById" parameterClass="student"> UPDATE `ibatis`.`student` SET SNAME=#sname#,MAJOR=#major#,BIRTH=#birth#,SCORE=#score# WHERE sid=#sid# </update> <select id="selectStudentByName" parameterClass="String" resultClass="student"> SELECT SID,SNAME,MAJOR,BIRTH,SCORE FROM `ibatis`.`student` WHERE SNAME LIKE '%$sname$%' </select> </sqlMap>
ibatis查询数据库所有数据(重点解析本查询案例,另外的几个操作很简单,源码附注释,很容易看懂。不懂可以Email我。)
1 public List<Student> queryAllStudent() { 2 List<Student> studentList=null;; 3 try { 4 studentList=sqlMapClient.queryForList("selectAllStudent"); 5 } catch (SQLException e) { 6 e.printStackTrace(); 7 } 8 return studentList; 9 }
Student中的SQL语句:
前几日刚在公司学到的经验,程序员在写SQL语句中的字段和关键字时尽量大写,显得专业,而且提高数据库的查询效率。
<select id="selectAllStudent" resultClass="student"> SELECT SID,SNAME,MAJOR,BIRTH,SCORE FROM `ibatis`.`student` </select>
Main方法中的测试代码:
IStudentDAO dao=new IStudentDAOImpl(); for(Student student:dao.queryAllStudent()){//遍历student对象 System.out.println(student); }
运行结果:
iBatis 模糊查询
iBatis 添加数据记录
iBatis 修改数据记录
iBatis 删除数据记录
这些操作都可以依葫芦画瓢,后文附本DEMO的源码,欢迎各位来邮交流学习心得。E-mail: [email protected]
测试时,只需要去除要运行部分的注释。右击测试main方法就可顺利在控制台看到运行结果。
作者:itRed
出处:http://itred.cnblogs.com
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段说明,且在文章明显位置给出原文链接,否则保留追究法律责任的权利。