当前位置: 首页 > ai >正文

mybatis框架补充

一,#{} ${}区别

1.传数值

#{}  占位符,是经过预编译的,编译好SQL语句再取值,#方式能够防止sql注入

eg:#{}:delete from admin where id = #{id}

        结果: dalete from admin where id = ?

${}会将值以字符串形式拼接到sql语句,${}方式无法防止SQL注入

eg:sql注入演示

        ${}:delete from admin where id = '${id or 1}'

        结果:这样使整张表的数据被删除了,所以相比于#{},#{}在对单独数据处理时更加安全

2.传列名

select * from admin order by ${column} desc

order by ${column} 语句后面可以动态替换列名

二,特殊处理定义resultMap

1.定义resultMap

<resultMap id="adminResultMap" type="Admin">
<id column="id" property="id"/>
<result property="acc" column="account" />
<result property="pwd" column="password" />
</resultMap>

(1).resultMap的id属性时resultMap的唯一标识,本例中定义为"adminResultMap"

(2).resultMap的type属性是映射的POJO类型,(指模型类中属性类型,首字母大写)

(3)id标签映射主键,result标签映射非主键

(4)property设置对象属性名称,column映射查询结果的列名称

2.使用resultMap

<select id="findAdminInfoResultMap" resultMap="adminResultMap">
SELECT id ,account,password FROM admin
</select>

(1)本例输出映射使用的是resultMap,而非resultType

(2)resultMap引用了adminResultMap

三,多表关联处理结果集

resultMap元素中association,collection元素

association适用于一对一关系

collection适用于一对多关系

eg1:

查找一个专业及其所包含学生人数(一对多使用Collection)

使用resultMap组装查询结果

