總結出的ibatis

 

 

 

總結出的ibatis的一些優勢:java

                                                                                             

 

    1ibatissql語句從Java源程序中獨立出來,mysql

放在單獨的XML文件中編寫,程序員

給程序的維護帶來了很大便利。sql

 

    2ibatis封裝了底層JDBC API的調用細節,數據庫

並能自動將結果集轉換成Java Bean對象,apache

大大簡化了Java數據庫編程的重複工做。編程

 

    3、由於Ibatis須要程序員本身去編寫sql語句,oracle

程序員能夠結合數據庫自身的特色靈活控制sql語句,app

所以可以實現比hibernate等全自動ORM框架更高的查詢效率,框架

可以完成複雜查詢。

 

 

 

 

iBatis 

apache的一個開源軟件,一個O/R Mapping的解決方案。

iBatis 已經更名爲Mybatis

 

 

 

 

iBatis 的優缺點:

 

優勢:

1、 減小代碼量,簡單;

2、 性能加強;

3、 Sql 語句與程序代碼分離;

4、 加強了移植性;

 

缺點:

1、 和Hibernate 相比,sql 須要本身寫;

2、 參數數量只能有一個,多個參數時不太方便;

 

 

 

 

搭建iBatis 開發環境:

、導入相關的jar 包,ibatis-2.3.0.677.jar mysql-connector-java-5.1.6-bin.jar

、編寫配置文件:

Jdbc 鏈接的屬性文件  sqlMap.properties 

        總配置文件, SqlMapConfig.xml

        關於每一個實體的映射文件(Map 文件) 

 

 

 

 

解決編碼提示問題:

若是xml 中沒有ibatis 的提示,

window --> Preference--> XML-->XML Catalog---> 點擊add

選擇uri URI: 請選擇本地文件系統上

iBatisDemo1/WebContent/WEB-INF/lib/sql-map-config-2.dtd 文件;

Key Type: 選擇Schema Location

Key: 須要聯網的,不建議使用; 

 

 

 

 

iBatis編程代碼實現

 

實體類

package com.entity;
public class User {
/* 
 * 注意這裏須要保證有一個無參構造方法,
 * 由於包括Hibernate在內的映射都是使用反射的,
 * 若是沒有無參構造可能會出現問題
 */
private Integer id;
private String username;
private String password;
private String name;
private Integer age;
private String gender;
private String phone;
private String ask;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAsk() {
return ask;
}
public void setAsk(String ask) {
this.ask = ask;
}
}
 
 
數據庫鏈接條件
sqlMap.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jsd1310db
username=root
password=root


主配置文件數據庫鏈接

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>
<!-- 1   引用JDBC屬性的配置文件 -->
<properties resource="com/entity/sqlMap.properties" />
<!-- 2   使用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>
<!--3    這裏能夠寫多個實體的映射文件 -->
<sqlMap resource="com/entity/User.xml" />
</sqlMapConfig>


 

 

實體描述文件

User.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>
<!-- 經過typeAlias使得咱們在下面使用user實體類的時候不須要寫包名 -->
<typeAlias alias="User" type="com.entity.User" />
 
 
   <!--   指明數據庫中字段和實體類中的屬性名對應-->
<!--   <resultMap id="ibatisTest" class="user" >-->
<!--     <result column="id" property="id" jdbcType="VARCHAR" />-->
<!--     <result column="name" property="name" jdbcType="VARCHAR" />-->
<!--   </resultMap>-->
 
<!-- 這樣之後改了sql,就不須要去改java代碼了 -->
<!-- id表示select裏的sql語句,resultClass表示返回結果的類型 -->
<select id="selectAllUser" resultClass="User">
select * from t_user
</select>
 
<!-- parameterClass表示參數的內容 -->
<!-- #表示這是一個外部調用的須要傳進的參數,能夠理解爲佔位符 -->
<select id="selectUserById" parameterClass="int" resultClass="User">
select * from t_user where id=#id#
</select>
 
<!-- 注意這裏的resultClass類型,使用User類型取決於queryForList仍是queryForObject -->
<select id="selectUserByName" parameterClass="String" resultClass="User">
select username,password from t_user where name like '%$name$%'
</select>
 
