ibatis使用
使用感想:
个人觉得主要是用来以对象的形式使用数据库数据。sql还是得自己写相比entity framework来说还是要麻烦一点,感觉相比于jdbc,ado.net什么的没省多少事。(java初学者的感想,欢迎指正)
使用方式
与其他orm框架类似的,也需要写实体类(ibatis里面貌似叫做pojo)和映射文件(与其他orm框架一样的xml文件,对应数据库字段与实体类属性的,不过ibatis里面包含sql语句)
- 主配置文件sqlMapConfig.xml(相当于hibernate里面的hibernate.xml):里面可以写数据库链接字符串和指定其他具体的实体类映射文件位置。
- 实体类映射文件(如:Actor.xml):里面写具体的数据库字段与对应实体类之间的映射关系。
- 需要注意的: 这里面的路径写法不是用 “.”分割,而是用“/”分割,如
<sqlMap resource="com/pfSoft/ibatis/model/Actor.xml" />
- SqlMapClientBuilder 这个感觉像是sessionfactory,然后通过这个创建一个SqlMapClient(类似于session)。然后SqlMapClient对象可以做各种增删改查操作如进行查询的:
List<Actor> ems = smc.queryForList("actor.getAcotrByFirstName", "kobe");
其中smc是SqlMapClient实例对象。
仅记录最简单使用和容易发生错误的地方
需要用到的jar包: *ibatis-2.3.4.726.jar *
由于使用的是mysql数据库因此需要引用 mysql-connector-java-5.1.13-bin.jar
关键类:
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
附上实例代码:
主配置文件: sqlMapConfig.xml文件
<?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>
<settings useStatementNamespaces="true" />
<transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="com.mysql.jdbc.Driver" />
<property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost:3306/test" />
<property name="JDBC.Username" value="root" />
<property name="JDBC.Password" value="就不告诉你" />
</dataSource>
</transactionManager>
<sqlMap resource="com/pfSoft/ibatis/model/Actor.xml" />
</sqlMapConfig>
实体类: Actor.java
package com.pfSoft.ibatis.model;
public class Actor {
private int _actor_id;
private String _First_name;
private String _last_name;
public int getActor_id() {
return this._actor_id;
}
public void setActor_id(int actIdString) {
this._actor_id=actIdString;
}
public String getFirst_name() {
return this._First_name;
}
public void setFirst_name(String firstNameString) {
this._First_name=firstNameString;
}
public String getLast_name() {
return this._last_name;
}
public void setLast_name(String Last_nameString) {
this._last_name=Last_nameString;
}
}
实体类映射文件: Actor.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="actor">
<typeAlias alias="Actor" type="com.pfSoft.ibatis.model.Actor" />
<!-- 获取全部数据 -->
<select id="getAll" resultClass="Actor">
SELECT * FROM Actor
</select>
<select id="getAcotrByFirstName" resultClass="Actor">
SELECT * FROM Actor where first_name=#first_name#
</select>
<!-- 插入 -->
<insert id="insert" parameterClass="Actor">
insert into Actor(first_name, last_name)
values (#first_name#,
#last_name#)
<selectKey resultClass="int" keyProperty="actor_id">
select
last_insert_id() as actor_id from Actor limit 1
</selectKey>
</insert>
<!-- 分页 -->
<select id="pageActor" parameterClass="java.util.HashMap"
resultClass="Actor">
select * from Actor
<dynamic prepend="WHERE">
<isGreaterThan prepend="AND" property="actor_id"
compareValue="0">
actor_id > #actor_id#
</isGreaterThan>
</dynamic>
order by actor_id limit #begin#,#pageSize#
</select>
<!-- 模糊查询 like ibatis 的 parameterClass 的string类型可以直接写成string或者java.lang.Strig -->
<select id="selectStudentByName" parameterClass="string"
resultClass="Actor">
SELECT * FROM Actor where first_name like '%$name$%'
</select>
<select id="doubleTable" parameterClass="string" resultClass="Actor">
SELECT a.* FROM Actor a, category c where a.actor_id =c.category_id
and first_name like '%$name$%'
group by First_name desc
</select>
<!-- <select id="selectStudentByName" parameterClass="String" -->
<!-- resultClass="Actor"> -->
<!-- SELECT * FROM Actor where first_name like '%$name$%' -->
<!-- </select> -->
</sqlMap>
测试insert
private static boolean addActoreInfo(Actor act) {
boolean ret=false;
try {
Reader rd = Resources.getResourceAsReader("com/pfSoft/ibatis/SqlMapConfig.xml");
SqlMapClient smc = SqlMapClientBuilder.buildSqlMapClient(rd);
smc.insert("actor.insert",act);
ret=true;
} catch (Exception e) {
e.printStackTrace();
}
return ret;
}