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>

  • 相关阅读:
    数据库Connection.OPEN()异常情况下 耗时很久才回应
    System.Threading.Tasks.TaskExceptionHolder.Finalize() 系统错误c#
    WCF双向通讯netTCP
    并行LINQ PLinq
    winform调用http
    kindle电子书的资源网站
    vscode设置中文语言
    Python拼接路径
    Python查看已安装模块
    Python查看模块版本
  • 原文地址:https://www.cnblogs.com/DFX339/p/8535232.html
Copyright © 2011-2022 走看看