Ibatis学习一. 简单入门

iBatis 简介:

iBatis apache 的一个开源项目,一个O/R Mapping 解决方案,iBatis 最大的特点就是小巧,上手很快。如果不需要太多复杂的功能,iBatis 是能够满足你的要求又足够灵活的最简单的解决方案,现在的iBatis 已经改名为Mybatis 了。

特性:

1. 简单性

Ibatis 是一个非常简单易用的工具包。这个简单性不仅仅体现在开发库的轻量小巧上,iBATIS 对于 Java 开发者来说也非常简单。因为它除了不用编写那么多代码外与 JDBC 的工作机制非常相像,iBATIS 就是以 XML 的形式来描述的 JDBC 代码。iBATIS 对于数据库管理员以及 SQL 程序员来 说也非常容易理解。iBATIS 配置文件几乎人人都能读懂,只要他有 SQL 编程的经验。

2. 效率与性能

iBATIS 通过一种简单的方式来配置和使用,其性能与 JDBC 相当。通过直接编写 SQL 查询,开发人员可以直接控制 SQL 语句来优化执行效率,甚至可以在其中调用存储过程,为开发人员提供了巨大的 SQL 优化空间。

3. 代码分离

在 iBATIS 中,SQL 语句在很大程度上同应用的源代码是分离 的,SQL 程序员可以按照 SQL 原本的方式来编写它,而不必担心有关 SQL 字符串连接的问题。iBATIS 提供了充分的自由,使得任何人都可以开发、观察并且修改在数据库中执行的 SQL 语句。

4. 可移植性

iBATIS 是可移植的。由于它相对简单的设计,它几乎可以用任何一种语言在任何一个平台上实现。iBATIS 支持 3 种最受欢迎的开发平台:Java、Ruby 和微软 .NET 的 C#。

官网为:http://www.mybatis.org/

搭建iBatis 开发环境:

    1 、导入相关的jar 包:(2个)ibatis-2.3.0.677.jar 、mysql-connector-java-5.1.6-bin.jar

    2 、编写配置文件:(3种)

           Jdbc 连接的属性文件:jdbc.properties

           总配置文件:SqlMapConfig.xml

           关于每个实体的映射文件(Map 文件):Student.xml

 

iBatis 的优缺点:

优点:

      1、减少代码量,简单;

      2、性能增强;

      3、 Sql 语句与程序代码分离;

      4、增强了移植性;

缺点:

      1、Hibernate 相比,sql 需要自己写;

      2、参数数量只能有一个,多个参数时不太方便;

 

实例分析:

1.Pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>Ibatis00</groupId>
    <artifactId>Ibatis00</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--Junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
        <!--Ibatis-->
        <dependency>
            <groupId>org.apache.ibatis</groupId>
            <artifactId>ibatis-sqlmap</artifactId>
            <version>2.3.4.726</version>
        </dependency>
        <!--Mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.27</version>
        </dependency>
    </dependencies>

</project>

说明:

如果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: 需要联网的,不建议使用

 

 2.SqlMapConfig.xml总配置文件:(1.加载属性文件 2.配置数据源 3.确定事务 4.关联实体映射文件)

<?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>

    <!-- 引用数据库链接的配置文件 -->
    <properties resource="mysql.properties"/>

    <!-- 使用JDBC事务管理 -->
    <transactionManager type="JDBC">

        <!-- 数据源 -->
        <dataSource type="SIMPLE">
            <property name="JDBC.Driver" value="${driver}"/>
            <property name="JDBC.ConnectionURL" value="${url}"/>
            <property name="JDBC.Username" value="${root}"/>
            <property name="JDBC.Password" value="${password}"/>
        </dataSource>

    </transactionManager>

    <!-- 实体类映射文件 -->
    <sqlMap resource="Student.xml"/>

</sqlMapConfig>
  

3.jdbc.properties属性文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/ibatis?useUnicode=true&amp;characterEncoding=UTF-8
username=root
password=111111

