Mybatis全网最详细教程(纯注解编程),包看包会!
Mybatis的注解開發
說明:因為是純注解,所以沒有任何xml配置文件,只需要寫一個before()方法,將配置代碼放入即可,這里面的配置相當于sqlMapConfig.xml配置文件,后面直接調用即可,接口對應的xml不要,直接在接口上面注解sql語句就ok。如下
private UserMapper sm;@Beforepublic void before() throws IOException {//建立數據源DruidDataSource ds = new DruidDataSource();Properties properties = new Properties();//ds.setDriverClassName();//ds.setUrl();//ds.setUsername();//ds.setPassword(); 這四行相當于properties文//作者這里使用的properties數據文件,也可以直接走編程方式properties.load(Resources.getResourceAsStream("jdbc.properties"));ds.setConnectProperties(properties);//相當于sql的核心配置文件JdbcTransactionFactory jdbcTransactionFactory = new JdbcTransactionFactory();Environment environment = new Environment("environment", jdbcTransactionFactory, ds);Configuration configuration = new Configuration(environment);configuration.addMappers("cn.seim.mapper");//添加分頁插件(可用可不用)// PageInterceptor pi = new PageInterceptor();// configuration.addInterceptor(pi);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);SqlSession sqlSession = sqlSessionFactory.openSession(true);//使用哪個接口就根據實際情況調用就OKsm = sqlSession.getMapper(UserMapper.class);//測試User表使用}1.一對一查詢
1.1 MyBatis的常用注解
這幾年來注解開發越來越流行,Mybatis也可以使用注解開發方式,這樣我們就可以減少編寫Mapper
映射文件了。我們先圍繞一些基本的CRUD來學習,再學習復雜映射多表操作。
@Insert:實現新增
@Update:實現更新
@Delete:實現刪除
@Select:實現查詢
@Result:實現結果集封裝
@Results:可以與@Result 一起使用,封裝多個結果集
@One:實現一對一結果集封裝
@Many:實現一對多結果集封裝
1.2 MyBatis的增刪改查
完成簡單的user表的增刪改查的操作
@Slf4j public class MybatisUserTest {private UserMapper sm;@Beforepublic void before() throws IOException {//建立數據源DruidDataSource ds = new DruidDataSource();Properties properties = new Properties();properties.load(Resources.getResourceAsStream("jdbc.properties"));ds.setConnectProperties(properties);//相當于sql的核心配置文件JdbcTransactionFactory jdbcTransactionFactory = new JdbcTransactionFactory();Environment environment = new Environment("environment", jdbcTransactionFactory, ds);Configuration configuration = new Configuration(environment);configuration.addMappers("cn.seim.mapper");//添加分頁插件(可用可不用)// PageInterceptor pi = new PageInterceptor();// configuration.addInterceptor(pi);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);SqlSession sqlSession = sqlSessionFactory.openSession(true);sm = sqlSession.getMapper(UserMapper.class);//測試User表使用}//user表的相關操作@Testpublic void save() {User user1 = new User();user1.setUsername("尼古拉斯");user1.setPassword("abc");user1.setBirthday(LocalDateTime.now());sm.saveUser(user1);}@Testpublic void update() {User user1 = new User();user1.setId(13);user1.setUsername("尼古拉斯·趙四");user1.setPassword("123");user1.setBirthday(LocalDateTime.now());sm.updateUser(user1);}@Testpublic void delete() {sm.deleteUser(13);}@Testpublic void findUserById() {User user = sm.findUserById(3);log.debug(String.valueOf(user));}@Testpublic void findUserAll() {List<User> all = sm.findUserAll();for (User user : all) {log.debug(String.valueOf(user));}}1.3 MyBatis的注解實現復雜映射開發
實現復雜關系映射之前我們可以在映射文件中通過配置來實現,使用注解開發后,我們可以使用@Results注解,@Result注解,@One注解,@Many注解組合完成復雜關系的配置
| @Results | 代替的是標簽該注解中可以使用單個@Result注解,也可以使用@Result集合。使用格式:@Results({@Result(),@Result()})或@Results(@Result()) |
| @Resut | 代替了標簽和標簽@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.4 一對一查詢
1. 一對一查詢的模型
用戶表和訂單表的關系為,一個用戶有多個訂單,一個訂單只從屬于一個用戶
一對一查詢的需求:查詢一個訂單,與此同時查詢出該訂單所屬的用戶
2. 一對一查詢的語句
對應的sql語句:
select * from orders;
select * from user where id=查詢出訂單的uid;
3. 創建Order和User實體
/*** @Author: [seim]* @emil: [webseim@126.com]* @ClassName Order* @date 2021/7/15 21:49* @Version 15*/ @Data @AllArgsConstructor @NoArgsConstructor public class Order {private int id;private LocalDate ordertime;private double total;//表示當前訂單屬于哪一個用戶private User user; } /*** @Author: [seim]* @emil: [webseim@126.com]* @ClassName User* @date 2021/7/15 16:45* @Version 15*/ @Data @AllArgsConstructor @NoArgsConstructor public class User {private int id;private String username;private String password;private LocalDateTime birthday; }4. 創建OrderMapper接口
public interface OrderMapper {public List<Order> findOrderALl(); }5. 使用注解配置Mapper
OrderMapper
//查詢全部方法二(兩張表分開查) @Select("select *,o.id oid from test.orders o,test.user u where o.uid=u.id") @Results({@Result(column = "oid",property = "id"),@Result(column = "ordertime",property = "ordertime"),@Result(column = "total",property = "total"),@Result(property = "user", //要封裝的屬性名稱column = "uid", //根據哪個字段來查user表的信息javaType = User.class, //要封裝的實體類型one = @One(select = "cn.seim.mapper.UserMapper.findUserById")) }) public List<Order> findOrderALl();UserMapper
public interface UserMapper {@Select("select * from test.user where id=#{id}")public User findUserById(int id); }6. 測試結果
@Test public void findOrderAll() {List<Order> orderALl = om.findOrderALl();for (Order order : orderALl) {log.debug(String.valueOf(order));} }2.一對多查詢
2.1 一對多查詢的模型
用戶表和訂單表的關系為,一個用戶有多個訂單,一個訂單只從屬于一個用戶
一對多查詢的需求:查詢一個用戶,與此同時查詢出該用戶具有的訂單
2.2 一對多查詢的語句
對應的sql語句:
select * from user;
select * from orders where uid=查詢出用戶的id;
2.3 修改User、Order實體
在這里插入代碼片/*** @Author: [seim]* @emil: [webseim@126.com]* @ClassName User* @date 2021/7/15 16:45* @Version 15*/ @Data @AllArgsConstructor @NoArgsConstructor public class User {private int id;private String username;private String password;private LocalDateTime birthday;//表示當前用戶具有的訂單private List<Order> orderList; } /*** @Author: [seim]* @emil: [webseim@126.com]* @ClassName Order* @date 2021/7/15 21:49* @Version 15*/ @Data @AllArgsConstructor @NoArgsConstructor public class Order {private int id;private LocalDate ordertime;private double total;//表示當前訂單屬于哪一個用戶private User user; }2.4 創建UserMapper接口
public interface UserMapper {public List<User> findUserAndOrderAll(); }2.5 使用注解配置Mapper
UserMapper
@Select("select * from test.user") @Results({@Result(id = true,column = "id",property = "id"),@Result(column = "username",property = "username"),@Result(column = "password",property = "password"),@Result(column = "birthday",property = "birthday"),@Result(property = "orderList",column = "id",javaType =List.class,many = @Many(select = "cn.seim.mapper.OrderMapper.findByUid")) }) public List<User> findUserAndOrderAll();OrderMapper
@Select("select * from orders where uid=#{uid}") public List<Order> findByUid(int uid);2.6 測試結果
@Test public void findUserAndOrderAll(){List<User> all = sm.findUserAndOrderAll();for (User user : all) {log.debug(String.valueOf(user));} }3.多對多查詢
3.1多對多查詢的模型
用戶表和角色表的關系為,一個用戶有多個角色,一個角色被多個用戶使用
多對多查詢的需求:查詢用戶同時查詢出該用戶的所有角色
3.2 多對多查詢的語句
對應的sql語句:
select * from user;
select * from role r,user_role ur where r.id=ur.role_id and ur.user_id=用戶的id
3.3創建Role實體,修改User實體
/*** @Author: [seim]* @emil: [webseim@126.com]* @ClassName Role* @date 2021/7/16 9:41* @Version 15*/ @Data @AllArgsConstructor @NoArgsConstructor public class Role {private int id;private String roleName;private String roleDesc; } /*** @Author: [seim]* @emil: [webseim@126.com]* @ClassName User* @date 2021/7/15 16:45* @Version 15*/ @Data @AllArgsConstructor @NoArgsConstructor public class User {private int id;private String username;private String password;private LocalDateTime birthday;//表示當前用戶具有的訂單private List<Order> orderList;//表示當前用戶具有的角色private List<Role> roleList; }3.4添加UserMapper接口方法
public List<User> findUserAndRoleALl();3.5使用注解配置Mapper
UserMapper
@Select("select * from user") @Results({@Result(id = true,column = "id",property = "id"),@Result(column = "username",property = "username"),@Result(column = "password",property = "password"),@Result(column = "birthday",property = "birthday"),@Result(property = "roleList",column = "id",javaType = List.class,many = @Many(select = "cn.seim.mapper.RoleMapper.findRoleByUid")) }) public List<User> findUserAndRoleALl();RoleMapper
@Select("select * from test.sys_user_role ur,test.sys_role r where ur.roleId=r.id and ur.userId=#{uid}") public List<Role> findRoleByUid(int uid);3.6 測試結果
@Test public void findUserAndRoleALl(){List<User> all = sm.findUserAndRoleALl();for (User user : all) {log.debug(String.valueOf(user));} }總結
以上是生活随笔為你收集整理的Mybatis全网最详细教程(纯注解编程),包看包会!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三星android怎么获取root,三星
- 下一篇: 基于Vue 的常用移动端框架