MyBatis

MyBatis

什么是MyBatis

MyBatis是一款优秀的持久层框架,用于简化JDBC开发
官网:https://mybatis.net.cn/

持久层

负责将数据保存到数据库的那一层代码
JavaEE的三层架构:表现层、业务层、持久层

MyBatis简化

JDBC举例:

//1、注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2、获取Connection连接
String url = "jdbc:mysql:///db1?useSSL=false";
String uname = "root";
String pwd = "1234";
Connection conn = DriverManager.getConnection(url,uname,pwd);
//接收输入的查询条件
String gender = "男";
//定义sql
String sql = "select * from tb_user where gender = ?";
//获取pstmt对象
PreparedStatement pstmt = conn.prepareStatement(sql);
//设置?的值
pstmt.setString(1.gender);
//执行sql
ResultSet rs = pstmt.executeQuery();
//遍历Result,获取数据
User user = null;
ArrayList<User> users = new ArrayList<>();
while(rs.next()){
	//获取数据
	int id = rs.getInt("id");
	String usename = rs.getString("username");
	String password = rs.getString("password");
	//创建对象,设置属性值
	user = new User();
	user.setId(id);
	user.setUsername(username);
	user.setPassword(password);
	user.setGender(gender);
	//转入集合
	user.add(user);
}
//释放资源
rs.close();
pstmt.close();
conn.close();

在这里插入图片描述

MyBatis快速入门

步骤:
在这里插入图片描述
MyBatis核心配置文件

<!-- 数据库连接信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="xxxxxx"/>

pom.xml:

<dependencies>

        <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.5</version>
        </dependency>
        <!-- mysql 驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.32</version>
        </dependency>
        
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>

        <!-- 添加slf4j日志api -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.20</version>
        </dependency>
        <!-- 添加logback-classic依赖 -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>
        <!-- 添加logback-core依赖 -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.2.3</version>
        </dependency>	

    </dependencies>

Mapper代理开发

目的:
解决原生方式中的硬编码
简化后期执行SQL

步骤:
1、定义与SQL映射文件同名的Mapper接口,并将接口Mapper和SQL映射文件放置在同一目录下
(SQL映射文件尽量都放置在resources下,便于项目的开发。)
(在创建文件时不使用“.”,使用“/”,虽然显示成“.”,但可以满足要求)
2、设置SQL映射文件的namespace属性为Mapper接口全限定名

<mapper namespace="com.MyBatisDemo.mapper.UserMapper">
········
</mapper>

3、在Mapper接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
4、编码
①通过SqlSession的getMapper方法获取Mapper接口的代理对象
②调用对应方法完成sql的执行

细节:如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载

    <mappers>
        <!-- Mapper代理方式-->
        <package name="com.MyBatis.mapper"/>
    </mappers>

总结:整个运行流程
获取了SqlSession对象,
SqlSession sqlSession = sqlSessionFactory.openSession();
通过他来获取一个对应的Mapper,获取一个UserMapper接口的代理对象,通过这行代码
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
就可以找到UserMapper的接口,又因为在当前目录下面有一个同名的映射文件,可以找到对应的UserMapper的xml文件,就可以找到对应的sql语句。
通过serMapper.selectAll()来调用他的方法,一调用方法,UserMapper这位置的selectAll()方法就对应了sql语句的id,就可以找到这个文件里面的对应的id,有了id之后就可以获取对应的sql语句,之后又因为返回值是list,所以底层执行的还是sqlSession.selectList(“test.selectAll”);

MyBatis核心配置文件

environment :配置数据库连接环境信息,可以配置多个,通过default属性切换不同的environment。
transactionManager:事务的管理方式(后会被Spring取代)
dataSource:数据库连接池(后会被Spring取代)

类型别名:

 <typeAliases>
        <package name="com.MyBatisDemo.pojo"/>
    </typeAliases>

配置文件完成增删改查

要完成的功能:
1、查询
查询所有数据
查看详情
条件查询
2、添加
3、修改

修改全部字段
修改动态字段
4、删除
删除一个
删除全部

