myBatis框架(基础核心篇)

 mybatis是什么

        mybatis是一个帮助程序员专注与编写sql语句, 简化其他操作, 同时也对程序的员的sql语句编写能力有一定要求。他具体工作是:将从数据库查询得到的数据生成所需要的java对象;将java对象中的数据用sql持久化到数据库中。通俗点就是来回封装转换

myBatis运行逻辑


  • SqlMapConfig.xml  是主配置文件
  • Mapper 是映射通常一个映射对应一个dao层的实现类  一般也对应一个表
  • sqlSessionFactory 是mybatis 和  java 间的封装和对象转换 生成sqlSession
  • sqlSession 增删改查语句写在其中 执行依赖executor
  • 其中最后面的 executor 和  mappedStatement 是执行器和声明(是预编译声明的一个子类)【这个跟我们一般用不到,他们在底层自己执行了】

用到的jar包  (推荐用maven 直接导入)

导入mybatis

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.6</version>
        </dependency>
导入mybatis的依赖日志  

其中commons-logging 是日志门面 规范了日志 像一个接口  log4j是日志实现 

<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
</dependency>

<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>
mysql 和 druid 连接池
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.28</version>
</dependency>

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

配置文件

log4j.properties (文件名不能变
log4j.rootLogger=Debug, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
 sqlMapConfig.xml (主配置文件 文件名随便)
        其中setting里面的设置 
  • 日志实现
  • 懒加载
  • 缓存
  • 矩阵传输
  • 数据库下滑线命名 自动映射成为 驼峰命名法 (camel_case  - > camelCase)

下面的设置就是链接池的设置 数据库url  username password  可以看我的操作数据库的文章

链接如下:https://blog.csdn.net/little_wolf_yyds/article/details/134380252

<?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>
    <!-- MyBatis的全局参数设置,基本用来进行MyBatis的优化处理 -->
    <settings>
        <setting name="logImpl" value="LOG4J"/>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>
        <setting name="cacheEnabled" value="true"/>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <!-- 以下配置不需掌握,和Spring整合后,以下配置将被废除 -->
    <environments default="mysqlEnv">
        <environment id="mysqlEnv">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url"
                          value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&amp;serverTimezone=Hongkong"/>
                <property name="username" value="root"/>
                <property name="password" value=""/>
            </dataSource>
        </environment>
    </environments>
</configuration>

实施数据库操作

准备表

举例子   : worker表   并且在  java 当中创建对应的 java bean 来封装

java 创建一个运行类
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();

List<Worker> workers = sqlSession.selectList("myWorker.queryAll");
for (Worker worker : workers) {
    System.out.println(worker);
}
System.out.println("----------------------------------------------");

Worker worker = sqlSession.selectOne("myWorker.QueryById", "9001");
System.out.println(worker);

sqlSession.close();
resources文件夹 
 
WorkerMapper.xml 中写sql语句  来操作数据库

其中namespace 是自己定义的名字  java运行类中调用  xx.方法id  后面给他需要的参数

resulrtType parameterYype 分别是 返回值类型 和 参数类型  

四个操作 insert  delete update select 增删改查四个操作

#{} ${} : #{}预处理参数传过来的值      ${}字符串转换里面写的啥最后变成一个字符串 

<?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="myWorker">
    <select id="queryAll" resultType="com.wolf.bean.Worker">
        select * from worker
    </select>

    <select id="QueryById" resultType="com.wolf.bean.Worker" parameterType="string">
        select *  from worker where wid = #{value}
    </select>
</mapper>

改操作没有返回值不用写, 但是他用了我们自己写的bean封装的 所以传给他的参数是自己worker的实例类  #{}中的参数是bean里面的对应的参数  一个字默认就是value 

<update id="updateSexById" parameterType="com.wolf.bean.Worker">
    update worker set sex = #{sex} where wid = #{wid}
</update>
在sqlMapConfig 文件下 配置 


用mybatis实现mapper接口动态代理(重点)

用配置文件来实现代理
代理要保证一定的一致性

一个接口 一个配置文件 名字一致  路径也要一致

配置文件里面的namespace  对应的是接口的位置
mapper namespace="com.wolf.mapper.WorkerMapper02">

主配置文件的变化 

在sqlMapConfig中 配置要代理的类 的路径  所以是class 不是 resource

package也好理解就是把进行需要代理的mapper整个包都加载上  

但是注意要是像如此重复配置了 就会报错的 所以两种选一种操作

org.apache.ibatis.binding.BindingException: Type interface com.wolf.mapper.WorkerMapper02 is already known to the MapperRegistry.

<mappers>
    <mapper resource="WorkerMapper01.xml"/>
    <mapper class="com.wolf.mapper.WorkerMapper02"/>
    <package name="com.wolf.mapper"/>
</mappers>

 用接口实现代理(重点中的重点)

直接在接口上 加上对应操作的四个注释中的一个  括号里面写好sql语句  #{} ${} 用法也都一样

@Select("select * from worker where wname = #{wname}")
public Worker QueryByName(String name);

test类
       //读取配置文件  最后生成 sqlsession
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new         SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //代理
            WorkerMapper02 mapper = sqlSession.getMapper(WorkerMapper02.class);
        List<Worker> workers = mapper.queryAll();
        for (Worker worker : workers) {
            System.out.println(worker);
        }
        System.out.println("----------------------------------------------");

        Worker worker = mapper.QueryById("9001");
        System.out.println(worker);

        System.out.println("----------------------------------------------");
        Worker worker1 = mapper.QueryByName("牛魔王");
        System.out.println(worker1);
        sqlSession.close();


运行结果

DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl' adapter.
DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - Class not found: org.jboss.vfs.VFS
DEBUG [main] - JBoss 6 VFS API is not available in this environment.
DEBUG [main] - Class not found: org.jboss.vfs.VirtualFile
DEBUG [main] - VFS implementation org.apache.ibatis.io.JBoss6VFS is not valid in this environment.
DEBUG [main] - Using VFS adapter org.apache.ibatis.io.DefaultVFS
DEBUG [main] - Find JAR URL: file:/E:/JavaProgram/myBatis_P/target/classes/com/wolf/mapper
DEBUG [main] - Not a JAR: file:/E:/JavaProgram/myBatis_P/target/classes/com/wolf/mapper
DEBUG [main] - Reader entry: WorkerMapper02.class
DEBUG [main] - Reader entry: WorkerMapper02.xml
DEBUG [main] - Listing file:/E:/JavaProgram/myBatis_P/target/classes/com/wolf/mapper
DEBUG [main] - Find JAR URL: file:/E:/JavaProgram/myBatis_P/target/classes/com/wolf/mapper/WorkerMapper02.class
DEBUG [main] - Not a JAR: file:/E:/JavaProgram/myBatis_P/target/classes/com/wolf/mapper/WorkerMapper02.class
DEBUG [main] - Reader entry: ����   4 
DEBUG [main] - Find JAR URL: file:/E:/JavaProgram/myBatis_P/target/classes/com/wolf/mapper/WorkerMapper02.xml
DEBUG [main] - Not a JAR: file:/E:/JavaProgram/myBatis_P/target/classes/com/wolf/mapper/WorkerMapper02.xml
DEBUG [main] - Reader entry: <?xml version="1.0" encoding="UTF-8"?>
DEBUG [main] - Checking to see if class com.wolf.mapper.WorkerMapper02 matches criteria [is assignable to Object]
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 1472465.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@1677d1]
DEBUG [main] - ==>  Preparing: select * from worker
DEBUG [main] - ==> Parameters: 
DEBUG [main] - <==      Total: 9
Worker{wid='4792a048-5e5d-11e9-9dc0-28d244d68b7c', wname='令狐冲', age=50, sex='男'}
Worker{wid='4792a048-5e5d-11e9-9dc0-28d244d68b8c', wname='111', age=11, sex='男'}
Worker{wid='50f14e17-5e5d-11e9-9dc0-28d244d68b7c', wname='杨过', age=50, sex='男'}
Worker{wid='5af9f088-5e5d-11e9-9dc0-28d244d68b7c', wname='至尊宝', age=50, sex='男'}
Worker{wid='68c8d109-5e5d-11e9-9dc0-28d244d68b7c', wname='萧峰', age=50, sex='男'}
Worker{wid='6c6f2776-5e5d-11e9-9dc0-28d244d68b7c', wname='段誉', age=50, sex='男'}
Worker{wid='6fa801d8-5e5d-11e9-9dc0-28d244d68b7c', wname='虚竹', age=50, sex='男'}
Worker{wid='9001', wname='牛魔王', age=500, sex='男'}
Worker{wid='9d05ac22-5e5c-11e9-9dc0-28d244d68b7c', wname='郭靖', age=50, sex='男'}
----------------------------------------------
DEBUG [main] - ==>  Preparing: select * from worker where wid = ?
DEBUG [main] - ==> Parameters: 9001(String)
DEBUG [main] - <==      Total: 1
Worker{wid='9001', wname='牛魔王', age=500, sex='男'}
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@1677d1]
DEBUG [main] - Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@1677d1]
DEBUG [main] - Returned connection 1472465 to pool.
----------------------------------------------
DEBUG [main] - ==>  Preparing: select * from worker where wname = ?
DEBUG [main] - ==> Parameters: 牛魔王(String)
DEBUG [main] - <==      Total: 1
Worker{wid='9001', wname='牛魔王', age=500, sex='男'}
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@1534f01b]
DEBUG [main] - Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@1534f01b]
DEBUG [main] - Returned connection 355790875 to pool.

想要了解更多mybatis的 朋友可以看一下  本人的myBatis 进阶篇 

myBatis进阶篇-CSDN博客

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值