MyBatis(五)映射器注解

本文详细介绍了MyBatis中常用的注解,包括基本注释、Insert、Delete、Update、Select操作,以及ResultMap的一对一和一对多映射。此外,还展示了动态SQL的实现,包括脚本SQL、方法构建SQL和SQL语句构造器的使用。通过实例展示了如何在实际开发中灵活运用这些注解和动态SQL来提高代码效率。
摘要由CSDN通过智能技术生成

1,常见的注解

(1)基本注释:实现简单的增删改查操作。

(2)结果映射注解:实现结果的映射关系,也可以完成级联映射。

(3)动态SQL注解:实现动态 SQL 的内容。

2,Insert 新增

	// 新增学生	
	@Insert("insert into student (sname,birthday,ssex,classid) "
			+ "values(#{sname},#{birthday},#{ssex},#{classid})")
	@Options(keyProperty = "sid", useGeneratedKeys = true)
	public int addStudent(Student s);

3,Delete 删除

// 删除
	@Delete("delete from student where sid = #{sid}")
	public int delStudent(int sid);

4,Update 修改

	// 修改	
	@Update("update student set sname=#{sname}, birthday= #{birthday},"
			+ "ssex = #{ssex}, classid = #{classid} where sid = #{sid}")
	public int updateStudent(Student s);

5,Select 查询

    // 查询
    @Select("select * from student")
	public List<Student> findAllStudent();
	
	@Select("select * from student where sid = #{v}")
	public Student findStudentBysid(int sid);
	
	// Pojo 和 Map 可以进行多参查询
	// 注解的多参特有的形式
	
	@Select("select * from student "
			+ " where ssex=#{k} and classid = #{classid} "
			+ " limit #{curpage},#{sizepage}")
	public List<Student> findStudentByssexandClassid(
			@Param("k") String sex, @Param("classid") int cid,
			@Param("curpage") int curpage, 
			@Param("sizepage") int sizepage
			);

6,@Results 结果映射

语法:@Results({ @Result(id = 是否为主键, column = "字段", property = "属性" ) })

    @Results(id = "smMap",value = {
		@Result(column = "smid",property = "smid"),
		@Result(column = "sm_name",property = "smname"),
		@Result(column = "smsex",property = "smsex")
	})
	@Select("select * from schoolmaster")
	@ResultMap("smMap") // 方法外去找映射
	public List<Smaster> findSm();

7,一对一映射

	// one 一对一的表联查 @One(select="能得到属性对象的反射字符串",fetchType="加载机制")
	
	@Results({
		@Result(column = "classid", property = "classid"),
		@Result(column = "classid",property = "bj", 
			one=@One(
				select = "com.ape.mapper.BanjiMapper.findBanjiByClassid")
		)
	})
    @Select("select * from student")
	public List<Student> findAllStudent();

	@Select("select * from class where classid = #{v}")
	public Banji findBanjiByClassid(int classid);
	

8,多表映射

    // many 一对多的映射 @Many(select ="通过字符串反射得到的集合对象")
	@Results({
		@Result(column ="classid",property = "classid"),
		@Result(column = "classid",property = "slist", 
			many = @Many( 
				select = "com.ape.mapper.StudentMapper.findStudentByClassid")
		)
	})
	@Select("select * from class")
	public List<Banji> findAllBanji();

	@Select("select * from student where classid = #{v}")
	public List<Student> findStudentByClassid(int classid);

9,动态SQL注解

(1)脚本SQL

	// sql脚本
	// <script></script>
	@Select("<script>"
			+ "select * from student "
			+ "<where>"
			+ "<if test=\"ssex != null\"> and ssex = #{ssex} </if>"
			+ "<if test=\"classid != 0\"> and classid = #{classid} </if>"
			+ "</where>"
			+ "</script>")
	public List<Student> findStudentScript(Student s);

(2)方法中构建SQL

// 方法构建sql语句
	// @SelectProvider (type = 内部类.class, method = "方法名")
	// @InsertProvider
	// @UpdateProvider
	// @DeleteProvider
	// 不推荐
	@SelectProvider(type = StuSql.class ,method = "selectFunc")
	public List<Student> findStudentFun(Student s);

	class StuSql{
		public String selectFunc(Student s) {
			String sql = "select * from student where 1=1";
			if(s.getClassid() != 0) {
				sql += " and classid = #{classid}";
			}
			if(s.getSsex() != null) {
				sql += " and ssex = #{ssex}";
			}
			return sql;
		}
    }

