2022.5.15 mybatis注解开发 与 Lombok
8、注解开发
8.1、面向接口编程
大家之前都学过面向对象编程,也学习过接口,但在真正的开发中,很多时候我们会选择面向接口编程 根本原因︰解耦,可拓展,提高复用,分层开发中,上层不用管具体的实现,大家都遵守共同的标准,使得开发变得容易,规范性更好 在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下,各个对象内部是如何实现自己的,对系统设计人员来讲就不那么重要了; 而各个对象之间的协作关系则成为系统设计的关键。小到不同类之间的通信,大到各模块之间的交互,在系统设计之初都是要着重考虑的,这也是系统设计的主要工作内容。面向接口编程就是指按照这种思想来编程。
关于接口的理解
-
接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离。
-
接口的本身反映了系统设计人员对系统的抽象理解。
-
接口应有两类:
-
第一类是对一个个体的抽象,它可对应为一个抽象体(abstract class);
-
第二类是对一个个体某一方面的抽象,即形成一个抽象面(interface) ;-一个体有可能有多个抽象面。抽象体与抽象面是有区别的。
-
三个面向区别
-
面向对象是指,我们考虑问题时,以对象为单位,考虑它的属性及方法.
-
面向过程是指,我们考虑问题时,以一个具体的流程(事务过程)为单位,考虑它的实现.
-
接口设计与非接口设计是针对复用技术而言的,与面向对象(过程)不是一个问题.更多的体现就是对系统整体的架构
8.2、使用注解开发
新建一个子项目

mybatis-config.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 6 <configuration> 7 8 <!--引入外部配置文件--> 9 <properties resource="db.properties"> 10 <property name="username" value="root"/> 11 <property name="pwd" value="123456"/> 12 </properties> 13 <!-- 设置日志 value 日志类型--> 14 <settings> 15 <setting name="logImpl" value="STDOUT_LOGGING"/> 16 </settings> 17 <!-- 可以给实体类起别名--> 18 <typeAliases> 19 <typeAlias type="com.xing.pojo.User" alias="User"/> 20 </typeAliases> 21 22 <environments default="development"> 23 <environment id="development"> 24 <transactionManager type="JDBC"/> 25 <dataSource type="POOLED"> 26 <property name="driver" value="${driver}"/> 27 <property name="url" value="${url}"/> 28 <property name="username" value="${username}"/> 29 <property name="password" value="${pwd}"/> 30 </dataSource> 31 </environment> 32 33 </environments> 34 35 <!-- 绑定接口--> 36 <mappers> 37 <mapper class="com.xing.dao.UserMapper"/> 38 </mappers> 39 40 </configuration>
UserMapper
1 package com.xing.dao; 2 3 import com.xing.pojo.User; 4 import org.apache.ibatis.annotations.Select; 5 import java.util.List; 6 7 public interface UserMapper { 8 @Select("select * from user") 9 List<User> getUsers(); 10 }
测试
1 package com.xing.dao; 2 3 import com.xing.pojo.User; 4 import com.xing.utils.MybatisUtils; 5 import org.apache.ibatis.session.SqlSession; 6 import org.junit.Test; 7 8 import java.util.List; 9 10 public class UserMapperTest { 11 @Test 12 public void test() { 13 SqlSession sqlSession = MybatisUtils.getSqlSession(); 14 UserMapper mapper = sqlSession.getMapper(UserMapper.class); 15 List<User> users = mapper.getUsers(); 16 for (User user : users) { 17 System.out.println(user); 18 } 19 sqlSession.close(); 20 } 21 } 22

本质:反射机制实现
底层:动态代理!

8.3、增删改查
我们可以在工具类创建的时候实现自动提交事务
MybatisUtils
1 package com.xing.utils; 2 3 import org.apache.ibatis.io.Resources; 4 import org.apache.ibatis.session.SqlSession; 5 import org.apache.ibatis.session.SqlSessionFactory; 6 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 7 8 import java.io.IOException; 9 import java.io.InputStream; 10 11 public class MybatisUtils { 12 13 private static SqlSessionFactory sqlSessionFactory; 14 15 static{ 16 try { 17 String resource = "mybatis-config.xml"; 18 InputStream inputStream = Resources.getResourceAsStream(resource);//转变成流 19 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 20 } catch (IOException e) { 21 e.printStackTrace(); 22 } 23 } 24 25 public static SqlSession getSqlSession() { 26 //参数为true设置自动提交 27 return sqlSessionFactory.openSession(true); 28 29 } 30 31 32 }
UserMapper
1 package com.xing.dao; 2 3 import com.xing.pojo.User; 4 import org.apache.ibatis.annotations.*; 5 6 import java.util.List; 7 import java.util.Map; 8 9 public interface UserMapper { 10 @Select("select * from user") 11 List<User> getUsers(); 12 13 //方法存在多个参数,所有的参数前面必须加上 @Param("id")注解 14 @Select("select * from user where id=#{userid}") 15 // id应上面的#{id} @Param相当于给后面的参数重命名 16 User getUserById(@Param("userid") int id); 17 18 //insert一个用户 引用对象不需要写@Param 19 @Insert("insert into user(id,name,pwd) values (#{id}, #{name}, #{password})") 20 int addUser(User user); 21 22 //修改用户 23 @Update("update user set name = #{name},pwd=#{password} where id = #{id}") 24 int updateUser(User user); 25 26 //删除用户 27 @Delete("delete from user where id = #{did};") 28 int deleteUser(@Param("did") int id); 29 }
UserMapperTest
1 package com.xing.dao; 2 3 import com.xing.pojo.User; 4 import com.xing.utils.MybatisUtils; 5 import org.apache.ibatis.session.SqlSession; 6 import org.junit.Test; 7 8 import java.util.List; 9 10 public class UserMapperTest { 11 @Test 12 public void test() { 13 SqlSession sqlSession = MybatisUtils.getSqlSession(); 14 UserMapper mapper = sqlSession.getMapper(UserMapper.class); 15 // List<User> users = mapper.getUsers(); 16 // for (User user : users) { 17 // System.out.println(user); 18 // } 19 20 21 // User userById = mapper.getUserById(2); 22 // System.out.println(userById); 23 24 // mapper.addUser(new User(4, "小黑", "123456"));//不用提交事务,配置文件参数为true 25 26 // mapper.updateUser(new User(4, "haha", "123456")); 27 28 mapper.deleteUser(5); 29 30 31 sqlSession.close(); 32 } 33 } 34
关于@Param()注解
-
基本类型的参数或者String类型,需要加上
-
引用类型不需要加
-
如果只有一个基本类型的话,可以忽略,但是建议大家都加上!
-
我们在SQL中引用的就是我们这里的@Param()中设定的属性名!
9、Lombok
1、在IDEA中安装Lombok插件
2、在项目中导入lombok的jar包
1 <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> 2 <dependency> 3 <groupId>org.projectlombok</groupId> 4 <artifactId>lombok</artifactId> 5 <version>1.18.22</version> 6 </dependency>
3、自动生成无参get,set方法
@Data:无参构造,get、set、tostring. hashcode,equals
@AllArgsConstructor:有参构造
@NoArgsConstructor:无参构造
@ToString:tostring
@EqualsAndHashCode:hashcode,equals
1 package com.xing.pojo; 2 3 import lombok.AllArgsConstructor; 4 import lombok.Data; 5 import lombok.NoArgsConstructor; 6 7 //实体类 8 @Data 9 @AllArgsConstructor 10 @NoArgsConstructor 11 public class User { 12 private int id; 13 private String name; 14 private String password; 15 16 }


浙公网安备 33010602011771号