如何一文快速了解 Mybatis 的注解开发

文章目录

  • 1、mybatis 的常用注解说明
  • 2、使用 Mybatis 注解实现基本 CRUD
    • 2.1、编写实体类
    • 2.2、使用注解方式开发持久层接口
    • 2.3、编写 SqlMapConfig 配置文件
    • 2.4、编写测试类
  • 3、使用注解实现复杂关系映射开发
    • 3.1、复杂关系映射的注解说 明

1、mybatis 的常用注解说明

  • @Insert:实现新增
  • @Update:实现更新
  • @Delete:实现删除
  • @Select:实现查询
  • @Result:实现结果集封装
  • @Results:可以与@Result 一起使用,封装多个结果集
  • @ResultMap:实现引用@Results 定义的封装
  • @One:实现一对一结果集封装
  • @Many:实现一对多结果集封装
  • @SelectProvider: 实现动态 SQL 映射
  • @CacheNamespace:实现注解二级缓存的使用

2、使用 Mybatis 注解实现基本 CRUD

2.1、编写实体类

/**
*
* 

Title: User

*

Description: 用户的实体类

*/
public class User implements Serializable { private Integer userId; private String userName; private Date userBirthday; private String userSex; private String userAddress; public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public Date getUserBirthday() { return userBirthday; } public void setUserBirthday(Date userBirthday) { this.userBirthday = userBirthday; } public String getUserSex() { return userSex; } public void setUserSex(String userSex) { this.userSex = userSex; } public String getUserAddress() { return userAddress; } public void setUserAddress(String userAddress) { this.userAddress = userAddress; } @Override public String toString() { return "User [userId=" + userId + ", userName=" + userName + ", userBirthday=" + userBirthday + ", userSex=" + userSex + ", userAddress=" + userAddress + "]"; } }

注意:
此处实体类的属性名和数据库表的列名并不一致。

2.2、使用注解方式开发持久层接口

/**
*
* 

Title: IUserDao

*

Description: 用户的持久层接口

*/
public interface IUserDao { /** * 查询所有用户 * @return */ @Select("select * from user") @Results(id="userMap", value= { @Result(id=true,column="id",property="userId"), @Result(column="username",property="userName"), @Result(column="sex",property="userSex"), @Result(column="address",property="userAddress"), @Result(column="birthday",property="userBirthday") }) List<User> findAll(); /** * 根据 id 查询一个用户 * @param userId * @return */ @Select("select * from user where id = #{uid} ") @ResultMap("userMap") User findById(Integer userId); /** * 保存操作,并返回当次添加的记录的id * @param user * @return */ @Insert("insert into user(username,sex,birthday,address)values(#{username},#{sex},#{birthday},#{address} )") @SelectKey(keyColumn="id",keyProperty="id",resultType=Integer.class,before = false, statement = { "select last_insert_id()" }) int saveUser(User user); /** * 更新操作 * @param user * @return */ @Update("update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id =#{id} ") int updateUser(User user); /** * 删除用户 * @param userId * @return */ @Delete("delete from user where id = #{uid} ") int deleteUser(Integer userId); /** * 查询使用聚合函数 * @return */ @Select("select count(*) from user ") int findTotal(); /** * 模糊查询 * @param name * @return */ @Select("select * from user where username like #{username} ") List<User> findByName(String name); }

通过以上的注解方式,我们就不需要再去编写 UserDao.xml 映射文件了。

2.3、编写 SqlMapConfig 配置文件



<configuration>
	
	<properties resource="jdbcConfig.properties">properties>
	
	<typeAliases>
		<package name="per.cjh.domain"/>
	typeAliases>
	
	<environments default="mysql">
		
		<environment id="mysql">
		
		<transactionManager type="JDBC">transactionManager>
		
		<dataSource type="POOLED">
			<property name="driver" value="${jdbc.driver}"/>
			<property name="url" value="${jdbc.url}"/>
			<property name="username" value="${jdbc.username}"/>
			<property name="password" value="${jdbc.password}"/>
		dataSource>
		environment>
	environments>
	
	<mappers>
		
		<package name="per.cjh.dao"/>
	mappers>
configuration>

2.4、编写测试类

/**
*
* 

Title: MybatisAnnotationCRUDTest

*

Description: mybatis 的注解 crud 测试

*/
public class MybatisAnnotationCRUDTest { /** * 测试查询所有 */ @Test public void testFindAll() { List<User> users = userDao.findAll(); for(User user : users) { System.out.println(user); } } /** * 测试查询一个 */ @Test public void testFindById() { User user = userDao.findById(41); System.out.println(user); } /** * 测试保存 */ @Test public void testSave() { User user = new User(); user.setUserName("mybatis annotation"); user.setUserSex("男"); user.setUserAddress("北京市顺义区"); user.setUserBirthday(new Date()); int res = userDao.saveUser(user); System.out.println("影响数据库记录的行数:"+res); System.out.println("插入的主键值:"+user.getUserId()); } /** * 测试更新 */ @Test public void testUpdate() { User user = userDao.findById(63); user.setUserBirthday(new Date()); user.setUserSex("女"); int res = userDao.updateUser(user); System.out.println(res); } /** * 测试删除 */ @Test public void testDelete() { int res = userDao.deleteUser(63); System.out.println(res); } /** * 测试查询使用聚合函数 */ @Test public void testFindTotal() { int res = userDao.findTotal(); System.out.println(res); } /** * 测试模糊查询 */ @Test public void testFindByName() { List<User> users = userDao.findByName("%m%"); for(User user : users) { System.out.println(user); } } private InputStream in; private SqlSessionFactory factory; private SqlSession session; private IUserDao userDao; @Before//junit 的注解 public void init()throws Exception{ //1.读取配置文件 in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2.创建工厂 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); factory = builder.build(in); //3.创建 session session = factory.openSession(); //4.创建代理对象 userDao = session.getMapper(IUserDao.class); } @After//junit 的注解 public void destroy()throws Exception { //提交事务 session.commit(); //释放资源 session.close(); //关闭流 in.close(); } }

3、使用注解实现复杂关系映射开发

  实现复杂关系映射之前我们可以在映射文件中通过配置< resultMap >来实现,在使用注解开发时我们需要借助@Results 注解,@Result 注解,@One 注解,@Many 注解。

3.1、复杂关系映射的注解说 明

1、@Results 注解
代替的是标签

该注解中可以使用单个@Result 注解,也可以使用@Result 集合
@Results({@Result(),@Result()})或@Results(@Result())
2、@Resutl 注解
代替了 < id > 标签和< result > 标签

@Result 中 属性介绍:

  • id 是否是主键字段
  • column 数据库的列名
  • property 需要装配的属性名
  • one 需要使用的@One 注解(@Result(one=@One)()))
  • many 需要使用的@Many 注解(@Result(many=@many)()))

3、@One 注解(一对一)
代替了 标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。

@One 注解属性介绍:

  • select 指定用的 来多表查询的 sqlmapper
  • fetchType 会覆盖全局的配置参数 lazyLoadingEnabled。

使用格式:@Result(column=" “,property=”",one=@One(select=""))

4、@Many 注解(多对一)
代替了 标签, 是是多表查询的关键,在注解中用来指定子查询返回对象集合。

注意:聚集元素用来处理“一对多”的关系。需要指定映射的 Java 实体类的属性,属性的 javaType
(一般为 ArrayList)但是注解中可以不定义;

使用格式:@Result(property="",column="",many=@Many(select=""))

你可能感兴趣的:(Mybatis框架,数据库,mybatis,mysql,java)