Java Web(二)MyBatis

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 对与Java web的Mybatis做了一个简单的介绍以及使用

MyBatis

一.MyBatis简介

1.什么是MyBatis
  • MyBatis是一款优秀的持久层框架,用于简化 JDBC 开发
  • MyBatis本是Apache的一个开源项目iBatis,2010年这个项目由apache softwarefoundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github
  • 官网:https://mybatis.org/mybatis-3/zh/index.html
2.持久层
  • 负责将数据到保存到数据的那一层代码
  • JavaEE三层架构:表现层、业务层、持久层
3.框架
  • 框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型
  • 在框架的基础之上构建软件编写更加高效、规范、通用、可扩展

二.MyBatis简化

1.JDBC缺点

1.硬编码

注册驱动,获取连接SQL语句

2.操作繁琐

手动设置参数手动封装结果集

//1.注册驱动

Class.forName("com.mysql.jdbc.Driver");

//2.获取Connection.连接

Stringurl="jdbc:mysql:///db1?useSSL=false";

Stringuname"root";

Stringpwd="1234";

Connectionconn=DriverManager.getConnection(url,uname,pwd);

∥接收输入的查询条件

Stringgender="男"

∥定义sql

Stringsql"select from tb_user where gender = ?";

∥获取pstmt对象

PreparedStatementpstmt=  conn.prepareStatement(sql);

∥设置?的值

pstmt.setString(1,gender);

∥执行sql

ResultSetrs=pstmt.executeQuery();

∥遍历Result,获取数据

Useruser=null;

ArrayList<User>usersnewArrayList<>();

while (rs.next(){

∥获取数据

   intidrs.getInt("id");

   Stringusername=rs.getString("username");

   Stringpassword=rs.getString("password");

   ∥创建对象,设置属性值

   user=newUser();

   user.setld(id);

   user.setUsername(username);

   user.setPassword(password);

   user.setGender(gender);

   ∥装入集合

   users.add(user);

}

MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作

三.MyBatis快速入门

1.查询user表中所有数据

1.创建user表,添加数据

2.创建模块,导入坐标

3.编写小yBatis核心配置文件->替换连接信息解决硬编码问题

4.编写SQL映射文件->统一管理sq语句,解决硬编码问题

5.编码

       1.定义P0J0类

       2.加载核心配置文件,获取SqlSessionFactory对象

       3.获取SqlSession对象,执行SQL语句

       4.释放资源

createdatabase mybatis;

use mybatis;

droptableifexists tb_user;

createtable tb_user(

       id intPRIMARYkeyauto_increment,

       username varchar(20),

       passwordvarchar(20),

       gender char(1),

       addr varchar(30)

);

insertinto tb_user values(1,'张三','123','男','北京');

insertinto tb_user values(2,'李四','345','女','上海');

insertinto tb_user values(3,'王五','567','男','成都');

2.解决SQL映射文件的警告提示
  • 产生原因:Idea和数据库没有建立连接,不识别表信息
  • 解决方式:在ldea中配置MySQL数据库连接

四.Mapper代理开发

1.目的

解决原生方式中的硬编码

简化后期执行SQL

       List<User>users=sqlSession.  selectList("test.selectAll");

       System.out.println(users);

       //3.获取接口代理对象

       UserMapperuserMapper=sqlSession.getMapper(UserMapper.class);

       //4.执行方法,其实就是执行sgL语句

       List<User>users=userMapper.selectAll();

2.使用Mapper代理方式完成入门案例

1.定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下

2.设置SQL映射文件的namespace)属性为Mapper接口全限定名

3.在Mapper接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致4.编码

4.1.通过SqlSession的getMapper方法获取Mapper接口的代理对象4.2.调用对应方法完成sq的执行

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

五.MyBatis核心配置文件

1.environments

配置数据库连接环境信息.可以配置多个environment,通过不同的default属性切换不同的environment

   <environmentsdefault="development">

       <environmentid="development">

           <transactionManagertype="JDBC"/>

           <dataSourcetype="POOLED">

               <!-- 数据库连接信息 -->

               <propertyname="driver"value="com.mysql.cj.jdbc.Driver"/>

               <propertyname="url"value="jdbc:mysql:///mybatis?useSSL=false"/>

               <propertyname="username"value="root"/>

               <propertyname="password"value="123456"/>

           </dataSource>

       </environment>

   </environments>

