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=123456
总配置文件: 注意--我在总配置文件中直接加入了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> <!-- <span class="comments"><span style="color:#008200;">定义了ibatis的事务管理器有3中(JDBC,JTA,EXTERNAL)</span></span> --> <transactionManager type="JDBC" commitRequired="false"> <span class="comments"><span style="color:#008200;"><!--type属性指定了数据源的链接类型,也有3种类型(SIMPLE,DBCP,JNDI)--></span></span><span> </span> <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));// } }
本文摘自:http://blog.csdn.net/not_a_baby/article/details/6752719,如有侵权,请联系本人删除。