• mybatis基本配置和使用


    附加jar包就不说了 从配置开始 我使用的版本是mybatis3.4.6

    首先在src目录下 新建一个mybatis.xml的配置文件  这是mybatis的核心配置文件

    <?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>
    <package name="包名"/> <!-- 配置这个包下所有的类,别名都是简短类名,这样在映射配置中可以不用写完整类名 直接写简短类名-->
    </typeAliases>
    <!-- 配置类的别名 结束 -->

    <!-- 配置第三方插件 开始(不是必须配置的,没有插件可以不用配置) -->
    <plugins>
    <plugin interceptor="com.github.pagehelper.PageHelper" /><!-- 配置分页插件(这个分页插件不是必须的 只不过可以借助这个插件实现分页查询 比较方便) -->
    </plugins>
    <!-- 配置第三方插件 结束 -->

    <!-- 核心配置  数据源 开始 -->

    <environments default="development">

    <environment id="development">

    <transactionManager type="JDBC" />

    <dataSource type="POOLED">

    <property name="driver" value="连接驱动jar包" />

    <property name="url" value="数据库连接字符串" />

    <property name="username" value="数据库用户名" />

    <property name="password" value="数据库密码" />

    </dataSource>

    </environment>

    </environments>

     <!-- 核心配置  数据源结束 -->

    <!-- 映射文件配置 开始 -->

    <mappers>

    <!-- 单独添加一个映射文件  <mapper resource="从src目录到当前映射的文件的路径"/>   -->

    <package name="包名"/>  <!--  添加一个包的映射文件  如果使用这个方式配置 dao接口的名字必须和映射文件完全同名-->

    </mappers>

    <!-- 映射文件配置  结束-->

    </configuration>

    sql语句映射的文件

    <?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="命名空间名 一般写dao接口的完整名 方便mybatis生成代理类" >

    <!-- 配置结果集映射  有时候连接查询 或者表中列名与类中属性名不一致 mybatis无法自动封装成对象  手动指定对应关系

    在 resultmap标签中 association标签 和 collection标签 可以随意嵌套 -->

    <resultMap id="名字任意 唯一即可 "  type="要生成对象的类名" >

    <id column="表中列名"  property="类中属性名"/> <!-- 配置主键使用这个标签 -->

    <result column="表中列名"  property="类中属性名" /><!-- 配置主键使用这个标签 -->

    <association property="类中对象属性名"  column="表中的列名,该列的值作为调用下一个select语句的参数 不是必须的"  javaType="对象的java类名"
    select="只能引用别的select标签 跨映射文件 使用 命名空间.id 就可以引用 " >

    <!-- 在association标签内 可以直接使用 <id/> 和<result/> 设置对象的属性值,association标签处理属性是对象-->
    </association>

    <collection property="类中集合属性名" column="表中的列名,该列的值作为调用下一个select语句的参数"  ofType="集合中存放的类型的类名"
    select="只能引用别的select标签 跨映射文件 使用 命名空间.id 就可以引用 ">

    <!--在collection标签内 可以直接使用 <id/> 和<result/> 设置集合中对象的值-->

    </collection>

    </resultMap>

    <!-- 查询方法 -->

    <sql id="与接口中查询的方法名一致queryAllUser"   resultType="返回值类型  之前配置了别名之后 这里可以只写简短类名"  

    parameterType="输入参数类型  常用类型mybatis已经配置过别名如String  Integer ,自己定义的类 配置过别名  也可以只写简短类名" 

    resultMap="定义好的resultmap的标签的id值,   如果引用别的映射文件 加上命名空间.id"

    >

    查询语句   #{参数名} ,如果传入的是一个对象 想访问对象的属性值 #{对象名.属性名} 

    ${参数名} 这样传入的参数 不会做为字符解析,会有被sql注入的风险  但是如果是 order by 排序  必须要使用这个传参

    </sql>

    <!-- 添加方法 -->

    <insert id="" parameterType="输入参数类型  常用类型mybatis已经配置过别名如String  Integer ,自己定义的类 配置过别名  也可以只写简短类名"

    如果想将插入信息之后 将主键值返回 可以设置 

    useGeneratedKeys="true",
    keyProperty="对象的主键属性名" keyColumn="主键列名" oracle数据库必须指定
    insert方法的返回值还是受影响的行数,但保存的对象中主键属性已经是返回的主键值

    >

    插入语句

    </insert>

    <!-- 修改方法  -->

    <update>

    输入参数与其他标签一致   自动的返回值是受影响的行数

    </update>

    <! --  删除方法   -->

    <delete>

    输入参数与其他标签一致   自动的返回值是受影响的行数

    </delete>

    一般还会定义一个帮助类 获得mybatis的session对象

    public class MybatisUtil {
        private static SqlSessionFactory sessionFactory;
        static{
            try {
                // 类加载时 实例化 SqlSessionFactory对象
                String resource = "mybatis.xml"; //指定核心配置文件名
                InputStream inputStream = Resources.getResourceAsStream(resource);
                //将配置文件读入输入字节流
                sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//使用SqlSessionFactoryBuilder类的build()方法 传入配置文件字节流 
                                                                                   //返回一个SqlSessionFactory对象实例 赋值给静态成员变量sessionFactory 
                 inputStream.close(); //关闭输入字节流
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
        public static SqlSession getSession(){
            return sessionFactory.openSession();
        }
        private MybatisUtil(){}; //私有构造方法
    }

    这时候 通过MybatisUtil类静态方法getSession()就可以返回Sqlsession类的实例

    测试代码  如下

    public class test{
    
    public static void main(String[] args){
     Sqlsession session=mybatisUtil.getSession();//获得sqlsession实例
     UserDao userdao=session.getMapper(UserDao.class);//通过sqlsession对象生成指定接口的实现类
      userdao.saveUser(new User("张三",18));//执行具体方法
    
    }
    
    
    }

    再补充一下 动态sql

    if标签 : 一般用于判断属性的值是否存在 如果存在 会将标签中的文本追加到sql语句后
    <if test="stuName !=null and stunName !='' "> and stu_name like #{stuName} </if>

    如果if标签中 判断的属性是一个对象,并且想判断这个对象属性的属性不为null,必须先判断这个属性不为null 才能判断这个这个属性的属性

    例子: <if test="student !=null and student.stuName!=null">
    --------------------------------------------------------------------

    choose 标签: 多个条件 只选取其中一个 类似java中的switch
    <choose>
    <when test="表达式" >
    sql语句
    </when>

    <when test="表达式" >
    sql语句
    </when>

    <otherwise> <!-- 所有条件都不满足 默认执行这个 -->
    sql语句
    </otherwise>

    </choose>
    ---------------------------------------------------------------------------------

    where 标签: where元素会判断其包含的if标签是否有值 如果有值 会自动追加where语句 并且会去掉第一个and或者or

    select * from t_student
    <where>
    <if test"stuSex!=null"> and stu_sex=#{stuSex} </if>
    <if test"stuName!=null and stuName!=''"> and stu_name=#{stuName} </if>
    </where>

    -----------------------------------------------------------------------------------

    trim 标签: 可以给sql语句加前缀名和后缀名 并去除指定的字符
    <trim prefix="前缀内容" suffix="后缀内容"
    prefixesToOverride="如果以这个指定的文本开头将被删除 一般写AND|OR 去除多余and和or"
    suffixToOverride="如果以这个指定的文本结尾将被删除 一般写 ,号 用于删除多余的,号"></trim>


    ------------------------------------------------------------
    set 标签: 一般用于处理修改 动态生成要修改的列 判断if里面的值 如果有 会自动加上set 关键字 并且消除多余 ,号
    <set>
    <if test"stuSex!=null"> stu_sex=#{stuSex}, </if>
    <if test"stuName!=null and stuName!=''"> stu_name=#{stuName}, </if>
    </set>
    ------------------------------------------------------------------
    foreach 标签:可以遍历一个集合 可以用在动态删除和动态添加
    <foreach item="代表集合中的每一个元素" index="index" collection="遍历的类型 如果是集合就写list 数组就写array"
    open="以指定文本开头" separator="以指定文本分割每一个元素的值" close="以指定文本结尾">
    </foreach>

  • 相关阅读:
    webpack 压缩js
    系统host文件
    promise
    Cookie与Session
    java普通分页(低级分页)
    容器部署MySQL数据迁移
    每日日报
    每日日报
    每日日报
    每日日报
  • 原文地址:https://www.cnblogs.com/java888/p/10744702.html
Copyright © 2020-2023  润新知