• Mybatis详细的使用过程(3)


    参数传递
    单个参数直接传递 (下面分别是方法中,接口中,xml中的对一个数据进行操作的对应代码)
    1. public void ff1(){ //单个参数查询
    2. SqlSession sqlSession = MyBatisUtil.getSqlSession();
    3. //动态为接口生成一个代理对象,由代理对象去调用方法
    4. AdminDao adminDao=sqlSession.getMapper(AdminDao.class);
    5. Admin admin=adminDao.findadminByid(1);
    6. System.out.println(admin.toString());
    7. sqlSession .close();
    8. }
     Admin findadminByid(int i);
    1. <select id="findadminByid" parameterType="int" resultType="Admin">
    2. select * from admin where id = #{i}
    3. select>

    多个参数使用@Param(“id”)绑定
    1. public void ff2(){ //多个参数查询
    2. SqlSession sqlSession = MyBatisUtil.getSqlSession();
    3. //动态为接口生成一个代理对象,由代理对象去调用方法
    4. AdminDao adminDao=sqlSession.getMapper(AdminDao.class);
    5. int a=adminDao.findadmin("admin","111");
    6. sqlSession .close();
    7. }
    int findadmin(@Param ("account") String account,@Param ("password")String password);
    1. <select id="findadmin" resultType="java.lang.Integer">
    2. select * from admin where account = #{account} and password=#{password}
    3. select>
    如果传入一个复杂的对象,就需要使用 parameterType 参数进行类型定义,例如:
    1. public void ff3(){ //传入对象参数
    2. SqlSession sqlSession = MyBatisUtil.getSqlSession();
    3. //动态为接口生成一个代理对象,由代理对象去调用方法
    4. AdminDao adminDao=sqlSession.getMapper(AdminDao.class);
    5. Admin admin=new Admin("aaa","98798","女");
    6. int s=adminDao.saveAdmin(admin);
    7. System.out.println(s); //返回操作了几行数据
    8. sqlSession.commit();//对于数据的增删改,需要用commit来提交事务来给mysql在所有逻辑结束后进行提交
    9. sqlSession .close();
    10. }
     int saveAdmin(Admin admin);   //返回的是操作的行数
    1. <insert id="saveAdmin" parameterType="admin" >
    2. insert into admin(account,password,gender) value (#{account},#{password},#{gender})
    3. insert>
    增删改查
    唯一标识 " useGeneratedKeys=" 把新增加的主键赋值到自己定义的keyProperty " keyProperty=“ 接收主键的属性 parameterType=" 参数类型 ">
    insert into user(userName,userAge)values(#{userName},#{userAge})
    1. public void ff4(){ //传入对象参数
    2. SqlSession sqlSession = MyBatisUtil.getSqlSession();
    3. //动态为接口生成一个代理对象,由代理对象去调用方法
    4. AdminDao adminDao=sqlSession.getMapper(AdminDao.class);
    5. Admin admin=new Admin("zahna","98798","女");
    6. int s=adminDao.saveAdminBackId(admin);
    7. System.out.println(admin.toString());
    8. System.out.println(s); //返回操作了几行数据
    9. sqlSession.commit();//对于数据的增删改,需要用commit来提交事务来给mysql在所有逻辑结束后进行提交
    10. sqlSession .close();
    11. }
    1. //int返回的是操作的记录数 可以为void类型
    2. int saveAdminBackId(Admin admin);
    1. <insert id="saveAdminBackId" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
    2. -- 开启返回主键功能 主键的列名 返回值赋给指定的对象中的属性 --
    3. insert into admin(account,password,gender) value (#{account},#{password},#{gender})
    4. insert>
    #{} ${} 区别
    #{} 占位符,是经过预编译的,编译好 SQL 语句再取值,#方式能够防止 sql 注入
    #{}:select * from t_user where uid=#{uid}
    ${} 拼接符,会传入参数字符串,取值以后再去编译 SQL 语句,$方式无法防止 Sql
    注入 '${变量名}'
    注意:MyBatis 排序时使用 order by 动态参数时需要注意,用${}而不是#{}
    修改
    " 唯一标识 " parameterType=“ 参数类型 ">
    update
    ts_user set userName = #{userName},userAge = #{userAge}
    where
    userId = #{userId}
    1. public void ff5(){ //传入对象参数
    2. SqlSession sqlSession = MyBatisUtil.getSqlSession();
    3. //动态为接口生成一个代理对象,由代理对象去调用方法
    4. AdminDao adminDao=sqlSession.getMapper(AdminDao.class);
    5. Admin admin=new Admin("za787a","998","男");
    6. admin.setId(2);
    7. int s=adminDao.updata(admin);
    8. System.out.println(admin.toString());
    9. System.out.println(s); //返回操作了几行数据
    10. sqlSession.commit();//对于数据的增删改,需要用commit来提交事务来给mysql在所有逻辑结束后进行提交
    11. sqlSession .close();
    12. }
     int updata(Admin admin);
    1. <update id="updata" parameterType="admin">
    2. update admin set account=#{account},password=#{password} where id=#{id}
    3. update>
    删除
    " 唯一标识 " parameterType= " 参数类型 " >
    delete from ts_user where userId = #{id}
    1. public void ff6(){ //传入对象参数
    2. SqlSession sqlSession = MyBatisUtil.getSqlSession();
    3. //动态为接口生成一个代理对象,由代理对象去调用方法
    4. AdminDao adminDao=sqlSession.getMapper(AdminDao.class);
    5. int s=adminDao.delete(3);
    6. System.out.println(s); //返回操作了几行数据
    7. sqlSession.commit();//对于数据的增删改,需要用commit来提交事务来给mysql在所有逻辑结束后进行提交
    8. sqlSession .close();
    9. }
    int delete(int i);
    1. <delete id="delete" parameterType="int">
    2. delete from admin where id=#{i}
    3. delete>
    查询
    对于增删改在方法调用后使用commit

    结果处理
    简单类型输出映射
    返回简单基本类型
    对象映射
    如果表中的类名与类中的属性名完全相同,mybatis会自动将查询结果封装
    到POJO对象中.
    如果java中使用标准驼峰命名,数据库中使用下划线连接命名,可以开始全局
    设置实现自动转换
    特殊处理定义 resultMap
    定义 resutlMap
    userResultMap " type="User">
    (1). resutlMap 的 id 属性是 resutlMap 的唯一标识,本例中定义为“useresultMap”
    (2). resutlMap 的 id 属性是映射的 POJO 类
    (3). id 标签映射主键,result 标签映射非主键
    (4). property 设置 POJO 的属性名称,column 映射查询结果的列名称
    使用 resutlMap
    使用 resultMap (多个返回值的情况下)
     List admin=adminDao.findadminlist();
    List findadminlist();
    1. <resultMap id="adminMap" type="admin">
    2. <result column="gender" property="xb">result>
    3. resultMap>
    4. <select id="findadminByid1" parameterType="int" resultMap="adminMap">
    5. select * from admin where id=#{i}
    6. select>
    多表关联处理结果集
    resultMap 元素中 association , collection 元素.
    查询指定学生对应的年级和操作人
    1. <resultMap id="studentMap" type="Student">
    2. <id column="id" property="id">id>
    3. <result column="no" property="no">result>
    4. <result column="name" property="name">result>
    5. <result column="gender" property="gender">result>
    6. <association property="grade" javaType="Grade">
    7. <result column="ganme" property="name">result>
    8. association>
    9. <association property="admin" javaType="Admin">
    10. <result column="account" property="account">result>
    11. association>
    12. resultMap>
    13. <select id="findStudentByid" resultMap="studentMap" >
    14. SELECT s.id,s.no,s.name,s.gender,g.name gname,account
    15. FROM student s LEFT JOIN grade g ON s.gradeid=g.id
    16. LEFT JOIN ADMIN a ON s.adminid=a.id
    17. where s.id=#{id}
    18. select>

    我们需要开启自动映射

    语句复用

     

    数据关系特点

    在数据查询中,当为一对一的属性时,使用assoction标签

    学生-年级-操作人

    1. <resultMap id="studentMap" type="Student">
    2. <id column="id" property="id">id>
    3. <result column="no" property="no">result>
    4. <result column="name" property="name">result>
    5. <result column="gender" property="gender">result>
    6. <association property="grade" javaType="Grade">
    7. <result column="ganme" property="name">result>
    8. association>
    9. <association property="admin" javaType="Admin">
    10. <result column="account" property="account">result>
    11. association>
    12. resultMap>
    13. <select id="findStudentByid" resultMap="studentMap" >
    14. SELECT s.id,s.no,s.name,s.gender,g.name gname,account
    15. FROM student s LEFT JOIN grade g ON s.gradeid=g.id
    16. LEFT JOIN ADMIN a ON s.adminid=a.id
    17. where s.id=#{id}
    18. select>

    在数据查询中为一对多时collection标签

    一个年级的学生

    嵌套查询
    将一个多表关联查询拆分为多次查询,先查询主表数据,然后查询关联表数据.
    javaType="Dept" select="findDeptByID" column="dept_id">
    (1). select:指定关联查询对象的 Mapper Statement ID 为 findDeptByID
    (2). column="dept_id":关联查询时将 dept_id 列的值传入 findDeptByID,并将 findDeptByID 查询的结果映射到 Emp 的 dept 属性中
    (3).collection 和 association 都需要配置 select 和 column 属性,两者配置方法相同一对一,嵌套查询
    1. select id="findStudentList1" resultType="arraylist" resultMap="finddrade">
    2. select * from student
    3. select>
    4. <resultMap id="finddrade" type="student">
    5. <result column="id" property="id">result>
    6. <result column="name" property="name">result>
    7. <result column="gender" property="gender">result>
    8. <association property="grade" select="findgrade" javaType="Grade" column="gradeid">
    9. association>
    10. resultMap>
    11. <select id="findgrade" resultType="Grade">
    12. select * from grade where id=#{gradeid}
    13. select>

    一对多,嵌套查询

    1. <select id="findgradeStudent1" resultMap="gradeMap1" resultType="arraylist">
    2. SELECT
    3. g.*
    4. FROM
    5. grade g
    6. select>
    7. <resultMap id="gradeMap1" type="Grade">
    8. <id column="id" property="id">id>
    9. <result column="name" property="name">result>
    10. <collection property="students" javaType="java.util.ArrayList" ofType="Student"
    11. //类中的集合属性名 该属性集合的类型 该属性集合的类型
    12. select="findstudentBygradeId" column="id">
    13. //对应的嵌套语句 传入嵌套语句中的值
    14. collection>
    15. resultMap>
    16. <select id="findstudentBygradeId" resultType="Student">
    17. select id,name from student where gradeid=#{id}
    18. select>

  • 相关阅读:
    Elasticsearch通过Http请求实现索引操作以及文档操作
    Ubuntu关闭防火墙、关闭selinux、关闭swap
    wxpython设计GUI:窗口Frame最大化、最小化、关闭及全屏显示的说明
    Windows下Nacos安装和下载
    高性能并行计算华为云实验五:PageRank算法实验
    电脑大文件删除了能恢复吗 电脑大文件删除了怎么恢复
    MySQL(4)
    导航守卫的使用记录和beforeEach( )死循环的问题
    使用Python+selenium实现第一个自动化测试脚本
    【大虾送书第九期】速学Linux:系统应用从入门到精通
  • 原文地址:https://blog.csdn.net/weixin_57197500/article/details/126341051