2.mappers

   </environments>

   <mappers>

       <!-- 加载sql映射文件 -->

       <mapperresource="com/gbx/mapper/UserMapper.xml"/>

       <!-- Mapper代理方式 -->

       <packagename="com.gbx.mapper"/>

   </mappers>

3.typeAliases

类型别名可为Java类型设置一个缩写名字。它仅用于XML配置,意在降低冗余的全限定类名书写。

   <typeAliases>

       <packagename="com.gbx.pojo"/>

   </typeAliases>

六.MyBatis完成CURD

查询

  • 查询所有数据
  • 查看条件
  • 条件查询

添加

修改

  • 修改全部字段
  • 修改动态字段

删除

  • 删除一个
  • 批量删除
1.通过配置xml文件
1.1准备环境

数据库表tb_ brand实体类Brand测试用例安装MyBatisX:插件

#删除tb_brand表

droptableifexists tb_brand;

#创建tb_brand表

createtable tb_brand

(

   #id  主键

   id  intprimarykeyauto_increment,

   # 品牌名称

   brand_name  varchar(20),

   # 企业名称

   company_name  varchar(20),

   #排序字段

   ordered  int,

   # 描述信息

   description  varchar(100),

   #状态: 0 :禁用  1: 启动

   statusint

);

insertinto tb_brand(brand_name,company_name,ordered,description,status)

values('三只松鼠','三只松鼠股份有限公司',5,'好吃不上火',0),

     ('华为','华为技术有限公司',100,'华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界',1),

     ('小米','小米科技有限公司',50,'are you ok',1);

select*from tb_brand;

@Data

publicclassBrand {

   //id 主键

   privateIntegerid;

   //品牌名称

   privateStringbrandName;

   //企业名称

   privateStringcompanyName;

   //排序字段

   privateIntegerordered;

   //描述信息

   privateStringdescription;

   //状态:0:禁用1:启用

   privateIntegerstatus;

}

1.2MyBatisX

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

主要功能:

  • XML和接口方法相互跳转
  • 根据接口方法生成statement
1.3查询

查询所有

1.编写接口方法:Mapper接口

  • 参数:无
  • 结果:List<Brand>

2.编写SQL语句:SQL映射文件:3.执行方法,测试

publicinterfaceBrandMapper {

   /**

    * 查询所有

    */

   publicList<Brand>selectAll();

}

<?xmlversion="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper

       PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

       "https://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--

namespace:名称空间

-->

<mappernamespace="com.gbx.mapper.BrandMapper">

   <selectid="selectAll"resultType="brand">

       select * from

       tb_brand;

   </select>

</mapper>

publicclassMyBatisTest {

   @Test

   publicvoidtestSelectAll() throwsIOException {

       //1.获取SqlSessionFactory

       Stringresource="mybatis-config.xml";

       InputStreaminputStream=Resources.getResourceAsStream(resource);

       SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream);

       //2.获取SqlSession对象

       SqlSessionsqlSession=sqlSessionFactory.openSession();

       //3.获取Mapper接口的代理对象

       BrandMapperbrandMapper=sqlSession.getMapper(BrandMapper.class);

       //4.执行方法

       List<Brand>brands=brandMapper.selectAll();

       System.out.println(brands);

       //5.释放资源

       sqlSession.close();

   }

}

MyBatis完成操作需要几步?三步:编写接口方法>>编写>>执行方法

实体类属性名和数据库表列名不一致,不能自动封装数据1)起别名:在SQL语句中,对不一样的列名起别名,别名和实体类属性名一样可以定义<sql>片段,提升复用性2)resultMap:定义<resultMap>完成不一致的属性名和列名的映射

<!--

   数据库表的字段名称  和  实体类的属性名称不一样,则不能自动封装数据

      *起别名: 对不一样的列名起别名,让别名和实体类的属性名一样

           *缺点:每次查询都要定义一次别名

               *解决办法:sql 片段

                   缺点:不灵活

-->

<selectid="selectAll"resultType="com.gbx.pojo.Brand">

   select id,brand_name as brandName,company_name as companyName,ordered,description,status

   from tb_brand;

