总结出的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>
相关文章
相关标签/搜索