(3)SQL语句构造器

// sql构造器
	// 官方推荐的方式
	// 方法构建sql语句
	// @SelectProvider (type = 内部类.class, method = "方法名")
	// @InsertProvider
	// @UpdateProvider
	// @DeleteProvider
	
	
	@SelectProvider(type=StuSql.class, method = "selectPro")
	public List<Student> findStudentProvider(Student s);


	class StuSql{	
		public String selectPro(Student s) {
			return new SQL() {
				{
					// SELECT("sid,sname,birthday"); // 字段
			    	// SELECT("ssex");
					// SELECT("classid");
					SELECT("*");
					FROM("student");
					if(s.getClassid() != 0) {
						WHERE("classid = #{classid}");
					}
					if(s.getSsex() != null) {
					 OR();	WHERE("ssex = #{ssex}");
					}
				}
			}.toString();
		}

MyBatis 中,您可以使用自定义映射器(Mapper)来为任何 SQL 语句提供自定义实现。自定义映射器是一种与 MyBatis 映射器相似的接口,它将 SQL 语句与 Java 方法连接起来。在 MyBatis 中,自定义映射器可以通过 XML 方式或注解方式来定义。 以下是如何创建一个自定义映射器的步骤: 1. 创建一个 Java 接口,该接口将作为自定义映射器的入口。在该接口中,您需要定义与 SQL 语句相对应的方法。例如: ``` public interface UserMapper { @Select("SELECT * FROM Users WHERE id = #{id}") User getUserById(int id); @Insert("INSERT INTO Users (id, name, age) VALUES (#{id}, #{name}, #{age})") void insertUser(User user); @Update("UPDATE Users SET name = #{name}, age = #{age} WHERE id = #{id}") void updateUser(User user); @Delete("DELETE FROM Users WHERE id = #{id}") void deleteUserById(int id); } ``` 在这个示例中,UserMapper 接口定义了四个方法,分别对应 SQL 语句中的 SELECT、INSERT、UPDATE 和 DELETE 操作。每个方法都使用注解来指定 SQL 语句。注意,方法参数和 SQL 语句中的占位符必须匹配。 2. 创建一个 XML 映射器文件(可选)。如果您不想使用注解来指定 SQL 语句,可以创建一个 XML 映射器文件来定义 SQL 语句和参数映射。例如: ``` <mapper namespace="com.example.UserMapper"> <select id="getUserById" resultType="com.example.User"> SELECT * FROM Users WHERE id = #{id} </select> <insert id="insertUser"> INSERT INTO Users (id, name, age) VALUES (#{id}, #{name}, #{age}) </insert> <update id="updateUser"> UPDATE Users SET name = #{name}, age = #{age} WHERE id = #{id} </update> <delete id="deleteUserById"> DELETE FROM Users WHERE id = #{id} </delete> </mapper> ``` 在这个示例中,XML 映射器文件与注解方式类似,定义了 getUserById、insertUser、updateUser 和 deleteUserById 方法对应的 SQL 语句。 3. 在 MyBatis 配置文件中注册自定义映射器。例如: ``` <configuration> <mappers> <mapper class="com.example.UserMapper"/> </mappers> </configuration> ``` 在这个示例中,UserMapper 自定义映射器被注册到 MyBatis 配置中。 4. 使用自定义映射器。例如: ``` SqlSessionFactory factory = ...; SqlSession session = factory.openSession(); UserMapper mapper = session.getMapper(UserMapper.class); User user = mapper.getUserById(1); mapper.insertUser(new User(2, "Alice", 20)); mapper.updateUser(new User(2, "Alice", 21)); mapper.deleteUserById(2); session.commit(); session.close(); ``` 在这个示例中,我们使用 SqlSession.getMapper 方法获取 UserMapper 接口的实现,然后调用接口中定义的方法来执行 SQL 语句。注意,所有 SQL 操作必须在事务中执行,并在完成后调用 SqlSession.commit 方法提交事务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

手可摘鑫晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值