zoukankan      html  css  js  c++  java
  • iBatis基础知识

    iBatis简介:

    特点:结构性好,小巧,容易上手

    搭建环境:

    1、创建java 项目

    2、导入(3个)jar包:ibatis-2.3.0.667.jar,mysql驱动包,Junit测试包

    3、配置iBatis的主配置文件 SqlMapConfig.xml

    配置由jdbc管理事务

    配置数据源 SIMPLE

    配置编写sql语句的xml文件  <sqlMap resource=”cn/Stu.xml”/>

    4、编写Jdbc 连接的属性文件  SqlMap.properties

    5、编写每个实体的映射文件(Map 文件)----里面定义和方法对应的sql语句

    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>

    <!-- 引用JDBC属性的配置文件-->

    <properties resource="com/iflytek/entity/SqlMap.properties" /> 

    <!-- 使用JDBC的事务管理 -->

    <transactionManager type="JDBC">

    <!-- 数据源 -->

    <dataSource type="SIMPLE">

    <!-- <property name="JDBC.Driver" value="${driver}" />  -->

      <property value="com.mysql.jdbc.Driver" name="JDBC.Driver" />

    <property name="JDBC.ConnectionURL"    value="jdbc:mysql://localhost:

    3306/ibatisstudent" />

    <property name="JDBC.Username" value="root" />

    <property name="JDBC.Password" value="mysql" />

    </dataSource>

    </transactionManager>

    <!-- 这里可以写多个实体的映射文件 -->

    <sqlMap resource="com/iflytek/entity/Student.xml" />

    </sqlMapConfig>

    iBatis必须要有持久层,在持久层读取主配置文件,生成sqlMapClient对象,完成对数据库的增删改查操作。

     

    iBatis插入字段或者给字段赋值,使用: #字段名#  eg:  #id# 

    Date日期类型自动赋值: Date.valueOf(“2017-09-09”)

     

    iBatis的增删改查

    private static SqlMapClient sqlMapClient = null;

    // 在静态代码块读取配置文件,生成SqlMapClient 对象

    static {   try {

    Reader reader = Resources.getResourceAsReader

    ("com/iflytek/entity/SqlMapConfig.xml");

    sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);

    reader.close();

    } catch (IOException e) {

    e.printStackTrace();

    }

    }

    增加数据到数据库中:

    //持久层的代码

    public boolean addStudent(Student student) {

    Object object = null;

    boolean flag = false;

    try {     //addStudent:指xml文件中<insert>标签的id标识

    student:是指<insert>标签的parameterClass类型的变量

    object = sqlMapClient.insert("addStudent", student);

    System.out.println("添加学生信息的返回值:" + object);

    } catch (SQLException e) {

    e.printStackTrace();

    }

    在xml中的配置:(主键数据库自动生成)

    <insert id="addStudent" parameterClass="Student">

    insert into t_student(name,birth,score)

    values (#name#,#birth#,#score#);

    //<selectKey>标签用于查询出从数据库中自动生成的主键id字段

    <!-- 这里需要说明一下不同的数据库主键的生成,对各自的数据库有不同的方式: -->

    <!-- 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 resultClass="int" keyProperty="id">

                 select @@identity as value

    </selectKey>

    </insert>

    删除数据库中的某条记录

    //持久层的代码

    public boolean deleteStudentById(int id) {

    boolean flag = false;

    Object object = null;

    try { //deleteStudentById:指xml文件中<delete>标签的id标识

    id:是指<delete>标签的parameterClass类型的变量

    object = sqlMapClient.delete("deleteStudentById", id);

    System.out.println("删除学生信息的返回值:" + object + ",这里返回的是影响的行数");

    } catch (SQLException e) {

    e.printStackTrace();

    }

    }

    在xml中的配置:

    <delete id="deleteStudentById" parameterClass="int"> 

    delete  from  t_student where id=#id#

    </delete>

     修改数据库表中的记录:

    //持久层的代码

    public boolean updateStudent(Student student) {

    boolean flag = false;

    Object object = false;

    try { //updateStudent:指xml文件中<update>标签的id标识

    student:是指<update>标签的parameterClass类型的变量

    object = sqlMapClient.update("updateStudent", student);

    System.out.println("更新学生信息的返回值:" + object + ",返回影响的行数");

    } catch (SQLException e) {

    e.printStackTrace();

    }

    在xml文件中的配置信息:

    <update id="updateStudent" parameterClass="Student">

    update  t_student set name=#name#, birth=#birth#,

    score=#score#  where id=#id#

    </update>

    根据id查询数据库中的记录:

    持久层的代码:

    public Student selectStudentById(int id) {

    Student student = null;

    try { //selectStudentById:指xml文件中<select>标签的id标识

    id:是指<select>标签的parameterClass类型的变量

    Student :指<select>标签中的resultClass类型的变量

    student = (Student) sqlMapClient.queryForObject(

    "selectStudentById", id);

    } catch (SQLException e) {

    e.printStackTrace();

    }

    Xml文件中的配置:

    <select id="selectStudentById" parameterClass="int" resultClass=                           "Student">

    select * from  t_student where id=#id#

    </select>

    查询出数据库中所有的Student对象:

    持久层的代码:

    public List<Student> selectAllStudent() {

    List<Student> students = null;

    try { //selectAllStudent:指xml文件中<select>标签的id标识

     List<Student>:指<select>标签中的resultClass类型的变量

    students = sqlMapClient.queryForList("selectAllStudent");

    } catch (SQLException e) {

    e.printStackTrace();

    }

    return students;

    }

    Xml的配置文件:

    <!-- id表示select里的sql语句,resultClass表示返回结果的类型

    每查到一条记录就生成Student对象,放到list集合中

    然后将list集合返回到持久层的集合中

     -->

    <select id="selectAllStudent" resultClass="Student">

    select * from t_student

    </select>

    iBatis的关联映射Many-to-one

    存储关系:

    手动建表,建立many-to-one的映射关系

    存储Group对象(属性:idname

    调用持久层对象的存储方法 addGroup(group)存储Group对象

    持久层对象: 一加载持久层类,读取SqlMapConfig.xml文件信息,用来生成sqlMapClient对象,用来完成对数据库的操作

    执行addGroup方法

    sqlMapClient.insert(“addGroup”,group);

    addGroup:是sql语句映射的id

    group:是sql语句的映射的parameterClass

    存储User对象(属性:id ,name,group

    执行addUser方法

    sqlMapClient.insert(“addUser”,user);

    addUser:是sql语句映射的id

    user:是sql语句的映射的parameterClass

    xml文件中的sql语句的配置:

    <insert id=”addUser”parameterClass=”User”>

    insert into t_user(name,groupid) values(#name#,#group.id#)

    //表示当前User对象在数据库中的记录为id自动生成,取得数据库中的记录

    <selectKey resultClass="int" keyProperty="id">

     select @@identity as value

    </selectKey>

    </insert>

    加载关系:

    sqlMapClient.queryForList("selectUserById",id); //查找User对象

    <select id=”selectUserById” parameterClass=”int” resultMap=”tem”>

    Select * from t_user where id=#id#

    </select>

    <resultMap id=”tem” resultClass=”User”>

    Property :当前User对象的属性名

    Column:存储在t_user表中的字段名

    jdbcType:存储在数据库中的字段类型

    <result column=”id” property=”id” jdbcType=”int”> </result>

    <result column=”name” property=”name” jdbcType=”varchar”/>

    Select:表示再次调用selectGroupById这个方法,通过外键groupid,外找主,找到groupid对应的记录,生成group对象,放到group属性上

    <result property=”group” column=”groupid”                            select=”selectGroupById”> </result>

    </result>

    </resultMap>

    iBatis的关联映射one-to-one

    存储关系:

    存储IdCard对象,主键id自动生成

    创建Idcard对象,id自动生成

    调用持久层对象的方法,addIdCard方法

    持久层:sqlMapClient.insert(“addIdCard”,idcard);

    Xml中:<insert id=”addIdCard” parameterClass=”IdCard”>

    insert into t_idcard(idNum) values(#idNum#)

    //取出数据库中自动生成的id,用于给person对象的id赋值

    <selectKey resultClass="int" keyProperty="id">

     select @@identity as value

    </selectKey>

    </insert>

    存储Person对象,person对象的主键引用idCard的主键

    创建Person对象,id去IDcard对象的id

    调用持久层对象的方法,addPerson方法

    持久层:sqlMapClient.insert(“addPerson”,person);

    Xml中:<insert id=”addPerson” parameterClass=”person”>

    insert into t_person(id,name) values(#idCard.id#,#name#)

    </insert>

    加载关系:

    sqlMapClient.queryForObject("selectPersonById",id); //查找User对象

    <select id=”selectPersonById” parameterClass=”int” resultMap=”tem”>

    Select * from t_person  where id=#id#

    </select>

    <resultMap id=”tem” resultClass=”Person”>

    Property :当前User对象的属性名

    Column:存储在t_user表中的字段名

    jdbcType:存储在数据库中的字段类型

    <result column=”id” property=”id” jdbcType=”int”> </result>

    <result column=”name” property=”name” jdbcType=”varchar”/>

    Select:表示再次调用selectIdCardById这个方法,通过主找主,根据id找到t_idCard表中对应的记录,生成IdCard对象,放到idCard属性上

    <result property=”idCard” column=”id”                        select=”selectIdCardById”> </result>

    </result>

    </resultMap>

    iBatis的关联映射many-to-many

    存储关系:

    User (属性:id,name ,roles)

    Role(属性:id,name)

    存储Role对象,主键id自动生成

    创建Role对象,id自动生成

    调用持久层对象的方法,addRole方法

    持久层:sqlMapClient.insert(“addRole”,role);

    Xml中:<insert id=”addRole” parameterClass=”Role”>

    insert into t_Role(name) values(#name#)

    //取出数据库中自动生成的id,用于给第三张表的roleid赋值

    <selectKey resultClass="int" keyProperty="id">

     select @@identity as value

    </selectKey>

    </insert>

    存储User对象,主键id自动生成

    创建User对象,id自动生成

    调用持久层对象的方法,addUser方法

    持久层:sqlMapClient.insert(“addUser”,role);

    Xml中:<insert id=”addUser” parameterClass=”User”>

    insert into t_User(name,role) values(#name#,)

    //取出数据库中自动生成的id,用于给第三张表的userid赋值

    <selectKey resultClass="int" keyProperty="id">

     select @@identity as value

    </selectKey>

    </insert>

    存储UserRole对象

    加载关系:

    查询user用户的id为29的role角色

    先查询User对象,

    调用sqlMapClient. queryForObject(“selectUserById”,id)

    生成User对象, User对象的roles属性需要再次查询;

    通过user找到role,需要三张表连接查询,拿到的字段再次将结果封装 ,然后生成role对象,添加到集合中

    <resultMap id="CourseTest" class="Course" >

        <result column="id" property="id" jdbcType="int" />

        <result column="name" property="name" jdbcType="VARCHAR" />

        <result property="studentList" column="id" select="getStudentByCourseStudentId"/> 

      </resultMap>

     <select id="selectCourseById" parameterClass="int" resultMap="CourseTest">

      select * from  t_course where id=#id#

     </select>

      <select id="getStudentByCourseStudentId" resultMap="getStudentResult"

     parameterClass="int">

     Select t_student.id,t_student.birth,t_student.name ,t_student.score,

    t_student.classid FROM t_student , t_course_student  WHERE t_course_student.courseid           = #id# AND  t_course_student.studentid= t_student.id

     </select>

  • 相关阅读:
    yocto/bitbake 学习资源
    QEMU/KVM学习资源
    ubuntu 中创建和删除用户
    git 重命名本地和远程分支
    Ubuntu 上搭建 FTP 服务器
    gdb 常见用法
    git log 显示与特定文件相关的 commit 信息
    基于 qemu system mode 运行 arm 程序
    基于 qemu user mode 运行 aarch64 程序
    checking in(airport)
  • 原文地址:https://www.cnblogs.com/DFX339/p/8535232.html
Copyright © 2011-2022 走看看