</select>

<!--

 sql 片段

-->

<sqlid="brand_column">

   id,brand_name as brandName,company_name as companyName,ordered,description,status

</sql>

<selectid="selectAll"resultType="com.gbx.pojo.Brand">

   select

       <includerefid="brand_column"/>

   from tb_brand;

</select>

<!--

   数据库表的字段名称  和  实体类的属性名称不一样,则不能自动封装数据

   *resultMap:

       1.定义<resultMap>标签

       2.使用resultMap属性替换 resultType属性

-->

<!--

   id:唯一标识

   type:映射的类型,支持别名

-->

<resultMapid="brandResultMap"type="brand">

   <!--

       id:完成主键的映射

           column:表的列名

           property:实体类的属性名

       result:完成一般字符的映射

    -->

   <resultcolumn="brand_name"property="brandName"/>

   <resultcolumn="company_name"property="companyName"/>

</resultMap>

<selectid="selectAll"resultType="brandResultMap">

   select

   *

   from tb_brand;

</select>

查看详情

1.编写接口方法:Mapper接口参数:id结果:Brand2.编写SQL语句:SQL映射文件3.执行方法,测试

<!--

*参数占位符:

           1.#{}:会将其替换成 ? .为了防止sql注入

           2.${}:拼sql 会存在sql注入问题

           3.使用时机:

                   *在参数传递的时候: #{}

                   *表明或者列名不固定的情况下:${}会存在sql注入问题

           *参数类型:parameterType:可以省略

           *特殊字符处理:

                   1.转义字符:

                   2.CDATA区

                   <I[CDATA[内容]>

-->

<selectid="selectById"parameterType="int"resultMap="brandResultMap">

   select * from tb_brand where id = #{id};

</select>

条件查询

1.多条件查询

1.编写接口方法:Mapper接口

参数:所有查询条件结果:List<Brand>

2.编写SQL语句:SQL映射文件3.执行方法,测试

   List<Brand>selectByCondition(@Param("status")intstatus,@Param("companyName") StringcompanyName,@Param("brandName")StringbrandName);

   <selectid="selectByCondition"resultType="brandResultMap">

       select*fromtb_brand

       wherestatus=#{status} andcompany_namelike#{companyName}

       andbrand_namelike#{brandName}

   </select>

       

   @Test

   publicvoidtestSelectByCondition() throwsIOException {

       //接收参数

       intstatus=1;

       StringcompanyName="华为";

       StringbrandName="华为";

       //处理参数

       companyName="%"+companyName+"%";

       brandName="%"+brandName+"%";

       //1.获取SqlSessionFactory

       Stringresource="mybatis-config.xml";

       InputStreaminputStream=Resources.getResourceAsStream(resource);

       SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream);

       //2.获取SqlSession对象

       SqlSessionsqlSession=sqlSessionFactory.openSession();

       //3.获取Mapper接口的代理对象

       BrandMapperbrandMapper=sqlSession.getMapper(BrandMapper.class);

       //4.执行方法

       List<Brand>brands=brandMapper.selectByCondition(status, companyName, brandName);

       System.out.println(brands);

       //5.释放资源

       sqlSession.close();

   }

   List<Brand>selectByCondition(Brandbrand);

   <selectid="selectByCondition"resultType="brandResultMap">

       select*fromtb_brand

       wherestatus=#{status} andcompany_namelike#{companyName}

       andbrand_namelike#{brandName}

   </select>

   

   @Test

   publicvoidtestSelectByCondition() throwsIOException {

       //接收参数

       intstatus=1;

       StringcompanyName="华为";

       StringbrandName="华为";

       //处理参数

       companyName="%"+companyName+"%";

       brandName="%"+brandName+"%";

       //封装对象

       Brandbrand=newBrand();

       brand.setStatus(status);

       brand.setCompanyName(companyName);

       brand.setBrandName(brandName);

       //1.获取SqlSessionFactory

       Stringresource="mybatis-config.xml";

       InputStreaminputStream=Resources.getResourceAsStream(resource);

       SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream);

       //2.获取SqlSession对象

       SqlSessionsqlSession=sqlSessionFactory.openSession();

       //3.获取Mapper接口的代理对象

       BrandMapperbrandMapper=sqlSession.getMapper(BrandMapper.class);

       //4.执行方法

       List<Brand>brands=brandMapper.selectByCondition(brand);

       System.out.println(brands);

       //5.释放资源

       sqlSession.close();

   }

   List<Brand>selectByCondition(Mapmap);

   <selectid="selectByCondition"resultType="brandResultMap">

       select*fromtb_brand

       wherestatus=#{status} andcompany_namelike#{companyName}

       andbrand_namelike#{brandName}

   </select>

   

   @Test

   publicvoidtestSelectByCondition() throwsIOException {

       //接收参数

       intstatus=1;

       StringcompanyName="华为";

       StringbrandName="华为";

       //处理参数

       companyName="%"+companyName+"%";

       brandName="%"+brandName+"%";

       //Map集合

       Mapmap=newHashMap();

       map.put("status",status);

       map.put("companyName",companyName);

       map.put("brandName",brandName);

       //1.获取SqlSessionFactory

       Stringresource="mybatis-config.xml";

       InputStreaminputStream=Resources.getResourceAsStream(resource);

       SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream);

       //2.获取SqlSession对象

       SqlSessionsqlSession=sqlSessionFactory.openSession();

       //3.获取Mapper接口的代理对象

       BrandMapperbrandMapper=sqlSession.getMapper(BrandMapper.class);

       //4.执行方法

       List<Brand>brands=brandMapper.selectByCondition(map);

       System.out.println(brands);

       //5.释放资源

       sqlSession.close();

   }

