Mybatis 注解
1.1 基本使用
1.1.1 常用注解
注解 |
描述 |
---|---|
@Insert |
实现新增 |
@Update |
实现更新 |
@Delete |
实现删除 |
@Select |
实现查询 |
@Result |
实现结果集封装 |
@Results |
可以与 @Result 一起使用,封装多个结果集 |
@One |
实现一对一结果集封装 |
@Many |
实现一对多结果集封装 |
1.1.2 MyBatis 增删改查
☞ 实体类
public class Student {
private Long sId;
private String sName;
private Long sAge;
private String sSex;
// set and get
}
☞ DAO
/**
* Created with IntelliJ IDEA.
*
* @author Demo_Null
* @date 2020/9/9
* @description Mybatis 注解
*/
public interface StudentDao {
@Select("select * from student")
public List<Student> findAll();
@Select("select * from where s_id = #{id} ")
public Student findOne(Long id);
@Insert("insert into student values (#{sId}, #{sName}), #{sAge}, #{sSex}")
public int insert(Student student);
@Update("update from student set s_id = #{sId}, s_name = #{sName}, s_age = #{sAge}, s_sex = #{sSex}")
public int update(Student student);
@Delete("delete from student where s_id = #{id} ")
public int delete(Long id);
}
☞ 配置文件
<typeAliases>
<package name="com.software.mybatis.entity"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 指定接口所在的包 -->
<package name="com.software.mybatis.dao"/>
<!-- 指定接口 -->
<mapper class="com.software.mybatis.dao.StudentDao"/>
</mappers>
☞ 测试
/**
* Created with IntelliJ IDEA.
*
* @author Demo_Null
* @date 2020/9/9
* @description
*/
public class MybatisDemo {
private StudentDao studentDao;
@Before
public void before() throws IOException {
// 加载核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis.xml");
// 获得 sqlSession 工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
// 获得 sqlSession 对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 获取 mapper
studentDao = sqlSession.getMapper(StudentDao.class);
}
@Test
public void TestA() throws IOException {
List<Student> studentList = studentDao.findAll();
System.out.println(studentList);
}
}
我们可以看到,明明结果已经查询出来了,为什么打印出来却是空的。这个是因为属性名和列名不一致造成的,类似于我们这种 sId ☞ s_id
可以打开驼峰之自动转换。如果二者之间没有任何联系就需要使用 @Results 一一映射。
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
@Select("select * from student")
@Results(value = {
@Result(property = "sId", column = "s_id"),
@Result(property = "sName", column = "s_name"),
@Result(property = "sAge", column = "s_age"),
@Result(property = "sSex", column = "s_sex")
})
public List<Student> findAll();
1.2 复杂映射
1.2.1 注解详解
注解 |
说明 |
---|---|
@Results |
代替的是标签该注解中可以使用单个@Result注解,也可以使用@Result集合使用格式:@Results({@Result(),@Result()})或@Results(@Result()) |
@Result |
代替了标签和标签@Result中属性介绍:column:数据库的列名property:需要装配的属性名one:需要使用的@One 注解(@Result(one=@One)()))many:需要使用的@Many 注解(@Result(many=@many)())) |
@One(一对一) |
代替了标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。@One注解属性介绍:select:指定用来多表查询的sqlmapper使用格式:@Result(column="",property="".one=@One(select=")) |
@Many(一对多) |
代替了标签,是是多表查询的关键,在注解中用来指定子查询返回对象集合。使用格式:@Result(property="".column=",many=@Many(select=")) |
1.2.2 一对一
☞ 实体类
public class Student {
private Long sId;
private String sName;
private Long sAge;
private String sSex;
private Class class;
// set and get
}
public class Class {
private Long cId;
private String cName;
private String cAddr;
// set and get
}
☞ DAO
public interface ClassDao {
@Select("select * from class where c_id = #{id} ")
public Class findById(Long id);
}
public interface StudentDao {
@Select("select * from student")
@Results({
@Result(property = "sId", column = "s_id"),
@Result(property = "sName", column = "s_name"),
@Result(property = "sAge", column = "s_age"),
@Result(property = "sSex", column = "s_sex"),
// 类似于先查询出 student 然后拿 c_id 再去查 class
@Result(property = "class", column = "c_id", javaType = Class.class,
one = @One(select = "com.software.mybatis.dao.ClassDao.findById"))
})
public List<Student> findAll();
}
1.2.3 一对多
☞ 实体类
public class Student {
private Long sId;
private String sName;
private Long sAge;
private String sSex;
private Long cId;
// set and get
}
public class Class {
private Long cId;
private String cName;
private String cAddr;
private List<Student> students;
// set and get
}
☞ DAO
public interface StudentDao {
@Select("select * from where c_id = #{id} ")
public List<Student> findByCid(Long id);
}
public interface ClassDao {
@Select("select * from class")
@Results({
@Result(property = "cId", column = "c_id"),
@Result(property = "cName", column = "c_name"),
@Result(property = "cAddr", column = "c_addr"),
// 类似于先查询 class 然后使用 c_id 查询 student
@Result(property = "students", column = "c_id", javaType = List.class,
many = @Many(select = "com.software.mybatis.dao.StudentDao.findByCid")),
})
public List<Class> findAll();
}
1.2.4 多对多
☞ 实体类
public class Course {
private Integer cId;
private String cName;
private List<Student> students;
// set and get
}
public class Student {
private Integer sId;
private String sName;
private Long sAge;
private String sSex;
private List<Course> courses;
// set and get
}
☞ DAO
public interface CourseDao {
@Select("select * from course c, s_c sc where c.c_id = sc.c_id and sc.s_id = #{id} ")
public List<Course> findBySid(Long id);
}
public interface StudentDao {
@Select("select * from student")
@Results({
@Result(property = "sId", column = "s_id"),
@Result(property = "sName", column = "s_name"),
@Result(property = "sAge", column = "s_age"),
@Result(property = "sSex", column = "s_sex"),
// 类似于先查询 student 然后连接查询 course 和 s_c 表条件为 c.c_id = sc.c_id and s_id = sc.s_id
@Result(property = "Courses", column = "s_id", javaType = List.class,
many = @Many(select = "com.software.mybatis.dao.CoursesDao.findBySid"))
})
public List<Student> findAll();
}
- 【Android基础】利用Intent在Activity之间传递数据
- 通过shell脚本监控日志切换频率 (94天)
- 【专业技术】Linux设备驱动第八篇:高级字符驱动操作之设备存取控制
- ORA-00439的解决(笔记93天)
- @Scheduled 注解的使用
- 生产系统调优之_毫秒级的改进 (92天)
- java获取视频文件的长度
- java注解示例程序
- mysqldb库安装与python交互操作
- 【答疑释惑】标准C语言如何操作文件?
- 回溯算法思想与八皇后问题解的个数
- 在spring中使用自定义注解注册监听器
- 在springBoot项目中使用activiti
- ORACLE dataguard学习笔记 (91天)
- 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 文档注释