mybatis的使用

基础介绍

mybatis是通过对JDBC的封装实现的,他是针对ORM的。'datasource也是对于JDBC的封装,但是它是针对连接管理的。

半ORM框架Object Relationship Mapping 对象关系映射

半ORM:需要在mapper文件中配置映射关系

作用:用来操作数据库,解决原始jdbc代码冗余

mybatis-config.xml

(1)environment设置数据源

(2)类型别名

(3)mapper文件的注册

mapper文件

(1)dao方法的实现---sql语句

开发步骤:

1.entity

2.类型别名

3.表

4.dao接口

5.mapper文件

6.mapper文件的注册

7.API编程

mybatis开发流程

mybatis流程:

(1)引入pom

(2)编写mybatis-config.xml文件在resources目录,配置数据源和mybatis的设置

(3)编写mapper文件在resources/mapper目录,和dao类配合

(4)创建SessionFactory

(5)建立Session,断开Session

配置mybatis

public StudentDao(String configPath) throws IOException {
    InputStream inputStream = Resources.getResourceAsStream(configPath);    
    sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }

但是使用

<dependency> 
   <groupId>org.mybatis.spring.boot</groupId>
   <artifactId>mybatis-spring-boot-starter</artifactId>
   <version>1.1.1</version>
</dependency>

就可以直接使用SqlSessionFactory直接注入就行了,springboot给配置好了

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>
    <!-- Global settings -->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

    <!-- Type aliases -->
    <typeAliases>
        <typeAlias alias="User" type="com.example.model.User"/>
        <!-- Other type aliases... -->
    </typeAliases>

    <!-- Plugins (if any) -->
    <plugins>
        <plugin interceptor="com.example.plugins.MyPlugin">
            <!-- Plugin-specific configuration -->
        </plugin>
    </plugins>

    <!-- Environments -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="com.alibaba.druid.pool.DruidDataSource">
                <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/>
                <property name="username" value="your_username"/>
                <property name="password" value="your_password"/>
                <!-- Druid specific properties -->
                <property name="initialSize" value="5"/>
                <property name="maxActive" value="20"/>
                <!-- Other properties... -->
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="classpath:mapper/student_mapper.xml"/>
    </mappers>
</configuration>

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.example.demo1.dao.StudentDao">
    <select id="findAll" resultType="com.yogurt.po.Student">
        SELECT * FROM schedule_system.student;
    </select>

    <insert id="insert" parameterType="com.yogurt.po.Student">
        INSERT INTO schedule_system.student (name) VALUES (#{name});
    </insert>

    <delete id="delete" parameterType="int">
        DELETE FROM schedule_system.student WHERE id = #{id};
    </delete>
</mapper>

InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();

代理对象

UserDao userDao=sqlSession.getMapper(UserDao.class);

List users=userDaol.queryAll();

dao接口

代理对象

如何在resourece目录下和接口目录相同?编译以后文件在一个目录就行了 resource/top/haidong/mapper

包扫描加载mapper接口(代替mapper的配置)

表中字段名和java类的属性不同,无法映射的解决方法:

(1)给select语句中的字段名起别名。as

(2)使用resultmap映射

<resultMap id="brandResultMap" type="brand">
id是主键的映射,result是一般字段的映射
<id colum="key_permiay" property="keyPermiay">
<result colum="brand_name"property="brandName">
<result colum="company_name" property="companyName">
</resultMap>
<select id="selectAll" resultMap="brandResultMap">
select * from tb
</select>

sql参数

参数占位符,${}有sql注入的风险

#{}:在sql中使用?代替

${}:sql直接注入

parameterType:传入参数类型,可以省略。

sql中的特殊字符(比如<,和xml特殊字符冲突)的处理:

(1)转义字符

(2)<![CDATA [内容]>:写一个CD就能跳出来了

多条件查询

dao接口传入sql 的多个占位符参数,如何一一对应?

(1)散装参数注入sql占位符,在dao接口参数使用@Param:@Param("参数占位符名称")

(2)将参数封装成对象,要求对象属性要和占位符名称一一对应。

将对象传入。

(3)传入map

单条件动态查询

where
<choose >
<when test="a!=null and a!=""" ">
    state= #{state}
</when>
<when test="">
</when>
<otherwise>
</otherwise>

多条件动态查询

select * from t
<where>
<if test="state!=null">
    state=#{state}
</if>
<if test="title!=null">
    title=#{title}
</if>
</where>

where元素只会在子元素返回内容的情况下才插入where语句,若开头为"AND"或者"OR",会去掉。

mybatis默认开启事务,进行增删改操作后需要sqlSession.commit();手动提交。

更新

<update id="updateAuthorIfNecessary">
  update Author
    <set>
      <if test="username != null">username=#{username},</if>
      <if test="password != null">password=#{password},</if>
      <if test="email != null">email=#{email},</if>
      <if test="bio != null">bio=#{bio}</if>
    </set>
  where id=#{id}
</update>

set会自动删掉if字段内的逗号,以及自动添加"set"

MyBatis 会通过 Mapper XML 文件来实现 DAO 接口

生命周期

SqlSessionFactoryBuilder:这个就是一个建造者类,随时可以被创建使用和丢弃,没什么问题,SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域

SqlSessionFactory:一个应用程序创建一个就行了,可以使用单例模式来实现。

SqlSession:最佳实践是方法作用域和请求作用域,不能将它和任何一个类绑定。

映射器实例:和sqlsession一样,方法作用域或请求。

sqlsession和connection的关系

在sqlsessionfacotory创建sqlsession时候,给sqlsession分配一个connection,当sqlsession关闭时候关闭connection。

sqlsessionfactory管理数据库连接,它是通过configuration来创建连接的,而不是driverManager。

相关推荐
VBA63377 分钟前
VBA技术资料MF243:利用第三方软件复制PDF数据到EXCEL
开发语言
轩辰~9 分钟前
网络协议入门
linux·服务器·开发语言·网络·arm开发·c++·网络协议
小_太_阳18 分钟前
Scala_【1】概述
开发语言·后端·scala·intellij-idea
向宇it19 分钟前
【从零开始入门unity游戏开发之——unity篇02】unity6基础入门——软件下载安装、Unity Hub配置、安装unity编辑器、许可证管理
开发语言·unity·c#·编辑器·游戏引擎
智慧老师27 分钟前
Spring基础分析13-Spring Security框架
java·后端·spring
lxyzcm29 分钟前
C++23新特性解析:[[assume]]属性
java·c++·spring boot·c++23
古希腊掌管学习的神1 小时前
[LeetCode-Python版]相向双指针——611. 有效三角形的个数
开发语言·python·leetcode
赵钰老师1 小时前
【R语言遥感技术】“R+遥感”的水环境综合评价方法
开发语言·数据分析·r语言
V+zmm101341 小时前
基于微信小程序的乡村政务服务系统springboot+论文源码调试讲解
java·微信小程序·小程序·毕业设计·ssm
就爱学编程1 小时前
重生之我在异世界学编程之C语言小项目:通讯录
c语言·开发语言·数据结构·算法