<insert id="addUser" parameterClass="User">
insert into
t_User(username,password,name) values
(#username#,#password#,#name#);
<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="deleteUserById" parameterClass="int">
<!-- #id#裏的id能夠隨意取,可是上面的insert則會有影響,由於上面的name會從User裏的屬性裏去查找 -->
<!-- 咱們也能夠這樣理解,若是有#佔位符,則ibatis會調用parameterClass裏的屬性去賦值 -->
delete from t_user where id=#id#
</delete>
 
<update id="updateUser" parameterClass="User">
update t_user set
username=#username#,name=#name# where id=#id#
</update>
 
</sqlMap>


接口

package com.dao;
public interface UserDao {
 
 
public boolean addUser(User user);
 
 
public boolean deleteUserById(int id);
 
 
public boolean updateUser(User user);
 
 
public List<User> selectAllUser();
 
 
public List<User> selectUserByName(String name);
 
 
/**
 * 根據用戶ID查找
 * @param id 用戶ID
 * @return 用戶
 */
public User selectUserById(int id);
 
}


 

實現

package com.dao;
public class UserDaoImpl implements UserDao {
 
private static SqlMapClient sqlMapClient = null;
 
// 讀配置文件
static {
try {
Reader reader = Resources
.getResourceAsReader("SqlMapConfig.xml");
System.out.println("dddddddddd");
sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
 
public boolean addUser(User user) {
Object object = null;
boolean flag = false;
try {
object = sqlMapClient.insert("addUser", user);
System.out.println("添加用戶信息的返回值"+object);
} catch (SQLException e) {
e.printStackTrace();
}
if (object != null) {
flag = true;
}
return flag;
}
 
public boolean deleteUserById(int id) {
Object object = null;
boolean flag = false;
try {
object = sqlMapClient.delete("deleteUserById",id);
System.out.println("刪除學生信息的返回值:"+object+", 這裏返回的是影響行數");
} catch (SQLException e) {
e.printStackTrace();
}
if(object!=null){
flag = true;
}
return flag;
}
public boolean updateUser(User user) {
Object object = null;
boolean flag = false;
try {
object = sqlMapClient.update("updateUser", user);
System.out.println("更新用戶信息的返回值"+object+"影響的行數");
} catch (SQLException e) {
e.printStackTrace();
}
if(object != null){
flag = true;
}
return flag;
}
 
/*
 * queryForList是用於查詢返回多個對象結果
 * queryForObject是用於查詢返回一個對象結果
 */
 
public List<User> selectAllUser() {
List<User>users = null;
try {
users = sqlMapClient.queryForList("selectAllUser");
} catch (SQLException e) {
e.printStackTrace();
}
return users;
}
 
public User selectUserById(int id) {
User user = null;
try {
user = (User) sqlMapClient.queryForObject("selectUserById",id);
} catch (SQLException e) {
e.printStackTrace();
}
return user;
}
 
public List<User> selectUserByName(String name) {
List<User>users = null;
try {
users = sqlMapClient.queryForList("selectUserByName",name);
} catch (SQLException e) {
e.printStackTrace();
}
return users;
}
 
 
}


 

測試類

public class TestIbatis {
public static void main(String[] args) {
UserDao dao = new UserDaoImpl();
List<User>users = dao.selectAllUser();
for(User u :users){
System.out.println(u.getUsername());
}
}
}


 

 

 

<?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="user"> 這是一個命名空間,能夠把他理解爲java中的包,防止重名。
 
 
 
<!-- Use type aliases to avoid typing the full classname every time. -->
 
 
 <typeAlias alias="User" type="com.fyw.module.User"/>這個是一個JavaBeen的一個路徑別名。把它com.abc.user.User都用User代替了。
 
 
 
<!-- Result maps describe the mapping between the columns returned
       from a query, and the class properties.  A result map isn't
       necessary if the columns (or aliases) match to the properties
       exactly. -->
  <!-- <resultMap id="AccountResult" class="Account">
    <result property="id" column="ACC_ID"/>
    <result property="firstName" column="ACC_FIRST_NAME"/>
    <result property="lastName" column="ACC_LAST_NAME"/>
    <result property="emailAddress" column="ACC_EMAIL"/>
  </resultMap>
 -->


demo中,會有配置這個與咱們建立的表結構,映射。可是大多數開發的狀況下,咱們是不用寫這個resultMap的, 那麼不少學習過hibernate的人就不太明白,若是按照hibernate的裏面的配置寫法這個是必須的與表結構裏面的字段一一對應,事實上是在下面寫Sql是用as爲每一個字段來起別名的

 

 

  <statement id="createUserTable">  
     create table ibatis_user  
     (  
       id int primary key ,  
       username varchar(20),  
       pwd varchar(20) 
     )  
  </statement>
 
    <!-- Insert example, using the Account parameter class -->
  <insert id="insertUser" parameterClass="User">
    insert into ibatis_user
      (id,username,pwd)
    values
    ( #id#,#name#, #pwd#  )
  </insert>


 這裏記住這裏的表仍是數據庫中的表,學過hibernate的人 總是不明白這裏爲何是insert into ibatis_user 這裏應該是個人映射啊,按道理他的理解就是insert into User ,請別忘了那句話,在ibatis裏面,永遠是純的sql語句編程。 

 

(#name#,#pdw#)


#符號是能夠這樣理解他就是之前咱們在sql語句中的佔位符。

 

 
 
(#name#,#pwd#)


 

那這裏的name pwd又是怎麼回事呢,首先咱們要先了解 insert into usertest

  (uname,pwd)是表中的數據的字段,而values(#name#,#pwd#)UserBeen裏面映射好了JavaBeen參數

 

 
  <update id="updateUser" parameterClass="User">


 

parameterClass="User"  parameterClass="int" parameterClass="String" 這個是你傳入的參數的類型。

 
 
 
resultClass="User" 這是返回結果集。
 
 
  <update>
   update ibatis_user set username= #name#,pwd=#pwd# where id =#id#  
  </update>
 
   <delete id="deleteUser" parameterClass="int">  
   delete from ibatis_user where uid = #id#  
  </delete> 
 
  <select id="selectUser" resultClass="User">  
     select id as id,username as name,pwd as pwd from ibatis_user  
  </select>
  
   <select id="selectUserByName" parameterClass="java.lang.String" resultClass="User">  
       select id,username as name,pwd as pwd from ibatis_user where username like '%$name$%' 
 
like語句的佔位符不能用#只能用$
  </select>


 

 <select id="selectNoConfigResultMap" resultClass="User" remapResults="true" >  
      select id,username as name,pwd as pwd from ibatis_user  
  </select>  
    
    <select id="selectUserById" parameterClass="String" resultClass="User" >  
      select id as id ,username as name,pwd as pwd from ibatis_user where id =#id#  
   </select>  
    
  <statement id="dropUser" >  
     drop table ibatis_user  
  </statement> 
 
</sqlMap>
相關文章
相關標籤/搜索