目录
需求:删除id为3的数据(注解开发,不需要映射文件中写sql)
基本操作
创建数据库表
-- 删除tb_brand表
drop table if exists tb_brand;
-- 创建tb_brand表
create table tb_brand
(
-- id 主键
id int primary key auto_increment,
-- 品牌名称
brand_name varchar(20),
-- 企业名称
company_name varchar(20),
-- 排序字段
ordered int,
-- 描述信息
description varchar(100),
-- 状态:0:禁用 1:启用
status int
);
-- 添加数据
INSERT INTO `tb_brand` (`id`, `brand_name`, `company_name`, `ordered`, `description`, `status`) VALUES ('1', '格力', '格力电器股份有限公司', '30', '让世界爱上中国造', '1');
INSERT INTO `tb_brand` (`id`, `brand_name`, `company_name`, `ordered`, `description`, `status`) VALUES ('2', '腾讯', '腾讯计算机系统有限公司', '50', '玩玩玩', '0');
INSERT INTO `tb_brand` (`id`, `brand_name`, `company_name`, `ordered`, `description`, `status`) VALUES ('3', '百度', '百度在线网络技术公司', '5', '搜搜搜', '0');
INSERT INTO `tb_brand` (`id`, `brand_name`, `company_name`, `ordered`, `description`, `status`) VALUES ('4', '京东', '北京京东世纪贸易有限公司', '40', '就是快', '1');
INSERT INTO `tb_brand` (`id`, `brand_name`, `company_name`, `ordered`, `description`, `status`) VALUES ('5', '小米', '小米科技有限公司', '50', 'are you ok', '1');
INSERT INTO `tb_brand` (`id`, `brand_name`, `company_name`, `ordered`, `description`, `status`) VALUES ('6', '三只松鼠', '三只松鼠股份有限公司', '5', '好吃不上火', '0');
INSERT INTO `tb_brand` (`id`, `brand_name`, `company_name`, `ordered`, `description`, `status`) VALUES ('7', '华为', '华为技术有限公司', '100', '万物互联', '1');
实体类(根据指定路径及表列名创建)
略,不建议创建带参构造
接口方法
测试类(以查询表格数据为例,没有传参)
工具类
建议先判空,不用重复创建SQLSession对象
// 1.加载mybatis核心配置文件,获取SQLSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 2.获取SQLSession对象,用它来执行sql
SqlSession sqlSession = sqlSessionFactory.openSession(true);
// 4.通过sqlSession调用mapper的代理对象
BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
// 5.通过mapper调用定义的方法 可改
List<Brand> brands = mapper.selectAll();
System.out.println(brands);
// 4.释放资源
sqlSession.close();
传参
- 如果是单个参数,使用#{}接受参数
- 如果是多个参数,定义一个对象,成员变量的名字和#{变量对应
需求:删除id为3的数据(注解开发,不需要映射文件中写sql)
接口方法
// 删除指定数据
@Delete("delete from tb_brand where id = #{id}")
public void deleteOne(Integer id);
测试代码
修改为 mapper.deleteOne(3);
需求:查询id为2的数据(映射文件中写sql)
映射文件
<select id="selectOne" resultMap="brandMap">
select * from tb_brand where id = #{id};
</select>
接口代码
public Brand selectOne(Integer id);
测试代码
Brand brand = mapper.selectOne(2);
需求:修改id为1的数据
映射文件
<!---brand_name 无法获取值,因为对象中的属性是brandName --->
<!---解决办法1:mybatis框架自带的驼峰命名转换设置
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
--->
<!---解决办法2:在命名空间下定义一个resultMap 将selectType替换为resultMap
column列名 property实体变量名
<resultMap id="brandMap" type="com.itheima.pojo.Brand">
<result column="brand_name" property="brandName" />
<result column="company_name" property="companyName" />
</resultMap>
--->
<!---解决办法3:加别名 --->
<!---如果是注解开发:@ResultMap(“映射文件中resultmap的id”) --->
<update id='updateById'>
update tb_brand set brand_name = #{brandName} .... status = #{status} where id = #{id}
</update>
接口代码
public void updateById(Brand brand);
测试代码
Brand brand = new Brand();//不用带参构造,不灵活不安全
brand.setBrandName("tengxun");
.
.
.
.
brand.setStatus(1);
brand.setId(2);
mapper.updateById(brand);
需求:增加一条数据(主键)
映射文件
<!-- 如果要主键返回,增加两个属性 keyProperty = 'id' useGeneratedKeys = 'true' >
<insert id = "addBrand" keyProperty = "id" useGeneratedKeys = "true">
insert into tb_brand (brand_name,...,status)
values (#{brandName},...)
</insert>
接口代码
public int addBrand(Brand brand);
测试代码
Brand brand = new Brand();//不用带参构造,不灵活不安全
//没有也不用设置id的值
brand.setBrandName("tengxun");
.
.
.
.
brand.setStatus(1);
brand.setId(2);
.
.
.
int i = mapper.addBrand(brand);
sout()
//释放
结果映射以及多个参数传值以及特殊字符处理
需求:查询id>2 status = 1的数据
映射文件
<select id="selectByCondition" resultType="com.itheima.pojo.Brand">
select * from tb_brand where id > #{startid} and id <![CDATA[
< ]]> #{endid} and status = #{status}
</select>
接口代码
// 散装参数传值,使用@Param注解进行声明#{变量}的名字
// 对象参数,直接用对象传值
// Map参数,保证key和#{变量}一致
// 根据指定条件查询
public List<Brand> selectByCondition(@Param("startid") Integer startid, @Param("endid") Integer endid,@Param("status") Integer status);
测试代码
List<Brand> brands = mapper.selectByCondition(2, 6, 1);
System.out.println(brands);
动态SQL
<where>标签自动更正语句,解决and问题
<if test = "条件判断">
<set>标签解决多一个,问题
<update>标签用来解决where为空时的问题
<choose>和<when>相当于switch,otherwise保底
<foreach>批量删除:拼接(1,2,3,4)
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有item,index,collection,open,separator,close。item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:
如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key
————————————————
版权声明:本文为CSDN博主「qq_36759871」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36759871/article/details/68488776
映射文件
<!---批量删除 使用foreach标签 拼接(1,2,3,4)
批量删除 collection
--->
<delete id = "deleteById>
delete from tb_brand where id in
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</delete>