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>

猜你喜欢

转载自www.cnblogs.com/java888/p/10744702.html