Mybatis框架的使用


  • 定义

开源的持久层框架,底层仍然是jdbc
jdbc        优点:速度最快  缺点:繁琐
hibernate   优点:不用写sql,代码简洁  
            缺点:速度慢,需要优化繁杂的sql
mybatis     优点:代码简洁,易掌握 性能速中 需要写sql
  1. 步骤

step1.导包。 mybatis,ojdbc
step2 添加配置文件
step3 实体类
注: 属性必须和表中字段一致,不一致需要额外配置
step4 添加映射文件
主要是sql语句
step5 调用mybatis提供的api访问数据库
注:SqlSession提供的方法

基本原理

这里写图片描述

查询时
  1. 返回map类型的结果
  2. mybatis会将查询结果分两步处理:
    step1. 将记录中的数据添加到一个对应的Map对象里面
    (以字段名作为key,以字段值作为value)。
    step2. 再将Map对象中的数据添加到对应的实体对象里面。

    这里写图片描述

解决字段名与实体类属性名不一致的情况
方式一  使用别名,比如

SELECT id empId,name ename……

方式二  使用resultMap。
<!-- 解决实体类和数据库表的字段的名称不一致的情况 -->
    <select id = "findAll2" resultMap="bookResultMap">
        SELECT * FROM books

    </select>
    <!-- 对实体类和表的字段不一致的进行设置,字段一致的不需要设置 -->
    <resultMap type = "entity.Book" id = "bookResultMap">
        <result property = "bId" column="id"/>
    </resultMap>

这里写图片描述

Mapper映射器
定义: 符合映射文件要求的接口
要求如下

方法名要与 sqlId 一致
方法的返回值要与resultType一致
方法的参数类型要与parameterType一致。
映射文件的namespace必须等于接口的完整的名字

mybatis会生成符合该接口(mapper映射器)要求的对象。

如何使用mapper映射器?
step1.按照要求写好接口。
step2.调用SqlSession提供的getMapper方法来获得接口实现。

测试代码
public class Test1 {

    private SqlSession session;
    @Before
    public void init() {

        String config = "SqlMapConfig.xml";
        SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
        SqlSessionFactory ssf = ssfb.build(Test.class.getClassLoader().getResourceAsStream(config));

        session = ssf.openSession();
    }

    @Test
    public void t8() {

        BookDao dao = session.getMapper(BookDao.class);
        Book b = new Book();
        b.setbId(12);
        b.setName("葵花宝典");
        b.setNum(50);
        b.setInfor("欲练此功,必先自宫");
        dao.updateById(b);
        session.commit();
        session.close();

    }
定义的Mapper接口
public interface BookDao {

    /**
     *  增,删,改,查
     */

    public List<Book> findAll2();

    public void save(Book b);

    public void deleteByName(String name);

    public void updateById(Book b);


}
mybatis配置文件 (sqlMapconfig.xml)
<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN" 
    "http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
    <environments default="environment">
        <environment id="environment">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" 
                value="oracle.jdbc.driver.OracleDriver" />
                <property name="url"
                    value="jdbc:oracle:thin:@localhost:1521:orcl" />
                <property name="username" value="scott" />
                <property name="password" value="tiger" />
            </dataSource>
        </environment>
    </environments>
    <!-- 指定映射文件的位置 -->
    <mappers>
        <mapper resource="entity/BookMapper.xml" />
    </mappers>
</configuration> 
配置文件中(bookMapper.xml)
<mapper namespace="dao.BookDao">

    <select id = "findAll" resultType = "entity.Book">
        SELECT * FROM books     
    </select>
    <!-- 解决实体类和数据库表的字段的名称不一致的情况 -->
    <select id = "findAll2" resultMap="bookResultMap">
        SELECT * FROM books

    </select>
    <!-- 对实体类和表的字段不一致的进行设置,字段一致的不需要设置 -->
    <resultMap type = "entity.Book" id = "bookResultMap">
        <result property = "bId" column="id"/>
    </resultMap>
    <!-- 增加 --> 
    <insert id = "save" parameterType ="entity.Book">
        INSERT INTO books(id,name,num,infor) VALUES(book_seq.nextval,#{name},#{num},#{infor})
    </insert>

    <delete id = "deleteByName" parameterType="string">
        DELETE FROM books WHERE name = #{n} 

    </delete>

    <update id = "updateById" parameterType="entity.Book">
        UPDATE books SET name = #{name},num = #{num},infor=#{infor}
        WHERE id = #{bId}

    </update>


</mapper>

总结: 在 sqlMapconfig.xml 指定 bookMapper.xml文件的位置。
在调用 SqlSession 提供的api进行相应的数据库操作
一般情况下,一张表,对应一个实体类,并为这个实体类配置一个xxx.xml文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值