2.动态查询

SQL语句会随着用户的输入或外部条件的变化而变化,我们称为动态SQL

<selectid="selectByCondition"resultMap="brandResultMap">

   select  *

   from tb_brand

   where

           if(status!=null)

                     status =#status)

       and company name like #{companyName}

       and brand name like #{brandName)

<select>

MyBatis对动态SQL有很强大的支撑:

  • if
  • choose (when,otherwise)
  • trim (where,set)
  • foreach
2.1if查询

   <!--

   动态条件查询

       *if:条件判断

           *test:逻辑表达式

       *问题:第一个条件不需要逻辑运算符

           *恒等式

           *<where>替换where关键字

   -->

   <selectid="selectByCondition"resultType="brandResultMap">

       select * from tb_brand

       where

       <iftest="status!=null">

           status = #{status}

       </if>

       <iftest="companyName!=null and companyName!=''">

           and company_name like #{companyName}

       </if>

       <iftest="brandName!=null and brandName!=''">

           and brand_name like #{brandName}

       </if>

   </select>

2.2choose(when,otherwise)查询

从多个条件中选择个.

类似于Java中的switch语句

<selectid="selectByConditionSingle"resultMap="brandResultMap">

   select

   from tb_brand

   where

   <choose><!-类似于switch->

       <whentest=:"status=nul"><!-类似于case->

           status =#{status)

       </when>

       <whentest="companyName!=null and companyName !="">

           company_name like #{companyName}

       </when>

       <when test="brandName!nullandbrandName!=""

           brand_namelike#{brandName}

       </when>

       <otherwise><I-类似于default->

           1=1

       </otherwise>

   </choose>

</select>

3.添加

1.编写接口方法:Mapper接口

  • 参数:除了id之外的所有数据
  • 结果:void

2.编写SQL语句:SQL映射文件

3.执行方法,测试

