Mybatis详解(二)
时间:2019-08-30
本文章向大家介绍Mybatis详解(二),主要包括Mybatis详解(二)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
使用接口结合xml文件
创建一个接口,该接口要和映射文件匹配
public interface UserDao {
//根据ID查询 User getUserId(int id); }
在映射文件中
<?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"> <!-- namespace:表示名称空间。这里的namespace一定要和接口所在的包以及接口的名字一样 --> <mapper namespace="com.zhiyou100.zjc.dao.UserDao"> <!-- 根据id查询用户。id:标识该标签。 parameterType:参数类型。可以写 也可以省略 resultType:返回结果的类型。 #{id}:类似于EL表达式。 解析id的值 -->
<!--getUserId对应着上面接口的方法名-->
<select id="getUserId" parameterType="int" resultType="com.zhiyou100.zjc.bean.User"> select * from users where id=#{id} </select> </mapper>
测试
class Test { static SqlSession session=null; UserDao userdao = session.getMapper(UserDao.class); //相当于你创建了一个dao对象 @BeforeAll static void setUpBeforeClass() throws Exception { Reader reader = Resources.getResourceAsReader("conf.xml"); SqlSessionFactory sessionFactory =new SqlSessionFactoryBuilder().build(reader); session =sessionFactory.openSession(); } @AfterAll static void tearDownAfterClass() throws Exception { session.commit(); } @org.junit.jupiter.api.Test void getUserIdTest() { User user= userdao.getUserId(2); System.out.println(user); } }
解决字段与属性不匹配
1、解决方案为为查询的字段起别名 要求别名与属性名一致。(不建议使用)
2、 使用resultMap标签来定义实体类与字段之间的对应关系。
<select id="getOrderId" resultMap="orderId"> select * from orders where order_id=#{id} </select> <resultMap type="com.zhiyou100.zjc.bean.Order" id="orderId"> <id column="order_id" property="id"/> <result column="order_no" property="no"/> <result column="order_price" property="price"/> </resultMap>
链表查询
1、 通过链表查询来得到。
package com.zhiyou100.zjc.bean; import java.util.List; public class Classmate { private int id; private String name; private int teacherid; private Teacher teacher;//关联老师的对象public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getTeacherid() { return teacherid; } public void setTeacherid(int teacherid) { this.teacherid = teacherid; } }
映射文件
<?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"> <!-- namespace:表示名称空间。现在的目的是区分id的. --> <mapper namespace="com.zhiyou100.zjc.dao.ClassmateDao"> <select id="getClassmateInfo" resultMap="classId"> select * from class c,teacher t,student s where t.t_id=c.teacher_id and c.c_id=s.class_id and c_id=#{id} </select> <resultMap type="com.zhiyou100.zjc.bean.Classmate" id="classId"> <id column="c_id" property="id"/> <result column="c_name" property="name"/> <result column="teacher_id" property="teacherid"/>
<!-- teacher为老师老师的对象名 --> <association property="teacher" javaType="com.zhiyou100.zjc.bean.Teacher"> <id column="t_id" property="id"/> <result column="t_name" property="name"/> </association> </resultMap> </mapper>
2、两次查询
一对多查询
package com.zhiyou100.zjc.bean; import java.util.List; public class Classmate { private int id; private String name; private int teacherid; private Teacher teacher;//一对多 private List<Student> students; public List<Student> getStudents() { return students; } public void setStudents(List<Student> students) { this.students = students; } public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getTeacherid() { return teacherid; } public void setTeacherid(int teacherid) { this.teacherid = teacherid; } }
映射文件
<?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"> <!-- namespace:表示名称空间。现在的目的是区分id的. --> <mapper namespace="com.zhiyou100.zjc.dao.ClassmateDao"> <select id="getClassmateInfo" resultMap="classId"> select * from class c,teacher t,student s where t.t_id=c.teacher_id and c.c_id=s.class_id and c_id=#{id} </select> <resultMap type="com.zhiyou100.zjc.bean.Classmate" id="classId"> <id column="c_id" property="id"/> <result column="c_name" property="name"/> <result column="teacher_id" property="teacherid"/> <association property="teacher" javaType="com.zhiyou100.zjc.bean.Teacher"> <id column="t_id" property="id"/> <result column="t_name" property="name"/> </association>
<!--student为List<Student>集合的对象名--> <collection property="students" ofType="com.zhiyou100.zjc.bean.Student"> <id column="s_id" property="id"/> <result column="s_name" property="name"/> <result column="class_id" property="classid"/> </collection> </resultMap> </mapper>
Mybatis中$和#的区别
#相当于对数据 加上 双引号,$相当于直接显示数据
1、#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,
如果传入的值是111,那么解析成sql时的值为order by “111”, 如果传入的值是id,则解析成的sql为order by “id”.
2、将传入的数据直接显示生成在sql中。如:orderby将传入的数据直接显示生成在sql中。如:orderbyuser_id$,
如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id.
3、#方式能够很大程度防止sql注入。
4、方式无法防止Sql注入。
5、方式一般用于传入数据库对象,例如传入表名.
6、一般能用#的就别用$.
MyBatis排序时使用order by 动态参数时需要注意,用$而不是#
添加对象时如何把生产的id返回
原文地址:https://www.cnblogs.com/zjc364259451/p/11437203.html
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Django调用百度地图api在地图上批量增加标记点
- Spring Cloud Config - 统一配置中心
- 从头分析一则traceId穿透问题(附解决方案)
- openldap的介绍与安装
- docker搭建环境如何配置端口
- Go语言入门(二)-流程控制
- 【Java8新特性】02 函数式接口和Lambda表达式实战练习:环绕执行模式使行为参数化
- Go语言入门(三)数组和切片
- 一天一大 leet(回文数)难度:简单 DAY-10
- 如何使用docker搭建PHP环境
- Go语言入门(四)Map&函数
- 一天一大 leet(每日温度)难度:中等 DAY-11
- Go语言入门(五)结构体&练习
- 利用hexo和github或coding 搭免费个人博客
- window 指令之 tree