框架专题 Mybatis基于Java的持久层框架,介绍及使用总结

Mybatis

介绍
在这里插入图片描述

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)

作用
Mybatis 可以帮你整合service的数据

执行流程
在这里插入图片描述

环境搭建

如果使用jar包
1.导入
在这里插入图片描述
2.创建mybatis-conf.xml(SSM形式,是springBoot则可以忽略)

<?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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/day01?characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--指向mapper配置文件-->
        <mapper resource="com/ujiuye/mapper/PersonMapper.xml"></mapper>
    </mappers>
</configuration>

3.创建dao接口

public interface PersonDao {
    /**添加
     * @param p
     * @return
     */
    int add(PersonBean p);

    /**根据主键删除
     * @param pid
     * @return
     */
    int del(int pid);

    /**修改
     * @param p
     * @return
     */
    int update(PersonBean p);

    /**查询所有
     * @return
     */
    List<PersonBean>  getAll();
}

4.书写dao接口的mapper文件
代码置于resource文件夹下,可单独创建一个文件夹放置

在Mapper文件中 开头的mapper标签中的nameSpace指向该Mapper文件对应的DAO接口文件的路径

<?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="com.ujiuye.dao.PersonDao">
<!--添加  id对应的dao中的方法名,parameterType对应的是参数类型-->
<insert id="add" parameterType="com.ujiuye.bean.PersonBean">
    insert person (pname,address) values(#{pname},#{address})
</insert>
    <!--删除-->
    <delete id="del" parameterType="int">
        delete  from person where pid=#{0}
    </delete>
    <!--修改-->
    <update id="update" parameterType="com.ujiuye.bean.PersonBean">
        update person set pname = #{pname} ,address=#{address} where  pid=#{pid}
    </update>
    <select id="getAll" resultType="com.ujiuye.bean.PersonBean">
        select * from person;
    </select>
</mapper>

5.测试

 @Test
    public void test1() throws IOException {
        //读取mybatis的配置文件
        InputStream is=Resources.getResourceAsStream("mybatis-conf.xml");
        //创建SqlSessionFactory
        SqlSessionFactory  ssf=new SqlSessionFactoryBuilder().build(is);

        //创建sqlsession
        SqlSession session=ssf.openSession();
        //获取接口实例
        PersonDao mapper = session.getMapper(PersonDao.class);
        PersonBean p=new PersonBean(0,"李留","中州");
        //添加
        //int i=mapper.add(p);
        //删除
        //int i=mapper.del(3);
        //修改
//        int i=mapper.update(new PersonBean(4,"zhangsan","驻马店"));
//        System.out.println("影响了"+i);
        //查询
        List<PersonBean> list = mapper.getAll();
        System.out.print(list);
        session.commit();//。需要手动提交修改数据库
        session.close();
    }

多个参数传递问题

1.如果传递的是对象

int add(PersonBean p);

Mapper中

 <!--修改-->
    <update id="update" parameterType="com.ujiuye.bean.PersonBean">
        update person set pname = #{pname} ,address=#{address} where  pid=#{pid}
</update>

2.使用map传参

 List<PersonBean> getByCondition1(Map map);

Mapper

<select id="getByCondition1" parameterType="java.util.Map" resultType="com.ujiuye.bean.PersonBean">
        select  * from person where pname=#{name} and address=#{address}
    </select>

3.根据方法中参数列表的索引值

List<PersonBean> getByCondition2(String name,String address);

Mapper

<select id="getByCondition2" resultType="com.ujiuye.bean.PersonBean">
        select *from person where pname=#{0} and address=#{1}
    </select>

4.给参数起别名

 List<PersonBean> getByCondition3(@Param("pn") String name, @Param("ad") String address);

Mapper

<select id="getByCondition3" resultType="com.ujiuye.bean.PersonBean">
        select *from person where pname=#{pn} and address=#{ad}
    </select>

Mybatis返回主键

<insert id="add" parameterType="person">
    /*插入数据获取自动增长的主键
    keyProperty  对象的字段名
    keyColumn    表中的字段名
    resultType    返回值类型
    order       插入之后获取主键
    */
    <selectKey keyProperty="id" keyColumn="pid" resultType="int" order="AFTER">
        select  last_insert_id();
    </selectKey>
    insert person (pname,address) values(#{pname},#{address})
</insert> 

Sql片段

在mapper中可能sql中有一些重复的片段,将公共的sql片段独立出来,直接调用

 <sql id="se">
        select *from person   <!--公共片段-->
    </sql>

用法
<include refid=”se”/>

自定义的结果类型

resultMap
当实体类与表中的列名不对应,需要自定义一个结果类型

在这里插入图片描述

typeAliases别名

放在mybatis配置文件的第一位
注意:只能有一个 标签

<!--给类名起别名-->
    <typeAliases>
        <typeAlias type="com.ujiuye.bean.PersonBean" alias="person"/>
        <typeAlias type="com.ujiuye.bean.PeopleBean" alias="people"/>
</typeAliases>

在mapper中直接使用别名

在这里插入图片描述

${}和#{}的区别

$ sql语句的字符串拼接,不取参数的值 拼接sql
造成sql注入攻击

#直接去参数的值 prepareStatement 避免sql注入攻击

在这里插入图片描述

总结

Mybatis的环境搭建
1.导包
2.Mybatis-conf.xml整体的环境配置
Mysql
读取的mapper文件
别名的使用
3.测试
1>读取配置文件
2>SqlsessionFactory
3>获取sqlsession
4>Session.getMapper(**Dao.class)
5>执行接口方法

参数传递
1.如果方法中只有一个参数#{任意的字符串}或者#{0}
2.多个参数
#{参数列表的索引}
传对象
#{对象属性名}
传map
#{map中的key}
别名@Param(“参数别名”)

返回主键

Sql片段

表中的字段名和对象的属性名不一致
ResultMap
对象别名
#, $

更多内容可以直接查看Mybatis官方提供的帮助文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值