mybatis

1.框架

框架是一个半成品,已经对基础的代码进行了封装并提供相应的API,开发者在使用框架是直接调用封装好的api可以省去很多代码编写,从而提高工作效率和开发速度

2.mybatis框架

是一个持久层框架,和数据库打交道的一个框架,它对jdbc的操作数据库的过程进行了封装,是开发者是要关注sql语句,而不用话费太多时间去注册驱动,关闭资源等等。

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。

3.mybatis入门程序

  1. 引入jar包(mybatis,驱动包)

  2. 配置mybatis的配置文件(SqlMapConfig.xml)

    配置数据源,事务   (xml文件)

<?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="dd">
        <environment id="dd">
            <!--事务:使用jdbc事务-->
            <transactionManager type="JDBC"/>
            <!--数据库连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
                <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/>
                <property name="username" value="scott"/>
                <property name="password" value="scott"/>
            </dataSource>
        </environment>
    </environments>
    <!--加载映射文件-->
    <mappers>
        <mapper resource="Goods.xml"/>
    </mappers>
</configuration>

  3.创建实体类(类中的属性和数据库表字段名一样)  (java类)

public class Goods {
    private Integer gid;
    private String gname;
    private double gprice;  //BigDecimal
    private GoodsType goodsType;
    //setter 和 getter
}

  4.配置映射文件(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">

<!--namespace  命名空间-->
<!--
parameterType  参数类型
resultType   结果类型 如果结果类型是一个类,
查询的结果会自动设置到类实例的属性中
-->
<mapper namespace="test">
    <select id="findOneById" parameterType="int" resultType="com.sc.pojo.Goods">
      select * from goods where gid = #{gid}
    </select>
</mapper>
  1. 编程测试  (java类)
import com.sc.pojo.Goods;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.Reader;

public class Test {
   public static void main(String[] args) throws  Exception {
       //1.读取配置文件
       Reader reader
               = Resources.getResourceAsReader("SqlMapConfig.xml");
       //2.创建会话工厂,用来创建sqlSession
       SqlSessionFactory sqlSessionFactory
               = new SqlSessionFactoryBuilder().build(reader);
       //3.创建sqlSession,用来操作数据库
       SqlSession sqlSession
               = sqlSessionFactory.openSession();
       //4.执行sql
       //namespace.id
       Goods goods =
               sqlSession.selectOne("test.findOneById",10);
       System.out.println(goods.getGname());
       //5.关闭资源
       sqlSession.close();
   }
}

4.#{}和${}的使用

#{}表示一个占位符号,相当于预编译对象的? ,通过#{}可以实现preparedStatement向占位符中设置值,#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。如果parameterType 是pojo,#{}括号中是类的属性名称。

${}表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。

 

5.查询   (mapper.xml文件)

<select id="findOneById" parameterType="int" resultType="com.sc.pojo.Goods">
      select * from goods where gid = #{gid}
    </select>

6.删除   (mapper.xml文件) 

<delete id="deleById" parameterType="int">
      delete from GOODS where GID = #{value}
</delete>

7.修改  (java文件)

GoodsType goodsType = new GoodsType(2,"");
Goods goods = new Goods(12,"葡萄",100,goodsType);
int row = sqlSession.update("test.updateGoods",goods)

(mapper.xml文件)

<update id="updateGoods" parameterType="com.sc.pojo.Goods">
        update GOODS set gname=#{gname},gprice=#{gprice} 
        where GID=#{gid}
</update>

8.添加   (java文件)

GoodsType goodsType = new GoodsType(2,"");
Goods goods = new Goods(12,"葡萄",100,goodsType);

(mapper.xml文件)

<insert id="saveGoods" parameterType="com.sc.pojo.Goods">
        insert into GOODS values
        (SEQ_GOOD.nextval,#{gname},#{gprice},#{goodsType.tid})
</insert>

9.resultMap

 一对一查询

​     方式一:使用 association (单条记录)

​     方式二:定义一个扩展类 ,类中定义属性,属性和查询出来的表字段对应

   一对多查询

    resultMap :用来解决表字段和类属性名不一致的情况

​     如果类中有对象类型的属性,用到association标签 javaType.

​     如果类中有List 类型的属性,用到collection标签

 

posted @ 2019-09-05 19:44  changlinlo  阅读(205)  评论(0编辑  收藏  举报