MyBatis事务:

  • openSession0:默认开启事务,进行增删改操作后需要使用sqlSession.commit0;手动提交事务
  • openSession(true):可以设置为自动提交事务(关闭事务)

   /**

    * 添加

    */

   voidadd(Brandbrand);

   <insertid="add">

       insert into tb_brand (brand_name,company_name,ordered,description,status)

       values (#{brandName},#{companyName},#{ordered},#{description},#{status});

   </insert>

<insertid="add">

   insert into tb_brand (brand_name,company_name,ordered,description,status)    

   values (#{brandName},#{companyName},#{ordered},#{description},#{status});

</insert>

   @Test

   publicvoidtestAdd() throwsIOException {

       //接收参数

       intstatus=1;

       StringcompanyName="菠萝手机";

       StringbrandName="菠萝";

       Stringdescription="菠萝手机,手机中的战斗机";

       intordered=100;

       

       //封装对象

       Brandbrand=newBrand();

       brand.setStatus(status);

       brand.setCompanyName(companyName);

       brand.setBrandName(brandName);

       brand.setDescription(description);

       brand.setOrdered(ordered);

       

       //1.获取SqlSessionFactory

       Stringresource="mybatis-config.xml";

       InputStreaminputStream=Resources.getResourceAsStream(resource);

       SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream);

       //2.获取SqlSession对象

       //方式一

       SqlSessionsqlSession=sqlSessionFactory.openSession();

       //方式二  自动提交事务

       SqlSessionsqlSession=sqlSessionFactory.openSession(true);

       //3.获取Mapper接口的代理对象

       BrandMapperbrandMapper=sqlSession.getMapper(BrandMapper.class);

       //4.执行方法

       brandMapper.add(brand);

       //提交事务

       sqlSession.commit();

       //5.释放资源

       sqlSession.close();

   }

3.1主键返回

在数据添加成功后,需要获取插入数据库数据的主键的值

  • 比如:添加订单和订单项

1.添加订单

2.添加订单项,订单项中需要设置所属订单的id

<insertid="add"useGeneratedKey="true"keyProperty="id">

   insert into tb_brand (brand_name,company_name,ordered,description,status)    

   values (#{brandName},#{companyName},#{ordered},#{description},#{status});

</insert>

   @Test

   publicvoidtestAdd2() throwsIOException {

       //接收参数

       intstatus=1;

       StringcompanyName="菠萝手机";

       StringbrandName="菠萝";

       Stringdescription="菠萝手机,手机中的战斗机";

       intordered=100;

       

       //封装对象

       Brandbrand=newBrand();

       brand.setStatus(status);

       brand.setCompanyName(companyName);

       brand.setBrandName(brandName);

       brand.setDescription(description);

       brand.setOrdered(ordered);

       

       //1.获取SqlSessionFactory

       Stringresource="mybatis-config.xml";

       InputStreaminputStream=Resources.getResourceAsStream(resource);

       SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream);

       //2.获取SqlSession对象

       //方式一

       SqlSessionsqlSession=sqlSessionFactory.openSession();

       //方式二  自动提交事务

       SqlSessionsqlSession=sqlSessionFactory.openSession(true);

       //3.获取Mapper接口的代理对象

       BrandMapperbrandMapper=sqlSession.getMapper(BrandMapper.class);

       //4.执行方法

       brandMapper.add(brand);

       Integerid=brand.getId();

       System.out.println(id);

       //提交事务

       sqlSession.commit();

       //5.释放资源

       sqlSession.close();

   }

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

4.修改
4.1修改全部字段

1.编写接口方法:Mapper接口

  • 参数:所有数据
  • 结果:void

2.编写SQL语句:SQL映射文件3.执行方法,测试

   /**

    * 修改

    */

   

   intupdate(Brandbrand);

<updateid="update">

   update tb_brand

   set

   brand_name=#{brandName},

   company_name=#{companyName},

   ordered=#{brandName},

   description=#{description},

   status=#{status}

   where id = #{id};

</update>

   @Test

   publicvoidtestUpdate() throwsIOException {

       //接收参数

       intstatus=1;

       StringcompanyName="菠萝手机";

       StringbrandName="菠萝";

       Stringdescription="手机中的战斗机";

       intordered=200;

       intid=5;

       

       //封装对象

       Brandbrand=newBrand();

       brand.setStatus(status);

       brand.setCompanyName(companyName);

       brand.setBrandName(brandName);

       brand.setDescription(description);

       brand.setOrdered(ordered);

       brand.setId(id);

       

       //1.获取SqlSessionFactory

       Stringresource="mybatis-config.xml";

       InputStreaminputStream=Resources.getResourceAsStream(resource);

       SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream);

       //2.获取SqlSession对象

       //方式一

       SqlSessionsqlSession=sqlSessionFactory.openSession();

       //方式二  自动提交事务

       SqlSessionsqlSession=sqlSessionFactory.openSession(true);

       //3.获取Mapper接口的代理对象

       BrandMapperbrandMapper=sqlSession.getMapper(BrandMapper.class);

       //4.执行方法

       intcount=brandMapper.update(brand);

       System.out.println(count);

       //提交事务

       sqlSession.commit();

       //5.释放资源

       sqlSession.close();

   }