<?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.ffyc.mybatisdemo.dao.MajorDao"><resultMap id="majormap" type="Major"><id column="id" property="id"/><result column="name" property="name"/><collection property="students" javaType="arraylist" ofType="Student"><id column="sid" property="id"/><result column="sname" property="name"/><result column="snum" property="num"/></collection>
</resultMap><select id="findMajor" parameterType="int" resultMap="majormap">selectm.id,m.name,s.id sid,s.name sname,s.num snumfrom major m inner join student s on m.id = s.majoridwhere m.id = #{id}</select></mapper>
package com.ffyc.mybatisdemo.dao;import com.ffyc.mybatisdemo.model.Major;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;public interface MajorDao {Major findMajor(int id);/*简单的sql,可以在抽象方法上使用注解标签写sql,复杂的还是推荐写道Mapper文件中*/@Insert("insert into major(name)values (#{name})")int insertMajor(Major major);}
package com.ffyc.mybatisdemo.test;import com.ffyc.mybatisdemo.dao.MajorDao;
import com.ffyc.mybatisdemo.dao.StudentDao;
import com.ffyc.mybatisdemo.model.Major;
import com.ffyc.mybatisdemo.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;import java.io.IOException;public class TestMajor {public static void main(String[] args) throws IOException {SqlSession sqlSession = MybatisUtil.getSqlSession();MajorDao majorDao = sqlSession.getMapper(MajorDao.class);Major major = majorDao.findMajor(1);System.out.println(major);//        Major major = new Major();
//        major.setName("数学");
//
//        System.out.println(majorDao.insertMajor(major));
//sqlSession.close();}}

eg2:通过学号查找对应学生的信息(一对一  使用associate)

使用resultMap组装查询结果

<?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.ffyc.mybatisdemo.dao.StudentDao"><resultMap id="studentmap" type="Student"><id property="id" column="id"/><result property="num" column="num"/><result property="gender" column="gender"/><result property="name" column="name"/><result property="phone" column="phone"/><!--关联表数据映射   会自动创建关联对象--><association property="major" javaType="Major"><id column="mid" property="id"/><result column="mname" property="name"/></association></resultMap><select id="findStudentById" parameterType="int" resultMap="studentmap">selects.id,s.num,s.gender,s.phone,m.id mid,m.name mnamefrom student s inner join major m on s.majorid=m.idwhere s.id = #{id}</select><select id="findStdents" resultMap="studentmap">selects.id,s.num,s.gender,s.phone,m.id mid,m.name mnamefrom student s inner join major m on s.majorid=m.id</select>
</mapper>
package com.ffyc.mybatisdemo.dao;import com.ffyc.mybatisdemo.model.Student;import java.util.ArrayList;public interface StudentDao {Student findStudentById(int id);ArrayList<Student> findStdents ();}
package com.ffyc.mybatisdemo.test;import com.ffyc.mybatisdemo.dao.StudentDao;
import com.ffyc.mybatisdemo.model.Student;
import com.ffyc.mybatisdemo.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;import java.io.IOException;
import java.util.ArrayList;public class TestStudent {public static void main(String[] args) throws IOException {SqlSession sqlSession = MybatisUtil.getSqlSession();StudentDao studentDao = sqlSession.getMapper(StudentDao.class);Student student = studentDao.findStudentById(3);System.out.println(student.getMajor().getName());ArrayList<Student> students = studentDao.findStdents();System.out.println(students);System.out.println(student);sqlSession.close();}}

四.使用注解的方式实现mybatis交互数据库

1.常用注解方式

(1)@Insert : 插入sql , xml insert sql语法完全一样

(2)@Select : 查询sql, xml select sql语法完全一样

(3)@Update : 更新sql, xml update sql语法完全一样

(4)@Delete : 删除sql, xml delete sql语法完全一样

(5)@Results : 设置结果集合   

(6)@Result : 设置结果

2.使用案例

查询所有信息:

@Select("select * from t_emp")
@Results(id = "empMap",value = {
@Result(column = "emp_id",property = "empId",id = true),
@Result(column = "emp_name",property = "empName"),
@Result(column = "emp_tel",property = "empTel"),
@Result(column = "emp_education",property = "empEducation"),
@Result(column = "emp_birthday",property = "empBirthday")
})
List<Employee> getAll();

查询单个信息:

@Select("select * from t_emp where emp_id=#{empId}")
Employee getById(@Param("empId") Integer empId);

插入信息:

@Insert("insert into t_emp (emp_id, emp_name, emp_tel, " +
" emp_education, emp_birthday, fk_dept_id" +" )" values (#{empId}, #{empName}, #
{empTel}, " +" #{empEducation}, #{empBirthday}, #{fkDeptId}" +" )")
int insert(Employee record);

删除信息:
 

@Delete("delete from t_emp where id = #{empId}")
void delete(@Param("empId") Integer empId);

http://www.xdnf.cn/news/1467.html

相关文章:

  • Spring JDBC 的开发步骤(非注解方式)
  • HashedWheelTimer源码分析
  • 网络安全中Base64编码到后端是何解了
  • 图解Mysql原理:深入理解事务的特性以及它的实现机制
  • IDEA设置手动代理,用户名密码被加密无法通过代码修改的解决方案
  • 4082P 信号/频谱分析仪
  • Javase 基础入门 —— 03 面向对象编程
  • (三)垂直分库架构、分布式数据库
  • MySQL 锁机制
  • 【EasyPan】MySQL FIELD() 函数实现自定义排序
  • [KVM] KVM挂起状态恢复失败与KVM存储池迁移
  • Geek强大的电脑卸载软件工具,免费下载
  • 逻辑漏洞安全
  • 基于javaweb的SSM宠物商城设计与实现(源码+文档+部署讲解)
  • 配电室安全用电漏电保护装置的安全用电措施
  • 高等数学第一章---函数与极限(1.2 数列的极限1)
  • 项目文章 ▏c-di-GMP协同WYL转录因子调控植物乳杆菌肠道定殖的分子机制
  • 互联网黑灰产攻击场景分析
  • 为什么 requests 不是 python 标准库?
  • 初始SpringBoot
  • 2025年【安全员-C证】考试试卷及安全员-C证模拟考试
  • 03-谷粒商城笔记
  • STM32与i.MX6ULL内存与存储机制全解析:从微控制器到应用处理器的设计差异
  • WebSocket是h5定义的,双向通信,节省资源,更好的及时通信
  • LLM优化提示词方案的方法
  • 深度探究获取淘宝商品数据的途径|API接口|批量自动化采集商品数据
  • 使用Python实现简单爬虫:从入门到实践
  • 21.disql命令登录达梦数据库,查询并操作数据库
  • MVVM框架详解:原理、实现与框架对比
  • 数据集 | 苹果目标检测数据集