4.Student.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 alias="Student" type="com.zyzy.ibatis.entity.Student"/>

    <!--查询-->
    <select id="findAll" resultClass="Student">
        select * from student
    </select>
    <select id="findById" resultClass="Student">
        select * from student where id=#id#
    </select>
    <select id="findByName" resultClass="Student">
        select * from student where name like '%$name$%'
    </select>

    <!--添加-->
    <insert id="addStudent" parameterClass="Student">
        insert into student values(#id#,#name#,#age#)
        <selectKey keyProperty="id" resultClass="int">
            select @@identity as id
        </selectKey>
    </insert>
    <!-- 这里需要说明一下不同的数据库主键的生成,对各自的数据库有不同的方式: -->
    <!-- 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之前 -->   

    <!--更新-->
    <update id="updateStudent" parameterClass="Student">
        update student set name=#name#,age=#age# where id=#id#
    </update>

    <!--删除-->
    <delete id="deleteById" parameterClass="int">
        delete from student where id=#id#
    </delete>

</sqlMap>
 

5.Student实体类

public class Student {
//注意这里需要保证有一个无参构造方法,因为包括Hibernate在内的映射都是使用反射的,
// 如果没有无参构造可能会出现问题
    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

6.IbatisUtil工具类

public class IbatisUtil {
    private static SqlMapClient client = null;
    static{
        try {
            Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
            client = SqlMapClientBuilder.buildSqlMapClient(reader);
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SqlMapClient getClient() {
        return client;
    }
}

7.IStudentDao接口

public interface IStudentDao {
    List<Student> findAll();                //查找全部
    Student findById(int id);               //通过id查找
    List<Student> findByName(String name);  //通过name模糊查询
    void addStudent(Student student);       //增加
    void updateStudent(Student student);    //修改
    void deleteById(int id);             //删除
}

8.StudentDaoImpl数据库持久层实现类

public class StudentDaoImpl implements IStudentDao {

    private static SqlMapClient client = IbatisUtil.getClient();

    /**
     * 查找全部
     * @return 返回Student集合
     */
    @Override
    public List<Student> findAll() {
        try {
            return client.queryForList("findAll");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 通过ID查找单个
     * @param id
     * @return 返回单个Student
     */
    @Override
    public Student findById(int id) {
        try {
            return (Student) client.queryForObject("findById",id);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 通过name模糊查询
     * @param name
     * @return 返回Student集合
     */
    @Override
    public List<Student> findByName(String name) {
        try {
            return client.queryForList("findByName",name);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 插入一个Student
     * @param student
     */
    @Override
    public void addStudent(Student student) {
        try {
            client.insert("addStudent",student);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 更新Student
     * @param student
     */
    @Override
    public void updateStudent(Student student) {
        try {
            client.update("updateStudent",student);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 删除指定的Student
     * @param id
     */
    @Override
    public void deleteById(int id) {
        try {
            client.delete("deleteById",id);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

}

9.StudentService业务类

public class StudentService {
    public static void main(String[] args) {
        IStudentDao dao = new StudentDaoImpl();
        List<Student> students = null;
        students = dao.findAll();
        System.out.println(students);
//		dao.deleteById(8);
    }
}

 

iBatis 简介:

iBatis apache 的一个开源项目,一个O/R Mapping 解决方案,iBatis 最大的特点就是小巧,上手很快。如果不需要太多复杂的功能,iBatis 是能够满足你的要求又足够灵活的最简单的解决方案,现在的iBatis 已经改名为Mybatis 了。

特性:

1. 简单性

Ibatis 是一个非常简单易用的工具包。这个简单性不仅仅体现在开发库的轻量小巧上,iBATIS 对于 Java 开发者来说也非常简单。因为它除了不用编写那么多代码外与 JDBC 的工作机制非常相像,iBATIS 就是以 XML 的形式来描述的 JDBC 代码。iBATIS 对于数据库管理员以及 SQL 程序员来 说也非常容易理解。iBATIS 配置文件几乎人人都能读懂,只要他有 SQL 编程的经验。

2. 效率与性能

iBATIS 通过一种简单的方式来配置和使用,其性能与 JDBC 相当。通过直接编写 SQL 查询,开发人员可以直接控制 SQL 语句来优化执行效率,甚至可以在其中调用存储过程,为开发人员提供了巨大的 SQL 优化空间。

3. 代码分离

在 iBATIS 中,SQL 语句在很大程度上同应用的源代码是分离 的,SQL 程序员可以按照 SQL 原本的方式来编写它,而不必担心有关 SQL 字符串连接的问题。iBATIS 提供了充分的自由,使得任何人都可以开发、观察并且修改在数据库中执行的 SQL 语句。

4. 可移植性

iBATIS 是可移植的。由于它相对简单的设计,它几乎可以用任何一种语言在任何一个平台上实现。iBATIS 支持 3 种最受欢迎的开发平台:Java、Ruby 和微软 .NET 的 C#。

官网为:http://www.mybatis.org/

搭建iBatis 开发环境:

    1 、导入相关的jar 包:(2个)ibatis-2.3.0.677.jar 、mysql-connector-java-5.1.6-bin.jar

    2 、编写配置文件:(3种)

           Jdbc 连接的属性文件:jdbc.properties

           总配置文件:SqlMapConfig.xml

           关于每个实体的映射文件(Map 文件):Student.xml

 

iBatis 的优缺点:

优点:

      1、减少代码量,简单;

      2、性能增强;

      3、 Sql 语句与程序代码分离;

      4、增强了移植性;

缺点:

      1、Hibernate 相比,sql 需要自己写;

      2、参数数量只能有一个,多个参数时不太方便;

 

实例分析:

1.Pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>Ibatis00</groupId>
    <artifactId>Ibatis00</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--Junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
        <!--Ibatis-->
        <dependency>
            <groupId>org.apache.ibatis</groupId>
            <artifactId>ibatis-sqlmap</artifactId>
            <version>2.3.4.726</version>
        </dependency>
        <!--Mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.27</version>
        </dependency>
    </dependencies>

</project>

说明:

如果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: 需要联网的,不建议使用

 

 2.SqlMapConfig.xml总配置文件:(1.加载属性文件 2.配置数据源 3.确定事务 4.关联实体映射文件)

<?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>

    <!-- 引用数据库链接的配置文件 -->
    <properties resource="mysql.properties"/>

    <!-- 使用JDBC事务管理 -->
    <transactionManager type="JDBC">

        <!-- 数据源 -->
        <dataSource type="SIMPLE">
            <property name="JDBC.Driver" value="${driver}"/>
            <property name="JDBC.ConnectionURL" value="${url}"/>
            <property name="JDBC.Username" value="${root}"/>
            <property name="JDBC.Password" value="${password}"/>
        </dataSource>

    </transactionManager>

    <!-- 实体类映射文件 -->
    <sqlMap resource="Student.xml"/>

</sqlMapConfig>
  

3.jdbc.properties属性文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/ibatis?useUnicode=true&amp;characterEncoding=UTF-8
username=root
password=111111

4.Student.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 alias="Student" type="com.zyzy.ibatis.entity.Student"/>

    <!--查询-->
    <select id="findAll" resultClass="Student">
        select * from student
    </select>
    <select id="findById" resultClass="Student">
        select * from student where id=#id#
    </select>
    <select id="findByName" resultClass="Student">
        select * from student where name like '%$name$%'
    </select>

    <!--添加-->
    <insert id="addStudent" parameterClass="Student">
        insert into student values(#id#,#name#,#age#)
        <selectKey keyProperty="id" resultClass="int">
            select @@identity as id
        </selectKey>
    </insert>
    <!-- 这里需要说明一下不同的数据库主键的生成,对各自的数据库有不同的方式: -->
    <!-- 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之前 -->   

    <!--更新-->
    <update id="updateStudent" parameterClass="Student">
        update student set name=#name#,age=#age# where id=#id#
    </update>

    <!--删除-->
    <delete id="deleteById" parameterClass="int">
        delete from student where id=#id#
    </delete>

</sqlMap>
 

5.Student实体类

public class Student {
//注意这里需要保证有一个无参构造方法,因为包括Hibernate在内的映射都是使用反射的,
// 如果没有无参构造可能会出现问题
    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

6.IbatisUtil工具类

public class IbatisUtil {
    private static SqlMapClient client = null;
    static{
        try {
            Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
            client = SqlMapClientBuilder.buildSqlMapClient(reader);
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SqlMapClient getClient() {
        return client;
    }
}

7.IStudentDao接口

public interface IStudentDao {
    List<Student> findAll();                //查找全部
    Student findById(int id);               //通过id查找
    List<Student> findByName(String name);  //通过name模糊查询
    void addStudent(Student student);       //增加
    void updateStudent(Student student);    //修改
    void deleteById(int id);             //删除
}

8.StudentDaoImpl数据库持久层实现类

public class StudentDaoImpl implements IStudentDao {

    private static SqlMapClient client = IbatisUtil.getClient();

    /**
     * 查找全部
     * @return 返回Student集合
     */
    @Override
    public List<Student> findAll() {
        try {
            return client.queryForList("findAll");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 通过ID查找单个
     * @param id
     * @return 返回单个Student
     */
    @Override
    public Student findById(int id) {
        try {
            return (Student) client.queryForObject("findById",id);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 通过name模糊查询
     * @param name
     * @return 返回Student集合
     */
    @Override
    public List<Student> findByName(String name) {
        try {
            return client.queryForList("findByName",name);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 插入一个Student
     * @param student
     */
    @Override
    public void addStudent(Student student) {
        try {
            client.insert("addStudent",student);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 更新Student
     * @param student
     */
    @Override
    public void updateStudent(Student student) {
        try {
            client.update("updateStudent",student);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 删除指定的Student
     * @param id
     */
    @Override
    public void deleteById(int id) {
        try {
            client.delete("deleteById",id);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

}

9.StudentService业务类

public class StudentService {
    public static void main(String[] args) {
        IStudentDao dao = new StudentDaoImpl();
        List<Student> students = null;
        students = dao.findAll();
        System.out.println(students);
//		dao.deleteById(8);
    }
}

 

猜你喜欢

转载自zyjustin9.iteye.com/blog/2029374