第一天 Mybatis (上)

Mybatis 概述

1.MyBatis 本是 apache(tomcat) 的一个开源项目 iBatis,实质上 Mybatis 是对 ibatis 进行一些了改进。
2.MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。
3.Mybatis是一个orm框架(Object relation Mapping),持久层技术,支持动态sql调用,存储过程调用(数据库编程 for if in out),sql和java代码显示分离。(高内聚 低耦合)提高程序的扩展性和维护性。

Mybatis 环境搭建

1.引入当前框架的主体结构(***.jar)

1.mybatis.jar: mybatis 的核心包

2.mysql.jar: 驱动包

在这里插入图片描述

3.mydatis相关的依赖包

在这里插入图片描述

2: mybatis-config.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="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/1028db?useUnicode=true&amp;characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
     <!--  加载映射文件  -->
    <mappers>
        <mapper resource="com/ujiuye/mybatis/mapper/PersonMapper.xml"/>
    </mappers>
</configuration>

3.日志log4j.properties

log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

4.配置mapper.xml

public interface PersonMapper {
    int save(Person person);
    int update(Person person);
    int remove(int id);
}

5.定义一个和接口名称相同的配置文件***Mapper.xml

<?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.mybatis.mapper.PersonMapper">

   <!--执行单元  parameterType:参数类型 resultType="int":返回值类型 -->
    <insert id="save" parameterType="com.ujiuye.mybatis.pojo.Person">
        INSERT INTO `person`(`id`, `name`, `bir`, `address`)
        VALUES (#{id},#{name},#{bir},#{address});
    </insert>
</mapper>

mybatis的执行流程

在这里插入图片描述

@Test
    public void selectAll(){
        try {
            //定义配置文件路径
            String fileName = "mybatis-config.xml";
            //通过配置文件创建输入流对象
            InputStream inputStream = Resources.getResourceAsStream(fileName);
            //读取配置文件 实例化工厂
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
            //获取Session 对象
            SqlSession session = factory.openSession();
            //通过反射获取接口对象
            StudentMapper mapper = session.getMapper(StudentMapper.class);
            //调用接口的方法
            List<Student> list = mapper.selectAll();
            //进行遍历
            for (Student s:list){
                System.out.println(s);
            }
            session.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

多个参数传递的问题

1: @Param (“名称”) 就是在我们sql语句中使用的变量名(推荐)
#{名称}
2: 使用map集合的传参
#{key}
3: 使用参数的下标
#{arg0}:下标从0开始
#{param1} 下标从1开始

//@Param(“名称”) 就是在我们sql语句中使用的变量名
int saveByParam(@Param("id") int id, @Param("name") String name,@Param("bir") Date bir, @Param("address") String address);
//使用map集合的传参   key-value     执行单元#{key名称}
int saveByMap(Map<String,Object> map);
//使用参数的下标
int saveByIndex(int id,String name,Date bir,String address);

<!-- 通过参数下标 @Param(“名称”)属性不需要设置 #{名称}   推荐-->
  <insert id="saveByParam" parameterType="com.ujiuye.mybatis.pojo.Person">
    INSERT INTO `person`(`id`, `name`, `bir`, `address`)
    VALUES (#{id},#{name},#{bir},#{address});
</insert>
<!--  #{key名称}  -->
<insert id="saveByMap" parameterType="java.util.Map">
    INSERT INTO `person`(`id`, `name`, `bir`, `address`)
    VALUES (#{id},#{name},#{bir},#{address});
</insert>

<insert id="saveByIndex" parameterType="java.util.Map">
    INSERT INTO `person`(`id`, `name`, `bir`, `address`)
    VALUES (#{param1},#{param2},#{param3},#{param4});
</insert>

主键值

keyProperty: 类中的主键字段匹配的属性
keyColumn: 表中的那个字段是主键字段
order: BEFORE(先获取主键然后再插入数据) AFTER(先插入数据,在获取主键)
resultType: 主键的类型是什么

<insert id="save" parameterType="com.ujiuye.mybatis.pojo.Person">
    <selectKey keyProperty="id" keyColumn="id" order="AFTER" resultType="int">
        select LAST_INSERT_ID();
    </selectKey>
    INSERT INTO `person`(`id`, `name`, `bir`, `address`)
    VALUES (#{id},#{name},#{bir},#{address});
</insert>

查询操作

//单个对象查询
Person getById(int id);
//查集合
List<Person> list();
//查数值
int count();

<!-- resultType  指的是返回值类型
   要求:实体中的属性名要与表的中字段名要一致
      确保返回的结果<=1-->
<select id="getById" resultType="com.ujiuye.mybatis.pojo.Person" parameterType="int">
    SELECT * FROM `person` WHERE `id`=#{id}
</select>

<select id="list" resultType="com.ujiuye.mybatis.pojo.Person" >
    SELECT * FROM `person`
</select>

<select id="count" resultType="int" >
    SELECT COUNT(*) FROM `person`
</select>

增删改操作

 //新增学员信息
    int save(Student student);
    //通过id删除学员信息
    int deleteById(int id);
    //通过id修改学员信息
    int updateById(Student student);
<!-- 新增学员信息 -->
    <insert id="save" parameterType="com.ujiuye.mybatis.pojo.Student">
        insert into student(id,name,sex,age,address,tel,email)
        values (#{id},#{name},#{sex},#{age},#{address},#{tel},#{email});
    </insert>
    <!-- 通过id删除学员信息 -->
    <delete id="deleteById" parameterType="com.ujiuye.mybatis.pojo.Student">
        delete from student where id = #{id};
    </delete>
    <!-- 通过id修改学员信息 -->
    <update id="updateById" parameterType="com.ujiuye.mybatis.pojo.Student">
        update student set name=#{name},sex=#{sex},age=#{age},address=#{address},tel=#{tel},email=#{email} where id = #{id};
    </update>

Sql片段

针对在mybatis配置文件中重复书写的sql内容,我们可以采用sql片段封装的方式完成,如果在其他的sql中使用,我们只需导入这个公共sql段

Sql片段格式

<sql id="select_user_where">
   <if test="userExt != null">
          <if test="userExt.sex != null and userExt.sex != ''">
             AND sex = #{userExt.sex}
          </if>
          <if test="userExt.username != null and userExt.username != ''">
              AND username LIKE '%${userExt.username}%' 
          </if> 
    </if> 
</sql> 

Sql段的使用

<select id="findUserList" parameterType="person"  resultType="person">
  SELECT * FROM person
  <where>
      <include refid="select_user_where"/>
  </where>
</select>

自定义ResultMap(映射)

resultMap属性
Type: 当前的bean对象类型(数据模型的类型)
Id: 新的类型的标记 标识

resultMap子标签
标签:主键标签,配置的主键的映射关系
resultMap: 普通字段的映射关系

<resultMap type="com.ujiuye.bean.Person" id="newPerson">
      <!-- 主键字段的配置  -->
      <id property="id" column="id"></id>
      <!--  普通字段的配置 -->
      <result property="names" column="name"></result>
      <result property="bir" column="bir"/>                             
 </resultMap>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值