æ¬é¡¹ç®æå»ºæºç ï¼https://github.com/zhuquanwen/mybatis-learn/releases/tag/with-annotation
æå»ºè¿ç¨ï¼
å¨ä¸ä¸ç¯æç« åºç¡ä¸æå»ºï¼æäºè¿ç¨ä¸è¯¦ç»æè¿°ï¼ä¹åçæºç å¨ä¸ä¸ç¯å·²éä¸ï¼åè§ä¸ä¸ç¯ï¼https://blog.csdn.net/u011943534/article/details/104717560
项ç®ç»æï¼

1ãä¹åå¼å ¥äºLog4j使ªåé ç½®ï¼è¿æ¬¡éè¿InitLog4Jç±»é ç½®ä¸ä¸
package com.learn.zqw.log;
import org.apache.log4j.PropertyConfigurator;
/**
* //TODO
*
* @author zhuquanwen
* @vesion 1.0
* @date 2020/3/8 10:35
* @since jdk1.8
*/
public class InitLog4J {
public static void init(){
PropertyConfigurator.configure("log4j.properties");
}
static {
init();
}
}
2ãå¼å ¥æµè¯ç两个sqlèæ¬ï¼å ä¸ºè¿æ¬¡é¡ºå¸¦å®ç°äºå ³èæ¥è¯¢åè½ï¼æ å¼å ¥ä¸¤ä¸ª
/*
Navicat MySQL Data Transfer
Source Server : localhost
Source Server Version : 50722
Source Host : localhost:3306
Source Database : mybatis_learn
Target Server Type : MYSQL
Target Server Version : 50722
File Encoding : 65001
Date: 2020-03-08 14:23:37
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for library
-- ----------------------------
DROP TABLE IF EXISTS `library`;
CREATE TABLE `library` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`address` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- Records of library
-- ----------------------------
INSERT INTO `library` VALUES ('1', 'å½å®¶å¾ä¹¦é¦', 'å京å¸');
/*
Navicat MySQL Data Transfer
Source Server : localhost
Source Server Version : 50722
Source Host : localhost:3306
Source Database : mybatis_learn
Target Server Type : MYSQL
Target Server Version : 50722
File Encoding : 65001
Date: 2020-03-08 14:23:47
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for book
-- ----------------------------
DROP TABLE IF EXISTS `book`;
CREATE TABLE `book` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`num` int(11) DEFAULT NULL,
`library_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `book_ibfk_1` (`library_id`),
CONSTRAINT `book_ibfk_1` FOREIGN KEY (`library_id`) REFERENCES `library` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- Records of book
-- ----------------------------
INSERT INTO `book` VALUES ('1', 'Cè¯è¨ç¨åºè®¾è®¡V2', '789', '1');
INSERT INTO `book` VALUES ('2', 'æ³°æå°è¯é', '234', null);
INSERT INTO `book` VALUES ('3', 'æè±å¤æ¾', '435', null);
INSERT INTO `book` VALUES ('5', 'ç¦»æ£æ°å¦', '400', '1');
INSERT INTO `book` VALUES ('6', 'å¤§æ°æ®æ¶ä»£', '300', '1');
3ãå®ä¹ä¸¤ä¸ªå¯¹åºçå®ä½BookãLibrary
package com.learn.zqw.sqlannotation.domain;
import lombok.Data;
/**
* //TODO
*
* @author zhuquanwen
* @vesion 1.0
* @date 2020/3/8 13:18
* @since jdk1.8
*/
@Data
public class Library {
private Integer id;
private String name;
private String address;
}
package com.learn.zqw.sqlannotation.domain;
import lombok.Data;
/**
* Bookå®ä½ç±»
*
* @author zhuquanwen
* @vesion 1.0
* @date 2020/3/8 12:05
* @since jdk1.8
*/
@Data
public class Book {
private Integer id;
private String name;
private Integer num;
private Library library;
}
å¦ä¸ï¼åBookä¸å®ä¹library屿§ï¼bookä¸libraryä¹é´æ¯å¤å¯¹ä¸çå ³ç³»
4ãå®ä¹BookåLibraryçMapperï¼å ±å个æä»¶
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.learn.zqw.sqlannotation.mapper.LibraryMapper">
</mapper>
package com.learn.zqw.sqlannotation.mapper;
import com.learn.zqw.sqlannotation.domain.Book;
import com.learn.zqw.sqlannotation.domain.Library;
import org.apache.ibatis.annotations.Select;
public interface LibraryMapper {
@Select("select * from library where id = #{id}")
Library findById(int id);
int insert(Book book);
}
<?xml version="1.0" encoding="UTF8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.learn.zqw.sqlannotation.mapper.BookMapper">
<!--æå
¥ä¸æ¡è®°å½-->
<insert id="insert" parameterType="com.learn.zqw.sqlannotation.domain.Book">
insert into book (name, num, library_id) values (#{name}, #{num}, #{library.id})
</insert>
<!--æå
¥è®°å½å¹¶è¿åID-->
<insert id="insertReturnId" useGeneratedKeys="true" keyProperty="id" keyColumn="id" parameterType="com.learn.zqw.sqlannotation.domain.Book">
insert into book(name, num, library_id)
values(#{name}, #{num}, #{library.id})
</insert>
</mapper>
package com.learn.zqw.sqlannotation.mapper;
import com.learn.zqw.sqlannotation.domain.Book;
import com.learn.zqw.sqlannotation.domain.Library;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.mapping.FetchType;
import java.util.List;
public interface BookMapper {
int insert(Book book);
int insertReturnId(Book book);
@Select("select * from book")
List<Book> findAll();
@Select("select * from book where id = #{id}")
@Results({
@Result(id=true,column="id",property="id"),
@Result(column = "name",property = "name"),
@Result(column = "num",property = "num"),
@Result(column = "library_id",property = "library",javaType = Library.class,
one = @One(select = "com.learn.zqw.sqlannotation.mapper.LibraryMapper.findById",fetchType = FetchType.LAZY)),
})
Book findById(int id);
Book findById(Book book);
@Select(value = {" <script>" +
" SELECT * FROM book " +
" <where> 1=1 " +
" <if test=\"name != null\"> AND name like CONCAT('%', #{name}, '%')</if> " +
" <if test=\"num != null\" > AND num>#{num}</if> " +
" </where>" +
" </script>"})
@Results({
@Result(id=true,column="id",property="id"),
@Result(column = "name",property = "name"),
@Result(column = "num",property = "num"),
@Result(column = "library_id",property = "library",javaType = Library.class,
one = @One(select = "com.learn.zqw.sqlannotation.mapper.LibraryMapper.findById",fetchType = FetchType.LAZY)),
})
List<Book> findByCondition(Book book);
@Insert("insert into book(name, num, library_id) values (#{name}, #{num}, #{library.id})")
int insert2(Book book);
@Update("update book set name = #{name} where id = #{id}")
int update(Book book);
@Delete("delete from book where id = #{id}")
int delete(int id);
int delete(Book id);
}
å¦ä¸ï¼æ¥è¯¢æ¶ä½¿ç¨
@Select
,ä¿®æ¹ä½¿ç¨
@Update
ï¼å é¤ä½¿ç¨
@Delete
ï¼æ°å¢ä½¿ç¨
@Insert
ï¼SQLåæ³ä¸å¨XMLä¸åºæ¬ä¸è´ï¼å¯ä»¥ä½¿ç¨
@Results
çæ³¨è§£èªå®ä¹è¿åç»æã
注æä»¥ä¸å ç¹:
- 注解åXMLå¯ä»¥æ··ç¨ï¼è¿éç
ç彿°çSQLæ¯å¨XMLä¸å®ä¹çï¼insertãinsertReturnId
- å
³èæ¥è¯¢æ¶å¯ä»¥å¨è¿åçèªå®ä¹
ä¸ä½¿ç¨@Result
çæ¹å¼ï¼å®ä¹ä¸ä¸ªå ³èçæ¥è¯¢ï¼[email protected]
- åµå¥å弿¶å¯ä»¥ä½¿ç¨å¦ä¸ç
çæ¹å¼ï¼#{library.id}
- æ¨¡ç³æ¥è¯¢ä½¿ç¨è¯æ³å¦ä¸
è¿æ ·çæ¹å¼ï¼name like CONCAT('%', #{name}, '%')
- 卿å弿¶
æ¯æåºå«çï¼è¿é齿¯ç¨ç#å$
ï¼#
ç´æ¥ååç¬¦ä¸²æ¼æ¥ï¼æSQLæ³¨å ¥çé£é©ï¼ä¸è¬ç¨äºå¨æè¡¨ååååç读åï¼å¦order by åï¼è$
使ç¨JDBCçpreparestatementé¢ç¼è¯ï¼ä¼å°åæ°è½¬æ¢ä¸ºå符串ï¼è½å¤é²æ¢SQLæ³¨å ¥ï¼#
- è¿éågeneratoræ··ç¨ä¹æ¯æ²¡é®é¢çã
5ãæ³¨å ¥æ°çMapper
å¨
SqlMapConfig.xml
䏿·»å 两个æ°çxmlæä½¿ç¨packageæ«æ
<mappers>
<mapper resource="com/learn/zqw/IUserMapper.xml" />
<mapper resource="com/learn/zqw/generator/mapper/StudentMapper.xml" />
<!--å¯ä»¥ç´æ¥ææ¯ä¸ªxmlä½é
ç½®ï¼ä¹å¯ä»¥ä½¿ç¨å
æ«æï¼ä½¿ç¨å
æ«æï¼å¦æä½¿ç¨çº¯æ³¨è§£æ¹å¼ï¼ä¹å¯ä»¥æå¯¹åºç.xmlæä»¶å é¤-->
<!--<mapper resource="com/learn/zqw/sqlannotation/mapper/BookMapper.xml" />-->
<!-- <mapper resource="com/learn/zqw/sqlannotation/mapper/LibraryMapper.xml" />-->
<package name="com.learn.zqw.sqlannotation.mapper"/>
</mappers>
6ãç¼ååå æµè¯
package com.learn.zqw.sqlannotation;
import com.learn.zqw.sqlannotation.domain.Book;
import com.learn.zqw.sqlannotation.domain.Library;
import com.learn.zqw.sqlannotation.mapper.BookMapper;
import com.learn.zqw.sqlannotation.mapper.LibraryMapper;
import lombok.Cleanup;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;
/**
* æµè¯æ³¨è§£æ¹å¼SQLæ§è¡
*
* @author zhuquanwen
* @vesion 1.0
* @date 2020/3/8 12:11
* @since jdk1.8
*/
@RunWith(JUnit4.class)
public class BookTests {
/**
* æµè¯æ¥è¯¢ææ
* */
@Test
public void test() throws IOException {
@Cleanup InputStream in = Resources.getResourceAsStream ("SqlMapConfig.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSession session = factory.openSession();
BookMapper mapper = session.getMapper(BookMapper.class);
List<Book> books = mapper.findAll();
Assert.assertNotNull(books);
if (books != null) {
books.forEach(System.out::println);
}
}
/**
* æµè¯æç
§IDæ¥è¯¢ï¼å¹¶å
³èä¸ä¸ªä¸»è¡¨è®°å½ï¼ä¸èªå®ä¹result
* */
@Test
public void test2() throws IOException {
@Cleanup InputStream in = Resources.getResourceAsStream ("SqlMapConfig.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSession session = factory.openSession();
BookMapper mapper = session.getMapper(BookMapper.class);
Book book = mapper.findById(1);
Assert.assertNotNull(book);
System.out.println(book);
Book book1 = new Book();
book1.setId(2);
Book book2 = mapper.findById(book1);
Assert.assertNotNull(book2);
System.out.println(book2);
}
/**
* æµè¯ä½¿ç¨XMLä¸çæå
¥æ¹æ³,å¹¶ä¸ä¸ºåµå¥æå
¥
*
* */
@Test
public void test3() throws IOException {
@Cleanup InputStream in = Resources.getResourceAsStream ("SqlMapConfig.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSession session = factory.openSession();
BookMapper mapper = session.getMapper(BookMapper.class);
Book book = new Book();
book.setName("ç¦»æ£æ°å¦");
book.setNum(400);
LibraryMapper libraryMapper = session.getMapper(LibraryMapper.class);
Library library = libraryMapper.findById(1);
book.setLibrary(library);
int inserted = mapper.insert(book);
Assert.assertEquals(1, inserted);
System.out.println(inserted);
session.commit();
}
/**
* æµè¯æ³¨è§£æ¡ä»¶æ¥è¯¢
* */
@Test
public void test4() throws IOException {
@Cleanup InputStream in = Resources.getResourceAsStream ("SqlMapConfig.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSession session = factory.openSession();
BookMapper mapper = session.getMapper(BookMapper.class);
Book book = new Book();
book.setName("C");
book.setNum(10);
List<Book> books = mapper.findByCondition(book);
Assert.assertNotNull(books);
books.forEach(System.out::println);
}
/**
* æµè¯ä½¿ç¨æ³¨è§£ä¸çæå
¥æ¹æ³,å¹¶ä¸ä¸ºåµå¥æå
¥
*
* */
@Test
public void test5() throws IOException {
@Cleanup InputStream in = Resources.getResourceAsStream ("SqlMapConfig.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSession session = factory.openSession();
BookMapper mapper = session.getMapper(BookMapper.class);
Book book = new Book();
book.setName("å¤§æ°æ®æ¶ä»£");
book.setNum(300);
LibraryMapper libraryMapper = session.getMapper(LibraryMapper.class);
Library library = libraryMapper.findById(1);
book.setLibrary(library);
int inserted = mapper.insert2(book);
Assert.assertEquals(1, inserted);
System.out.println(inserted);
session.commit();
}
/**
* æµè¯ä½¿ç¨æ³¨è§£ä¸çä¿®æ¹å
¥æ¹æ³
*
* */
@Test
public void test6() throws IOException {
@Cleanup InputStream in = Resources.getResourceAsStream ("SqlMapConfig.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSession session = factory.openSession();
BookMapper mapper = session.getMapper(BookMapper.class);
Book book = mapper.findById(1);
book.setName("Cè¯è¨ç¨åºè®¾è®¡V2");
int updated = mapper.update(book);
Assert.assertEquals(1, updated);
System.out.println(updated);
session.commit();
}
/**
* æµè¯ä½¿ç¨æ³¨è§£ä¸å 餿¹æ³
*
* */
@Test
public void test7() throws IOException {
@Cleanup InputStream in = Resources.getResourceAsStream ("SqlMapConfig.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSession session = factory.openSession();
BookMapper mapper = session.getMapper(BookMapper.class);
Book book = new Book();
book.setName(UUID.randomUUID().toString());
book.setNum(300);
LibraryMapper libraryMapper = session.getMapper(LibraryMapper.class);
Library library = libraryMapper.findById(1);
book.setLibrary(library);
int inserted = mapper.insertReturnId(book);
session.commit();
Assert.assertEquals(1, inserted);
int delete = mapper.delete(book.getId());
Assert.assertEquals(1, delete);
session.commit();
}
}