Mybatis动态sql开发之纯xml的简单CRUD实现

本文介绍MyBatis框架的基础使用方法,并通过部门表的例子详细展示了如何进行数据库操作及动态SQL的应用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Mybatis 是一个ORM框架,MyBatis作为持久层框架,其主要思想是将程序中的大量sql语句剥离出来,配置在配置文件中,实现sql的灵活配置。这样做的好处是将sql与程序代码分离,可以在不修改程序代码的情况下,直接在配置文件中修改sql。下面给个简单的入门例子。
Mybatis总配置文件,主要功能,提供连库四个基本信息,加载mapper(映射文件),此处用dept(部门)表:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <typeAliases>
        <!-- 给实体类起一个别名 user -->
        <typeAlias type="com.mybatis.mapper.Dept" alias="dept" />
    </typeAliases>
   <!--  数据源配置  这块用 oracle数据库 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="jdbc" />
            <dataSource type="POOLED">
                <property name="driver" value="oracle.jdbc.OracleDriver" />
                <property name="url" value="jdbc:oracle:thin:@192.168.1.187:1521:xe" />
                <property name="username" value="deng" />
                <property name="password" value="123456" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--userMapper.xml装载进来  同等于把“dao”的实现装载进来 -->
        <mapper resource="dept.xml" />
    </mappers>
</configuration>

dept.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC
        "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dept">
    <!--动态查询sql语句  之if-->
    <select id="if" resultType="dept" parameterType="dept"> 
        select d.deptno,d.dname,d.loc from dept d where 1=1
        <if test="deptno!=0">
            and d.deptno = #{deptno}
        </if>
        <if test="dname!=null">
            and d.dname = #{dname}
        </if>
    </select>
    <!-- 动态查询sql之  choose -->
    <select id = "choose" resultType="dept" parameterType="dept">
        select d.deptno,d.dname,d.loc from dept d where 1=1 
        <choose>
            <when test="loc != null">
                and d.loc = #{loc}
            </when>
            <when test="dname != null">
                and d.dname = #{dname}
            </when>
            <otherwise>
                and d.deptno = 10
            </otherwise>
        </choose>
    </select>

    <!--动态查询sql 之where  -->
    <select id="where" resultType="dept" parameterType="dept">
        select d.deptno,d.dname,d.loc from dept d 
        <where>
            <if test="deptno != 0">
                d.deptno = #{deptno}
            </if>
            <if test="dname != null">
                d.dname = #{dname}
            </if>
            <if test="loc != null">
                d.loc = #{loc}
            </if>
        </where> 
    </select>
    <!-- 动态查询sql 之trim-->
    <select id="trim" resultType="dept" parameterType="dept">
        select d.deptno,d.dname,d.loc from dept d 
        <trim prefix="where" prefixOverrides="and | or">
            <if test="deptno != 0">
                d.deptno = #{deptno}
            </if>
            <if test="dname != null">
                and d.dname = #{dname}
            </if>
            <if test="loc != null">
                or d.loc = #{loc}
            </if>
        </trim>
    </select>
    <insert id="save" parameterType="dept">
        insert into dept(deptno,dname,loc) values(#{deptno},#{dname},#{loc})
    </insert>
    <delete id="delete" parameterType="dept">
        delete from dept where deptno = #{deptno}
    </delete>
    <!--动态更新sql 之set  --ame != null">
                d.dname = #{dname}
            </if>
            <if test="loc != null">
                d.loc #{loc}
            </if>
        </set>
        where d.deptno = #{deptno}
    </update>
</mapper>

java核心代码
package com.mybatis.util;

import java.io.IOException;
import java.io.Reader;

import javax.annotation.Resource;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

/**
* 获得sqlSession缓存封装类
* @author 登祥
*
*/
public class MybatisUtil {
static SqlSession sqlSession = null;
static SqlSessionFactory sqlSessionFactory = null;

/**
 * 获得SqlSession
 * @param resouce 配置文件
 * @return SqlSession
 */
public static SqlSession getSqlSession(String resouce){
    //Reader reader = null;
    try {
        //开始读取
        sqlSessionFactory =  new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(resouce));  
        //获得sqlSession
        sqlSession = sqlSessionFactory.openSession();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return sqlSession;
} 

/**
 * 可追加映射文件
 * @param resource 总配置文件
 * @param clazz 有注解方法的类或接口
 * @return SqlSession
 */
@SuppressWarnings("unchecked")
public static SqlSession getSqlSession(String resource,Class clazz){
    SqlSession sqlSession = null;
    SqlSessionFactory sqlSessionFactory = null;
    try {
        sqlSessionFactory= new SqlSessionFactoryBuilder().build(Resources
                .getResourceAsReader(resource));
        sqlSessionFactory.getConfiguration().addMapper(clazz);
        sqlSession = sql

SessionFactory.openSession();
} catch (IOException e) {
e.printStackTrace();
}
return sqlSession;
}
}

dao层
package com.mybatis.testdemo;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.transaction.Transaction;

import com.mybatis.mapper.Dept;
import com.mybatis.util.MybatisUtil;

public class DeptDao {

private SqlSession sqlSession;

{
    sqlSession  = MybatisUtil.getSqlSession("mybatis_config.xml");
}

/**
 * 条件查询
 * @param sql 
 * @param obj
 * @return List<Dept>
 */
public List<Dept> query(String sql, Dept dept){
    return sqlSession.selectList(sql, dept);
}

/**
 * 保存记录
 * @param sql 
 * @param dept 
 * @return int
 */
public int save(String sql,Dept dept){
    int i = 0;
    try {
        i = sqlSession.insert(sql, dept);
        sqlSession.commit();
    } catch (Exception e) {
        if(null != sqlSession){
            sqlSession.rollback();
        }
    }
    return i;
}

/**
 * 更新记录
 * @param sql
 * @param dept
 * @return int
 */
public int update(String sql,Dept dept){
    return sqlSession.update(sql, dept);
}

/**
 * 删除记录
 * @param sql
 * @param dept
 * @return int
 */
public int delete(String sql,Dept dept){
    return sqlSession.delete(sql, dept);
}

}

测试方法,此处就一个例子,其余都一样。
package com.mybatis.service;

import java.util.List;

import org.apache.ibatis.transaction.Transaction;
import org.junit.Test;

import com.mybatis.mapper.Dept;
import com.mybatis.testdemo.DeptDao;

public class DeptService extends DeptDao{

/**
 * 测试动态sql查询 
 */
@Test
public void testQuery(){
    Dept dept = new Dept();
    //dept.setDname("SALES");
    dept.setDeptno(33);
    //dept.setLoc("12");
    List<Dept> depts = super.query("dept.choose", dept);
    for (Dept dept2 : depts) {
        System.out.println(dept2);
    }
}

/**
 * 测试保存单条记录
 */
@Test
public void testSave(){
    Dept dept = new Dept();
    dept.setDeptno(44);
    dept.setDname("测试");
    dept.setLoc("测试");
    super.save("dept.save", dept);
}

}
完结,对大家有益的话,谢谢点赞!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值