SSM——MyBatis

二.MyBatis框架

1.MyBatis及ORM简介

  • MyBatis是一个优秀的数据持久层框架,在实体类和SQL语句之间建立映射关系,是一种半自动化的ORM实现。其封装性要低于Hibernate,性能优越,并且小巧、简单易学,应用也越来越广泛。
    它内部封装了通过JDBC访问数据库的操作,支持普通的SQL查询、存储过程和高级映射,几乎消除了所有的JDBC代码和参数的手工设置以及结果集的检索
  • 关于ORM(Object Relational Mapping ),你应该知道的:
    (1)对象/关系映射是一种数据持久化技术。它在对象模型和关系型数据库之间建立起对应关系,并且提供了一种机制,通过JavaBean对象去操作数据库表中的数据。
    (2)在开发中,程序员使用面向对象的技术操作数据,而当存储数据时,使用的却是关系数据库,这样造成了很多不便。ORM在对象模型和关系数据库的表之间建立了一座桥梁,有了它,程序员就不需要再使用SQL语句操作数据库中的表,使用API直接操作JavaBean对象就可以实现数据的查询、存储、更改、删除等操作。
    (3)MyBatis通过简单的XML或者注解进行配置和原始映射,在实体类和SQL语句之间建立映射关系,是一种半自动化的ORM实现。
  • MyBatis是ORM的解决方案,下面通过简单的实例体验MyBatis

2.搭建MyBatis环境

  1. 在项目中配置jdbc驱动包
    点击Project Structure按钮,选择左侧modules,选择Dependencies选项卡,点击“+”,选择“Jars or directories”,找到驱动jar包,Apply之后点击Ok

在这里插入图片描述

  1. 使用navicat建立两张表user(name,password)和book(id,name),并插入几条记录作为测试
  • user表
    在这里插入图片描述
  • book表
    在这里插入图片描述
  1. 建立和表对应的pojo类
    建立pojo(plain old java object)包,右击com包 ->new ->Package->pojo
    在pojo下建立两个Java类,即User类、Book类
  • User类
package com.pojo;

public class User {
    //    类型和数据库保持一致,varchar对应String
    private String name;
    private String password;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

  • Book类
package com.pojo;

public class Book {
//    类型和数据库保持一致,varchar对应String
    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

  1. 建立dao层(data access object),数据访问层,用来访问数据库
    右击 com包 -> New -> Package->输入 dao
    在dao包中建立两个类的接口,UserDao、BookDao:
    右击dao-> New -> Java Class->输入"UserDao",kind选择"interface"
  • UserDao
package com.dao;

import com.pojo.User;
import java.util.List;

public interface UserDao {

    List<User> queryAllUser();//查询所有user
    int addUser(User user);//添加user
}

  • BookDao
package com.dao;

import com.pojo.Book;

import java.util.List;

public interface BookDao {
    List<Book> queryAllBook();//查询所有书籍
    int addBook(Book book);//添加书籍
}

  1. 建立jdbc.properties文件,典型的Java属性配置文件
    右击resources文件夹->new ->File->jdbc.properties(带后缀)
    配置mysql数据库,使用test库
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=123456

  1. 建立类的映射文件夹(mapper)
    右击 resources ->New -> Directory -> mapper
    在mapper文件夹下建立UserMapper.xml和BookMapper.xml映射文件
  • UserMapper.xml内容如下,BookMapper同UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "httpz://mybatis.org/dtd/mybatis-3-mapper.dtd">


<!--映射器-->
<mapper namespace="com.dao.UserDao">
    <!--将数据库user表映射到userResultMap中 类型为User -->
    <resultMap id="userResultMap" type="User">
        <result property="name" column="name"/>
        <result property="password" column="password"/>
    </resultMap>

    <!--sql语句-->
    <!--实现userDao中定义的 queryAllUser 方法-->
    <select id="queryAllUser" resultMap="userResultMap">
        select * from user
    </select>

