Mybatis精华大全

何为JDBC:是数据库和JAVA的桥梁,是一个规范而不是一实现,由JAVA类和接口组成,能够执行SQL语句。
JDBC实用模板:

1.//加载驱动,告诉JVM使用哪个类
Class.forName("com.mysql.jdbc.Driver");
//设置连接地址,用户名以及密码
String url="jdbc:mysql://localhost:3306/student?serverTimeZone=UTC&characterEncoding=UTF8";
String userName="root";
String password="123456";
2.//连接数据库
Connect conn = DriverManager.getConnection(url,userName,password);
3.//获取语句执行平台,并创建数据库查询
PreparaStatement ps = conn.PreparaStatement("select * from t_stus where clazz=?");
//设置参数
ps.setInt(1,classId);
4.执行SQL语句,得到结果
ResultSet rs = ps.executeQuery();4
//遍历
while(rs.next()) {
    
    
	System.out.println(rs.getInt("id"));
    System.out.println(rs.getString("address"));
5.关闭连接和查询,释放资源 (需进行异常抛出)
if(rs != null){
    
    					
 rs.close();
}
if(ParaStatement != null){
    
    					
 ParaStatement.close();
}    
if(ps != null){
    
    					
 ps.close();
}

JDBC劣势:
1.在创建connection的时候,存在硬编码问题(也就是直接把连接信息写死,不方便后期维护)。
2.preparedStatement对象在执行sql语句的时候存在硬编码问题。
3.每次在进行一次数据库连接后都会关闭数据库连接,频繁的开启/关闭数据连接影响性能。

何为Mybatis:
框架:1.应用骨架
2.是一种规则,保证开发者遵守相同的方式开发程序。
3.对JDBC基础功能进行封装。

Mybatis优势:
1.mybatis是把连接数据库的信息都是写在配置文件中,因此不存在硬编码问题,方便后期维护。
2.mybatis执行的sql语句都是通过配置文件进行配置,不需要写在java代码中。
3.mybatis的连接池管理、缓存管理等让连接数据库和查询数据效率更高。

使用步骤:
1.在Maven中,引入mybatis和mysql依赖

    <dependencies>
        <!-- 数据库驱动依赖 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.18</version>
        </dependency>
        <!-- mybatis依赖 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.5</version>
        </dependency>
    </dependencies>

2.mybatis的xml配置(在resources下设置)

<?xml version="1.0" encoding="utf-8" ?>
<!-- 官网复制DTD约束 -->
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 设置根节点 -->
<configuration>
    <!-- 设置环境配置总标签,会有一些必填项出现 -->
    <!-- 通过改变environments的default属性的值来选择使用什么环境 -->
    <environments default="dev">
        <!-- 环境配置标签,id属性为唯一标识 -->
        <!-- 说明:在我们的开发中,可能会用到很多的数据库 -->
        <!-- 比如在开发环境中是一套数据库,在实际生产环境中又是另一套数据库 -->
        <!-- environment就能指明要使用的不同数据库信息 -->
        <!-- id属性不能相同 -->
        <!-- 比如这个环境配置标签就可以代表开发环境 -->
        <environment id="dev">
            <!-- 采用JDBC方式对数据库事务进行管理-commit/rollback -->
            <!-- 其实是指,由jdbc来决定提交事务或者回滚事务 -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 数据源节点,设置type="POOLED"采用数据库连接池的方式管理数据库连接 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/babytun?serverTimezone=UTC&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
        <!-- 比如下面这个环境标签就代表生产环境 -->
        <environment id="prd">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://192.168.1.155:3306/babytun?serverTimezone=UTC&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

</configuration>

3.创建实体类(Entity)要和数据库的数据对应(类型和名字)
4.创建映射Mapper标签,编写selectSQL标签

<?xml version="1.0" encoding="UTF-8" ?>
<!-- 将之前的config DTD约束改为mapper DTD约束 -->
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 为这个mapper指定一个唯一的namespace -->
<!-- 注意每个mapper文件的namespace是不能相同的 -->
<!-- namespace非常类似于Java类的包,同样也是用于区分每个不同的mapper文件 -->
<!-- 所以namespace的值,习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的 -->
<!-- 例如namespace="com.dodoke.mybatis.resources.mappers.GoodsMapper" -->
<!--就是com.dodoke.mybatis.resources.mappers(包名/文件夹名)+GoodsMapper(GoodsMapper.xml文件去除后缀) -->
<mapper namespace="com.dodoke.mybatis.resources.mappers.GoodsMapper">
    <!-- id属性相当于为SQL语句起了个名称 -->
    <!-- 在一个mapper文件中是不允许出现相同的id属性值的 -->
    <!-- resultType代表返回结果的类型,它会将SQL语句执行完的每一条结果包装为对应的属性值指定的对象 -->
    <select id="selectAll" resultType="com.dodoke.mybatis.entity.Goods">
        select * from t_goods order by goods_id desc limit 10
    </select>
</mapper>

5.名字如果不合适,可加入驼峰映射

<settings>
    <!-- 驼峰命名转化设置 -->
    <!-- 该设置表示将数据库中表的字段,比如goods_id => goodsId -->
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

6.初始化sqlSessionFactory(SqlSessionFactory是MyBatis中的一个重要的对象,它是用来创建SqlSession对象的,而SqlSession用来操作数据库的,必须全局唯一,需要静态设置)

  private static SqlSessionFactory sqlSessionFactory = null;

    //利用静态代码块在初始化类时实例化sqlSessionFactory属性
    static {
    
    
        try {
    
    
            Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (IOException e) {
    
    
            e.printStackTrace();
            //需要抛出初始化的异常,并且传入捕捉到的异常,形成一条完整的异常链
            //以便于通知调用者
            throw new ExceptionInInitializerError(e);
        }
    }

7.利用sqlSession对象进行操作

 SqlSession sqlSession = null;
        try {
    
    
            sqlSession = sqlSessionFactory.openSession();
            //在SqlSession对象底层存在Connection(java.sql)连接对象,可以通过getConnection方法得到该对象
            Connection connection = sqlSession.getConnection();
            //该connection对象的创建仅做演示测试用,在mybatis中,无需使用任何与JDBC有关的类
            System.out.println(connection);
        } catch (Exception e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            if(sqlSession != null) {
    
    
                //在mybatis-config.xml文件中,dataSource节点type属性:
                //如果type="POOLED",代表使用连接池,close则是将连接回收到连接池中
                //如果type="UNPOOLED",代表直连,close则会调用Connection.close()方法关闭连接
                //这是配置带来的底层处理机制的不同
                sqlSession.close();
            }
        }

补充:别名映射(不使用名字对应或驼峰映射)

扫描二维码关注公众号,回复: 11707417 查看本文章
<!--结果映射,通常id属性设置为rm+...,type指明要转化为的DTO -->
<resultMap id="rmGoods" type="com.dodoke.mybatis.dto.GoodsDTO">
    <!--设置主键字段与属性映射,必写-->
    <!-- property=goods.goodsId指的是,每次查到的goods_id字段的数据会为GoodsDTO类中goods属性对象的goodsId属性进行赋值 -->
    <id property="goods.goodsId" column="goods_id"></id>
    <!--设置非主键字段与属性映射-->
    <result property="goods.title" column="title"></result>
    <result property="goods.originalCost" column="original_cost"></result>
    <result property="goods.currentPrice" column="current_price"></result>
    <result property="goods.discount" column="discount"></result>
    <result property="goods.isFreeDelivery" column="is_free_delivery"></result>
    <result property="goods.categoryId" column="category_id"></result>
    <result property="categoryName" column="category_name"></result>
    <result property="test" column="test"/>
</resultMap>
<select id="selectGoodsDTO" resultMap="rmGoods">
    select g.* , c.*,'1' as test from t_goods g , t_category c
    where g.category_id = c.category_id
</select>

讲述完使用的入门版,现在讲高级版本,让小伙伴们丰富更多知识:
Mybatis的缓存:一级缓存和二级缓存
MyBatis 中就通过缓存技术来解决这样的问题,也就是说:将一些经常查询,并且不经常改变的,以及数据的正确对最后的结果影响不大的数据,放置在一个缓存容器中,当用户再次查询这些数据的时候,就不必再去数据库中查询,直接在缓存中提取就可以了。
一级缓存是SqlSession级别的缓存。在操作数据库时需要构造 sqlSession对象,在对象中有一个(内存区域)数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。
一级缓存的作用域是同一个SqlSession,在同一个sqlSession中两次执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。当一个sqlSession结束后该sqlSession中的一级缓存也就不存在了。Mybatis默认开启一级缓存。
二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession去操作数据库得到数据会存在二级缓存区域,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。
二级缓存是多个SqlSession共享的,其作用域是mapper的同一个namespace,不同的sqlSession两次执行相同namespace下的sql语句且向sql中传递参数也相同即最终执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。Mybatis默认没有开启二级缓存需要在setting全局参数中配置开启二级缓存。

MyBatis多表级联查询
MyBatis多表级联查询和之前学习的MyBatis多表关联查询不一样。
多表关联查询:两个表通过主外键在一条SQL中完成所有数据的提取。
多表级联查询:通过一个对象来获取与它关联的另外一个对象,执行的SQL语句分为多条。

多对一关联查询:
当多对一的时候,只需要在多的一方实体类中,持有一的一方的实体!

一对多关联查询:
1.新建实体类
2. 新建mapper xml文件 GoodsDetailMapper.xml
3.修改Goods类,为体现一对多的关系,新增一个属性
4.利用resultMap实现一对多映射,GoodsMapper.xml

MyBatis的动态SQL
在我们使用SQL语句时,有的时候参数是不固定的。比如用户可以指定多个检索条件,也可能单独只指定一个检索条件。在这个时候,我们无法确定条件参数的数量,只能使用动态SQL完成。在实际的开发中,动态SQL的使用非常普遍。
可以使用where标签和if组合使用,或是单独使用if标签来实现动态SQL。

<select id="dynamicSQL" parameterType="java.util.Map" resultType="com.dodoke.mybatis.entity.Goods">
    select * from t_goods
    <!-- 不需要写where关键字,只需要利用where标签智能判断and是否要添加 -->
    <where>
        <!-- 针对map中的key进行判断对应的value值是否为null和空 -->
        <if test="categoryId != null and categoryId!=''">
            and category_id = #{
    
    categoryId}
        </if>
        <if test="currentPrice != null and categoryId!=''">
            and current_price &lt; #{
    
    currentPrice}
        </if>
    </where>
</select>

猜你喜欢

转载自blog.csdn.net/hgfhjtff/article/details/108193141
今日推荐