Mybatis

java是面向对象的,所以不同的配置文件(xml、properties)都会生成java类,一个配置文件就是一个java对象,解析配置文件就是生成java对象,获得java的各种属性信息就可以得到各种配置信息

 

传统JDBC链接数据库的缺点:

 

 

 

#和$的区别

1、#{}对传入的参数转换为占位符'?',传入的是字符串,也就是它会预编译,select * from user where name = #{name},比如我传一个csdn,那么传过来就是 select * from user where name = 'csdn';

2、${}将不会将传入的值进行预编译,select * from user where name=${name},比如我穿一个csdn,那么传过来就是 select * from user where name=csdn;

3、#的优势就在于它能很大程度的防止sql注入,而$则不行。比如:用户进行一个登录操作,后台sql验证式样的:select * from user where username=#{name} and password = #{pwd},如果前台传来的用户名是“wang”,密码是 “1 or 1=1”,用#的方式就不会出现sql注入,而如果换成$方式,sql语句就变成了 select * from user where username=wang and password = 1 or 1=1。这样的话就形成了sql注入。

4、MyBatis排序时使用order by 动态参数时需要注意,用$而不是#

 

Mybatis介绍

 

 

 

 mybatis面向接口编程,Dao层不需要实现类,因为MapperScannerConfigurer这个类,它将会查找类路径下的映射器并自动将它们创建成MapperFactoryBean。

MapperScannerConfigurer是spring和mybatis整合的mybatis-spring的jar包中提供的一个类。

这段配置会扫描org.mybatis.spring.sample.mapper下的所有接口,然后创建各自接口的动态代理类进行自动的注入,这样,Service就可以注入dao的实例了

最终的效果是:将包路径下的所有dao类注册到Spring Bean中,并且将它们的beanClass设置为MapperFactoryBean。

 

Service层使用DAO层接口

@Resource 
private MemberMapper memberDao;

 

我们通过@Autowired注入Dao接口的时候,注入的就是这个代理对象,我们调用到Dao接口的方法时,则会调用到MapperProxy对象的invoke方法。

 

配置文件:mybatis-config.xml、jdbc.properties、mapper.xml、spring-mybatis.xml  

MyBatis中的缓存

MyBatis 中的缓存就是说 MyBatis 在执行一次SQL查询或者SQL更新之后,这条SQL语句并不会消失,而是被MyBatis 缓存起来,当再次执行相同SQL语句的时候,就会直接从缓存中进行提取,而不是再次执行SQL命令

MyBatis中的缓存分为一级缓存和二级缓存,一级缓存又被称为 SqlSession (会话)级别的缓存,二级缓存又被称为表级缓存。

一级缓存默认开启,二级缓存手动开启,不能同时使用

原因:二级缓存和一级缓存,在底层代码中,先执行二级,二级没有开启再执行一级,所以不需要设置两个缓存。

SqlSession级别的缓存是什么意思?SqlSession级别的缓存表示的就是每当执行一条SQL语句后,默认就会把该SQL语句缓存起来,也被称为会话缓存

一级缓存是SQLSession级别缓存,在操作数据库时都需要构造SQLSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据,不同的SQLSession之间的缓存数据区域是互不影响的。

一级缓存的作用于是在同一个SQLSession,在同一个SQLSession中执行相同的两次SQL,第一次执行完毕在后会将数据写到缓存中,第二次从缓存中进行后去就不在数据库中查询,从而提高了效率,
当一个SQLSession结束后该SQLSession中的一级缓存也就不存在了,mybatis默认开启一级缓存。

二级缓存是mapper级别缓存,多个SQLSession去操作同一个mapper的SQL语句,多个SQLSession操作都会存在二级缓存中,多个SQLSession共用二级缓存,二级缓存是跨SQLSession的。
二级缓存是多个SQLSession共享的,作用域是mapper下的同一个namespace。不同的SQLSession两次执行相同的namespace下的SQL最终能获取相同的SQL语句结果。
mybatis默认是没有开启二级缓存的,需要在全局配置文件中配置开启二级缓存。

Mybatis开启二级缓存:

在nameSpace下使用<cache>标签自动开启二级缓存

 

 

 

mybatis链接数据库执行sql步骤:

一、mybatis如何获取数据库源:

mybtis-config.xml文件获取数据库源,jdbc.properties文件设置数据库源,配置driver、url、username、password

 

二、mybatis如何执行SQL语句:

可以使用xml文件配置或注解配置SQL语句

Mybatis中mapper.xml文件中namespace用于绑定dao接口,dao接口的方法对应mapper中的sql语名。

mybatis plus是去除mapper.xml文件中 增删改查语句。

三、mybatis如何操作数据库:

 mysql链接有上限,在部署mybatis框架,进行数据库配置时,在mybatis_config.xml文件将数据源type设置为POOLED,设置数据库连接池,有数据库连接请求(需要操作SQL语句)就链接。

自带连接池:

在mybatis_config.xml文件将数据源type设置为POOLED

复制代码
 <!--3、环境-->
    <environments default="development">
        <!--   开发环境-->
        <environment id="development">
            <!-- 事务管理-->
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
复制代码

 

第三方数据库连接池:

添加依赖:

<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.9</version>
</dependency>

在utils文件夹下创建Druid数据源工厂类,该类必须继承UnpooledDataSourceFactory这个类
因为连接池的不同,Druid需要重写父类的getDataSource()方法,在这个方法中需要将原始的dataSource强转成DruidDataSource,并执行init()方法

复制代码
package utils;
 
import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory;
 
import javax.sql.DataSource;
import java.sql.SQLException;
 
public class DuridDataSourceFactory extends UnpooledDataSourceFactory {
    public DuridDataSourceFactory(){
        this.dataSource = new DruidDataSource();
    }
 
    @Override
    public DataSource getDataSource() {
        try {
            ((DruidDataSource)this.dataSource).init(); //初始化Druid数据源
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return this.dataSource;
    }
}
复制代码

修改mybatis_config.xml数据源:

复制代码
    <!--3、环境 使用哪个数据源-->
    <environments default="druid">
        <environment id="druid">
            <transactionManager type="jdbc"/>
            <!--            配置druid数据连接池-->
            <dataSource type="包名.DuridDataSourceFactory">
                <property name="jdbcUrl" value="${jdbc.url}"/>
                <property name="driverClass" value="${jdbc.driver}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
                <!-- 初始连接数,默认为0 -->
                <property name="initialSize" value="10"/>
                <!-- 最大连接数,默认为8 -->
                <property name="maxActive" value="30"/>
                <!-- 最小闲置数 -->
                <property name="minIdle" value="10"/>
                <!-- 获取连接的最大等待时间,单位为毫秒 -->
                <property name="maxWait" value="60000"/>
                <!-- 缓存PreparedStatement,默认为false
                <property name="poolPreparedStatements" value="true"/>-->
                <!-- 缓存PreparedStatement的最大数量,默认-1(不缓存)。大于0时会自动开启缓存PreparedStatement,所以可以省略上一句设置 -->
                <property name="maxOpenPreparedStatements" value="20"/>
            </dataSource>
        </environment>
    </environments>
复制代码

 

 

 

 

Spring整合Mybatis,不想让程序员直接使用Sqlsession,Sqlsession操作复杂,整合后程序员直接调用DAO接口的方法就可以完成一次操作数据库,调用一次DAO方法就执行了一次SQL语句。调用DAO接口的方法Spring会使用Sqlsession,方法结束会销毁Sqlsession。

posted @   堤苏白  阅读(186)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示