准备环境:
创设数据表tb_brand
实体类Brand
新建测试用例
安装MyBatisX插件

MyBatisX插件介绍:他是一款基于IDEA的快速开发插件,为效率而生

查询-查询所有数据


完成该功能使用哪些sql语句?——————select * from tb_brand;
要不要参数?——————不要
完成了之后给用户返回的——————List集合里放Brand对象

总结:

<!--
数据库表的字段名称   和   实体类的属性名称不一样  , 则不能自动封装数据
     * 起别名:对不一样的列明起别名,让别名和实体类的属性名一样
         *缺点:每次查询都要定义一次别名     使用sql片段解决该问题  *缺点:不灵活
     * resultMap:
        1、定义<resultMap>标签
        2、在<select>标签中,使用resultMap属性替换resultType属性
-->
<!--    id:唯一标识
        type:映射的类型,支持别名
-->
    <resultMap id="brandResultMap" type="brand">
<!--        id:完成主键字段的映射
                column:表的列名
                property:实体类的属性名
            result:完成一般字段的映射
                column:表的列名
                property:实体类的属性名
            -->
        <result column="brand_name" property="brandName"></result>
        <result column="company_name" property="companyName"></result>
    </resultMap>
    <select id="selectAll" resultMap="brandResultMap">
        select *
        from tb_brand;
    </select>

在这里插入图片描述

查询-查看详情

在这里插入图片描述

<!--    参数占位符:
            #{}    会将其替换为?,为了防止SQL注入
            ${}    拼sql,会存在SQL注入问题
            使用时机: 参数传递的时候使用#{}
                     表名或者列名不固定的情况下,使用${}

        参数类型: parameterType:可以省略
        特殊字符处理:
            转义字符
            CDATA区:大写CD,根据提示补全  防止想要输入的特殊字符
-->
    <select id="selectById" resultMap="brandResultMap">
        select *
        from tb_brand where  id = #{id};
    </select>

总结:
在这里插入图片描述

查询-多条件查询

在这里插入图片描述
总结:
在这里插入图片描述

查询-动态查询

多条件的动态条件查询

在这里插入图片描述
总结:
在这里插入图片描述

单条件的动态条件查询

从多个条件中选择一个
choose(when,otherwise):选择,类似于Java中的switch语句

添加

在这里插入图片描述
在这里插入图片描述

返回添加数据的主键
<insert id="add" useGeneratedKeys="true" keyProperty="id"></insert>

修改

修改全部字段

在这里插入图片描述

修改动态字段

在这里插入图片描述

删除

删除一个

在这里插入图片描述

批量删除

在这里插入图片描述

MyBatis参数传递

单个参数:
	POJO类型:直接使用,属性名 和 参数占位符名称一致
	Map集合:直接使用,属性名 和 参数占位符名称一致
	Collection:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
		map.put("arg0",collection集合)
		map.put("collection",collection集合)
	List:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
		map.put("arg0",list集合)
		map.put("collection",list集合)
		map.put("list",list集合)
	Array:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
		map.put("arg0",数组)
		map.put("array",数组)
	其他类型:直接使用



多个参数:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
	map.put("arg0",参数值1)
	map.put("param1",参数值1)
	map.put("param2",参数值2)
	map.put("arg1",参数值2)
	--------------------@Param("username")
	map.put("username",参数值1)
	map.put("param1",参数值1)
	map.put("param2",参数值2)
	map.put("arg1",参数值2)

在这里插入图片描述
建议:
将来都使用@Param注解来修改Map集合中默认的键名,并使用修改后的名称来获取值,这样可读性更高

注解完成增删改查

使用注解开发比配置文件开发更为方便
在这里插入图片描述
使用注解来映射简单 语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java注解不仅力不从心,还会让本来就复杂的SQL语句更加混乱不堪,因此,如果需要做一些很复杂的操作,最好用XML来映射语句。
选择何种方式来配置映射,以及认为是否应该要统一映射语句定义的形式,取决于个人。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值