    <!--实现userDao中定义的 addUser 方法-->
    <insert id="addUser" parameterType="User">
        insert into user(name,password) value (#{name},#{password})
    </insert>

</mapper>

  1. 核心配置文件configuration.xml
    右击resources ->File -> 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>
    <!-- 引入外部资源文件 -->
    <properties resource="jdbc.properties"></properties>
    <!-- 设置驼峰匹配 -->
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <!-- 设置包扫描(别名) -->
    <typeAliases>
        <package name="com.pojo"/>
    </typeAliases>
    <!-- 配置环境:可以配置多个环境,default:配置某一个环境的唯一标识,表示默认使用哪个环境 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!-- 配置连接信息 -->
                <property name="driver" value="${jdbc.driverClass}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!-- 配置映射文件:用来配置sql语句和结果集类型等 -->
    <mappers>
        <mapper resource="classpath:mapper/*.xml"/>
    </mappers>
</configuration>

目录结构如下:
在这里插入图片描述

3.MyBatis语法

MyBatis的真正强大之处在于SQL映射语句,也是它的魅力所在,使用SQL映射文件配置可减少50%以上的代码量,MyBatis专注于SQL。关于SQL映射文件的几个元素配置:

  1. mapper:映射元素的根元素节点,只有一个namespace(命名空间),其主要作用在于:

    • 区分不同的mapper,全局唯一
    • 绑定DAO接口,即面向接口编程
  2. ResultMap:用来描述数据库结果集和对象的对应关系

  3. sql:可以重用的SQL块

  4. insert:映射插入语句

    • dao中 int addMember(Member member);
    • mapper中这样写(id和方法名一致):
      <insert id="addMember" parameterType="Member"> insert into member(memName,password) value (#{memName},#{password}) </insert>
  5. delete:映射删除语句

    • dao 中int deleteMemberById(int memId);
    • mapper中这样写
      <delete id="deleteMemberById" parameterType="int"> delete from member where memId=#{memId} </delete>
  6. select:映射查询语句

    • dao 中Member queryById(int memId);
    • mapper中这样写
      <select id="queryById" parameterType="int" resultType="Member"> select * from member where memId=#{memId} </select>
  7. update:映射更新语句

    • dao中int updateMember(Member member);
    • mapper可以这样写
      <update id="updateMember" parameterType="Member"> update member set memName=#{memName},sex=#{sex},password=#{password} </update>
  8. parameterType:参数类型(int、String、某个pojo)

  9. resultType:返回查询的类型,像这样的sql语句:select * from user where id=1,只返回1个对象,可为它指定ResultType为User。insert、update、delete元素中均无resultType属性,只有查询操作需要对返回结果指定

  10. ResultMap:是对外部resultMap定义的引用,对应外部resultMap的id,像这样的一条sql语句select * from student where age>20会返回多个student对象,可为它指定resultMap为studentResultMap,即ResultMap常用于会返回多条记录是使用。

4.实现Spring对MyBatis的整合

1. 配置DataSource

我们将MyBatis配置文件中有关数据源的配置转移到Spring配置文件中单独进行维护。
在Spring中配置数据源,首先要选择一种具体的数据源实现技术,有dbcp、c3p0、Proxool等,以配置c3p0为例:
建立Spring的配置文件,右击resources ->New->Directory->“Spring”
右击Spring文件夹->new->File->“spring-dao.xml”,输入以下代码:

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 配置整合mybatis过程 -->
    <!-- 1.配置数据库相关参数properties的属性:${url} -->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!-- 2.数据库连接池 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <!-- 配置连接池属性 -->
        <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>

        <!-- c3p0连接池的私有属性 -->
        <property name="maxPoolSize" value="30"/>
        <property name="minPoolSize" value="10"/>
        <!-- 关闭连接后不自动commit -->
        <property name="autoCommitOnClose" value="false"/>
        <!-- 获取连接超时时间 -->
        <property name="checkoutTimeout" value="10000"/>
        <!-- 当获取连接失败重试次数 -->
        <property name="acquireRetryAttempts" value="2"/>
    </bean>

    <!-- 3.配置SqlSessionFactory对象 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 注入数据库连接池 -->
        <property name="dataSource" ref="dataSource"/>
        <!-- 配置MyBaties全局配置文件:mybatis-config.xml -->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <!-- 扫描pojo包 使用别名 -->
        <property name="typeAliasesPackage" value="com.pojo"/>
        <!-- 扫描sql配置文件:mapper需要的xml文件 -->
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
    </bean>

    <!-- 4.配置扫描Dao接口包,动态实现Dao接口,注入到spring容器中 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 注入sqlSessionFactory -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <!-- 给出需要扫描Dao接口包 -->
        <property name="basePackage" value="com.dao"/>
    </bean>
</beans>

将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>
    <!-- 配置全局属性 -->
    <settings>
        <!-- 使用jdbc的getGeneratedKeys获取数据库自增主键值 -->
        <setting name="useGeneratedKeys" value="true" />

        <!-- 使用列别名替换列名 默认:true -->
        <setting name="useColumnLabel" value="true" />

        <!-- 开启驼峰命名转换:Table{create_time} -> Entity{createTime} -->
        <setting name="mapUnderscoreToCamelCase" value="true" />
    </settings>
</configuration>

整合完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值