4.2修改动态字段

1.编写接口方法:Mapper接口

  • 参数:部分数据,封装到对象中
  • 结果:void

2.编写SQL语句:SQL映射文件3.执行方法,测试

<updateid="update">

   update tb_brand

   <set>

       <iftest="brandName !=null and brandName !=''>

           brand_name=#{brandName},

       </if>

       <if test="companyName!=nullandcompanyName!=''>

           company_name=#{companyName,

       </if>

       <iftest="ordered !=null">

           ordered=#{fordered},

       </if>

       <iftest="description !=null and description !=''>

           description=#{description},

       </if>

       <if test="status!=null>

           status=#{status}

       </if>

   </set>

   where id #{id};

</update>

5.删除
5.1删除一个

1.编写接口方法:Mapper接口

  • 参数:id
  • 结果:void

2.编写SQL语句:SQL映射文件

3.执行方法,测试

   voiddeleteById(intid);

<deleteid="deleteById">

   delete from tb_brand where id = #{id};

</delete>

   @Test

   publicvoidtestDeleteById() throwsIOException {

       //接收参数

       intid=6;

       //1.获取SqlSessionFactory

       Stringresource="mybatis-config.xml";

       InputStreaminputStream=Resources.getResourceAsStream(resource);

       SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream);

       //2.获取SqlSession对象

       //方式一

       SqlSessionsqlSession=sqlSessionFactory.openSession();

       //方式二  自动提交事务

       SqlSessionsqlSession=sqlSessionFactory.openSession(true);

       //3.获取Mapper接口的代理对象

       BrandMapperbrandMapper=sqlSession.getMapper(BrandMapper.class);

       //4.执行方法

       brandMapper.deleteById(id);

       //提交事务

       sqlSession.commit();

       //5.释放资源

       sqlSession.close();

   }

5.2批量删除

1.编写接口方法:Mapper接口

  • 参数:id数组
  • 结果:void

2.编写SQL语句:SQL映射文件

3.执行方法,测试

voiddeleteByIds(@Param("ids")int[]ids);

mybatis会将数组参数,封装为一个Map集合。*默认:array=数组

*使用@Param注解改变map集合的默认key的名称

<deleteid="deleteByIds">

   delete from tb_brand where id

   in

       <foreachcollection="array"separator=","open="("close=")">

           #{id}

       </foreach>

   ;

</delete>

   @Test

   publicvoidtestDeleteByIds() throwsIOException {

       //接收参数

       intids= {5,7,8};

       //1.获取SqlSessionFactory

       Stringresource="mybatis-config.xml";

       InputStreaminputStream=Resources.getResourceAsStream(resource);

       SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream);

       //2.获取SqlSession对象

       //方式一

       SqlSessionsqlSession=sqlSessionFactory.openSession();

       //方式二  自动提交事务

       SqlSessionsqlSession=sqlSessionFactory.openSession(true);

       //3.获取Mapper接口的代理对象

       BrandMapperbrandMapper=sqlSession.getMapper(BrandMapper.class);

       //4.执行方法

       brandMapper.deleteByIds(ids);

       //提交事务

       sqlSession.commit();

       //5.释放资源

       sqlSession.close();

   }

6.MyBatis参数传递

MyBatis接口方法中可以接收各种各样的参数,MyBatis底层对于这些参数进行不同的封装处理方式

  • 单个参数:
    1.POO类型:直接使用,属性名和参数占位符名称一致
    2.Map集合:直接使用,键名和参数占位符名称一到
    3.Collection:封装为Map集合
    map.put("arg0",collection集合);map.put("collection",collection集合);
    4.List:封装为Map集合
    map.put("arg0",List集合):map.put("collection",List集合);map.put("List",List集合);
    5.Array:封装为Map集合
    map.put("argo",数组);map.put("array",数组);
    6.其他类型:直接使用
  • 多个参数:封装为Map集合
    map.put("arg0",参数值1)
    map.put("param1",参数值1)
    map.put("param2",参数值2)
    map.put("arg1",参数值2)

