preface
When learning mybatis plus
Need to master some knowledge points
- Zero foundation of java from entry to mastery (all)
- 200000 word summary of javaSE from entry to mastery (I)
- 200000 word summary of javaSE from entry to mastery (2)
- 200000 word summary of javaSE from entry to mastery (3)
as well as
- Spring framework from introduction to learning (full)
- Spring MVC from entry to mastery (full)
- springboot from entry to mastery (full)
- Mybatis from introduction to mastery (all)
- Maven detailed configuration (full)
- Maven actual combat from introduction to mastery (all)
- lambda expressions in java
The summary of learning knowledge points in this article is mainly through this link
MyBatis plus combat video tutorial - take you to quickly master MyBatis plus
- Mybatis directly executes sql statements, which are written in xml files. Using mybatis requires
It is cumbersome to multiple xml configuration files to some extent. Generally, the operation of database involves
CURD - Mybatis plus is an enhancement on mybatis, which reduces the configuration of xml and hardly needs to write xml
The CURD of a single table can be achieved, which greatly provides the efficiency of development. It also provides various query functions and paging behavior
1. Introduction project
The specific steps are
- Create project and add dependency
- Create entity classes, define attributes, and define primary key types
- Create dao interface and inherit BaseMapper entity class
- Add package for scanning dao interface in startup class
Inject dao interface into test class or service to implement dynamic proxy and create dao implementation class object
Call the method in BaseMapper to complete the database addition operation
1.1 database
Create the database file first
Create a table
Remember to set a self increment function for the primary key of the database
Otherwise, there will be such a bug
Field 'id' doesn't have a default value appears; Nested exception is the solution of java.sql.sqlexception
In the code connection database
The code needs to set the connection port account, password and database dependent files
Create a project first
Create a configuration file to connect to the database in your code
spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/springdb?useUnicode=true&characterEncoding=utf-8 username: root password: 123456
The dependency file of mybatis plus needs to be introduced additionally
<!-- mybatis-plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.0.5</version> </dependency>
And the dependent files of the database
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> <version>5.1.6</version> </dependency>
Here is the relevant part of the database
1.2 project construction
The next step is to build an entity class
The name of the entity class should be the same as the database name
@TableId( value="id", type = IdType.AUTO ) private Integer id; private String name; // null private String email; //Entity class attribute. It is recommended to use wrapper type to judge whether it is null private Integer age; // 0
You can automatically generate entity class get, set and other methods by using @ data annotation
Detailed analysis of @ Data annotation in spring
It can also be set manually
You can see that there are annotations on the entity class
It roughly means
- value: the name of the primary key field. If it is an id, it can be left blank
- Type: Specifies the type of the primary key and how the value of the primary key is generated. idType.AUTO indicates automatic growth
mapper class, that is, DAO interface
To implement BaseMapper, specify the entity class
public interface UserMapper extends BaseMapper<User> { }
The specific BaseMapper class definition source code is as follows
It mainly defines 17 operation methods (CRUD) for the objects in this framework
Add an annotation scan in the startup class to scan this class
@MapperScan: scanner that specifies the package where the Mapper class is located
@SpringBootApplication @MapperScan(value = "com.wkcto.plus.mapper") public class PlusApplication { public static void main(String[] args) { SpringApplication.run(PlusApplication.class, args); } }
Test file
The annotation @ SuppressWarnings is mainly used to suppress warning values
See my previous articles for specific information
Detailed analysis of @ SuppressWarnings annotation in Spring
For @ RunWith(SpringRunner.class), the Test class needs to use the injected class, such as the class injected by @ Autowired, before it can be instantiated into the spring container
@SuppressWarnings("all") @RunWith(SpringRunner.class) @SpringBootTest public class UserTest { //Define StudentMapper @Autowired private UserMapper userDao; @Test public void testInsertStudent() { User user = new User(); user.setName("zs"); user.setEmail("zd.com"); user.setAge(20); int rows = userDao.insert(user); System.out.println("inserStudent rows:" + rows); } }
2. Configure log
Print log in console
Output database information
Mainly in yml configuration
The specific information is
mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
3. Basic usage of curd
The complete code is not written, only the core code
The specific methods are derived from basemapper < T >
3.1 insertion operation
//After adding data, get the primary key value @Test public void testInsertGetId(){ User user = new User(); user.setName("Li Si"); user.setAge(20); user.setEmail("lisi@163.com"); int rows = userDao.insert(user); System.out.println("insert user rows:"+rows); //Get the primary key id, which is the id of the data just added to the database int id = user.getId();//get method corresponding to the primary key field System.out.println("Primary key id:"+id); }
3.2 update operation
- If the number of attributes is used, the updated number will be displayed
- It is best to use classes of wrapper type
When defining entity classes, it is best to use wrapper types as follows:
- Defines the basic type of an entity class. If it is not updated, it will be given 0 by default, that is, it will be updated
- Define the entity class wrapper type. If it is not updated, it is null by default, but if it is updated, it is an updated non null type.
@Test public void testUpdateUser(){ User user = new User(); user.setName("Modified data"); user.setAge(22); user.setEmail("edit@163.com"); user.setId(2); //Perform an update based on the primary key value /*UPDATE user SET name=?, email=?, age=? WHERE id=? *All non null attribute values are updated, and the condition where id = primary key value */ int rows = userDao.updateById(user); System.out.println("update rows:"+rows); }
3.3 delete
- Delete a piece of data by primary key
The method is deleteById()
@Test public void testDeleteById(){ //DELETE FROM user WHERE id=? int rows = userDao.deleteById(3); System.out.println("deleteById:"+rows); }
- Delete the data by conditions, which are encapsulated in the Map object
The method is deleteByMap(map object);
@Test public void testDeleteByMap(){ //Create a Map object and save the condition value Map<String,Object> map = new HashMap<>(); //put("field name of table", condition value), which can encapsulate multiple conditions map.put("name","zs"); map.put("age",20); //Call delete method //DELETE FROM user WHERE name = ? AND age = ? int rows = userDao.deleteByMap(map); System.out.println("deleteByMap rows:"+rows); }
- Use multiple primary key values to delete data
Use the list by deleteBatchIds()
@Test public void deleteByBatchId(){ List<Integer> ids = new ArrayList<>(); ids.add(1); ids.add(2); ids.add(3); ids.add(4); ids.add(5); //Delete operation //DELETE FROM user WHERE id IN ( ? , ? , ? , ? , ? ) int i = userDao.deleteBatchIds(ids); System.out.println("deleteBatchIds:"+i); }
lambda expressions can also be used for deletion
Replace the code listed above with
//Create a List collection using lambda List<Integer> ids = Stream.of(1, 2, 3, 4, 5).collect(Collectors.toList());
3.4 query operation
- Query according to the primary key value. The method is selectById
@Test public void testSelectById(){ /** * Generated sql: SELECT id,name,email,age FROM user WHERE id =? * If no data is found according to the primary key, the returned value is null */ User user = userDao.selectById(6); System.out.println("selectById:"+user); //Before using an object, you need to determine whether the object is null if(user != null){ //Call of business method } }
- Implement batch query, query according to multiple primary key values, and obtain the List
The method is selectBatchIds
@Test public void testSelectBatchId(){ List<Integer> ids = new ArrayList<>(); ids.add(6); ids.add(9); ids.add(10); //Query data //SELECT id,name,email,age FROM user WHERE id IN ( ? , ? , ? ) List<User> users = userDao.selectBatchIds(ids); System.out.println("size:"+users.size()); for (User u:users){ System.out.println("Query user:"+u); } }
You can also use lambda expressions for queries
List<Integer> ids = Stream.of(6, 9, 10, 15).collect(Collectors.toList());
- Multi criteria query using Map
The method is selectByMap()
@Test public void testSelectMap(){ //Create a Map to encapsulate query criteria Map<String,Object> map = new HashMap<>(); //key refers to the field name, value refers to the field value, and multiple keys refer to and connection map.put("name","zhangsan"); map.put("age",20); //Query according to Map //SELECT id,name,email,age FROM user WHERE name = ? AND age = ? List<User> users = userDao.selectByMap(map); users.forEach(user -> { System.out.println("selectByMap:"+user); }); }
4. ActiveRecord
- ActiveRecord is responsible for persisting itself and encapsulating access to the database in ActiveRecord
Q. implement CRUD by the object itself to realize elegant database operation - ActiveRecord also encapsulates some of the business logic. It can be used as a business object
The following chapters also talk about the usage of adding, modifying and checking (I won't list the subheadings)
The main difference is
- The former needs to inject mapper and use the classes inherited from mapper (implement curd)
- Now it is not necessary to inject mapper, but inherit extends Model<Dept> through entity class, and then call model class to implement curd.
//unwanted //Using automatic injection, inject Mapper objects (Dao) @Autowired private UserMapper userDao;
View the source code in the model class
Same as the previous steps
- Create a table in the database
- Create an entity class with the same attribute in the code
When using AR, the entity class needs to inherit the Model in MP, which provides operations on the CRUD of the database
mapper files should also be written
Because DeptMapper does not need to be used, MP needs to use DeptMapper to obtain the table information of the database.
If deptmapper is not defined, MP will report an error and cannot find the definition information of the table
public interface DeptMapper extends BaseMapper<Dept> { }
Remember to add this annotation to the test class
For @ RunWith(SpringRunner.class), the Test class needs to use the injected class, such as the class injected by @ Autowired, before it can be instantiated into the spring container
The specific test classes are as follows
4.1 insertion operation
The insert method in the model is called
@Test public void testARInsert(){ //Defines the entity of dept Dept dept = new Dept(); dept.setName("Administration Department"); dept.setMobile("010-66666666"); dept.setManager(5); //Call the entity object's own method to complete the addition of the object itself to the database boolean flag = dept.insert(); System.out.println("ar insert result:"+flag); }
4.2 update operation
@Test public void testARUpdate(){ //Define entity Dept Dept dept = new Dept(); // dept.setId(2); dept.setMobile("010-22222222"); dept.setName("Changed to marketing department"); dept.setManager(2); //Update record based on primary key id // UPDATE dept SET name=?, mobile=?, manager=? WHERE id=? // id = 1 boolean result = dept.updateById();//Use the value of dept entity primary key as where id = 1 System.out.println("ar updateById result:"+result); }
Update as many attributes as you write (the definition of prerequisite attributes are all wrapper types)
@Test public void testARUpdate2(){ //Define entity Dept Dept dept = new Dept(); // dept.setId(1); dept.setMobile("010-3333333"); //Name and manager are not modified //Update record based on primary key id // UPDATE dept SET name=?, mobile=?, manager=? WHERE id=? // id = 1 // Null property values are not updated, and there are no null fields in update //UPDATE dept SET mobile=? WHERE id=? boolean result = dept.updateById();//Use the value of dept entity primary key as where id = 1 System.out.println("ar updateById result:"+result); }
4.3 delete
- The deleteById() delete operation returns true even if it does not delete data from the database
@Test public void testARDeleteById(){ Dept dept = new Dept(); //DELETE FROM dept WHERE id=? boolean result = dept.deleteById(1); System.out.println("ar deleteById result:"+result); }
4.4 query operation
Method selectByID
- Data can be found and objects can be returned according to the primary key of the entity
- Data cannot be found according to the primary key of the entity. It is null and no error is reported
- null is also returned if there is no record or no data
@Test public void testARSelectById(){ Dept dept = new Dept(); //Set the value of the primary key // dept.setId(1); //Call query method //SELECT id,name,mobile,manager FROM dept WHERE id=? Dept dept1 = dept.selectById(); System.out.println("ar selectById result:"+dept1); } @Test public void testARSelectById2(){ Dept dept = new Dept(); Dept dept1 = dept.selectById(3); System.out.println("dept1:"+dept1); }