MyBatisj提供了ParamNameResolver类来进行参数封装

Userselect(Stringusername,Stringpassword);

<selectid="select"resultType="user">

   select *

   from tb_user

   where

       username = #{arg0}

   and password = #{arg1}

</select>

7.通过注解开发

使用注解开发会比配置文件开发更加方便

@Select("select from tb_user where id =#{id}")

publicUserseectByld(intid);

  • 查询:@Select
  • 添加:@Insert
  • 修改:@Update
  • 删除:@Delete

提示:注解完成简单功能配置文件完成复杂功能

使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java注解不仅力不从心,还会让你本就复杂的SQL语句更加混乱不堪。因此,如果你需要做一些很复杂的操作,最好用XML来映射语句选择何种方式来配置映射,以及认为是否应该要统一映射语句定义的形式,完全取决于你和你的团队。换句话说,永远不要拘泥于一种方式,你可以很轻松的在基于注解和XML的语句映射方式间自由移植和切换

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
20天前
|
监控 JavaScript 前端开发
《理解 WebSocket:Java Web 开发的实时通信技术》
【4月更文挑战第4天】WebSocket是Java Web实时通信的关键技术,提供双向持久连接,实现低延迟、高效率的实时交互。适用于聊天应用、在线游戏、数据监控和即时通知。开发涉及服务器端实现、客户端连接及数据协议定义,注意安全、错误处理、性能和兼容性。随着实时应用需求增加,WebSocket在Java Web开发中的地位将更加重要。
|
1月前
|
Java 数据库连接 mybatis
mybatis简单案例源码详细【注释全面】——实体层(User.java)
mybatis简单案例源码详细【注释全面】——实体层(User.java)
13 0
|
9天前
|
Web App开发 Java 应用服务中间件
【Java Web】在 IDEA 中部署 Tomcat
【Java Web】在 IDEA 中部署 Tomcat
|
18天前
|
安全 前端开发 Java
Java Web开发知识点学习总结
Java Web开发涉及Java基础、Servlet、JSP、数据库操作(SQL+JDBC)、MVC设计模式、Spring框架、Hibernate ORM、Web服务(SOAP&RESTful)、安全认证(HTTP Basic/Digest/OAuth)及性能优化(缓存、异步、负载均衡)。
17 3
|
21天前
|
XML JSON JavaScript
使用JSON和XML:数据交换格式在Java Web开发中的应用
【4月更文挑战第3天】本文比较了JSON和XML在Java Web开发中的应用。JSON是一种轻量级、易读的数据交换格式,适合快速解析和节省空间,常用于API和Web服务。XML则提供更强的灵活性和数据描述能力,适合复杂数据结构。Java有Jackson和Gson等库处理JSON,JAXB和DOM/SAX处理XML。选择格式需根据应用场景和需求。
|
21天前
|
前端开发 安全 Java
使用Java Web框架:Spring MVC的全面指南
【4月更文挑战第3天】Spring MVC是Spring框架的一部分,用于构建高效、模块化的Web应用。它基于MVC模式,支持多种视图技术。核心概念包括DispatcherServlet(前端控制器)、HandlerMapping(请求映射)、Controller(处理请求)、ViewResolver(视图解析)和ModelAndView(模型和视图容器)。开发流程涉及配置DispatcherServlet、定义Controller、创建View、处理数据、绑定模型和异常处理。
使用Java Web框架:Spring MVC的全面指南
|
23天前
|
Java
销售业务管理系统【Web系统】(Java课设)
销售业务管理系统【Web系统】(Java课设)
13 5
|
1月前
|
Java Maven
Maven【2】( Web 工程依赖 Java 工程)(命令行操作)
Maven【2】( Web 工程依赖 Java 工程)(命令行操作)
20 0
|
1月前
|
Java 数据库连接 mybatis
mybatis简单案例源码详细【注释全面】——Utils层(MybatisUtils.java)
mybatis简单案例源码详细【注释全面】——Utils层(MybatisUtils.java)
13 0
|
1月前
|
Java 数据库连接 mybatis
mybatis简单案例源码详细【注释全面】——测试层(UserMapperTest.java)
mybatis简单案例源码详细【注释全面】——测试层(UserMapperTest.java)
9 0