Mybatis学习笔记1

83 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情

Mybatis官方中文文档:mybatis – MyBatis 3 | 入门

第一个Mybatis程序

2.1搭建数据库

FieldTypeNullKeyDefaultExtra
idint(20)NOPRINULL
namevarchar(30)YESNULL
pwdvarchar(30)YESNULL
 DROP TABLE IF EXISTS `user`;
 CREATE TABLE `user`  (
   `id` int(20) NOT NULL,
   `name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
   `pwd` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
   PRIMARY KEY (`id`) USING BTREE
 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
 ​
 SET FOREIGN_KEY_CHECKS = 1;
 ​

新建项目

1.新建一个普通的Maven项目

image-20210721104102875.png

image-20210806164323912.png

image-20210721104207958.png

2.删除src目录

这里是为了使刚创建的项目成为一个父项目,不需要src目录

3.导入Maven依赖

 <?xml version="1.0" encoding="UTF-8"?>
 <project xmlns="http://maven.apache.org/POM/4.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 ​
     <!--父工程-->
     <groupId>com.isabella</groupId>
     <artifactId>Mybatis_Study</artifactId>
     <version>1.0-SNAPSHOT</version>
 ​
     <!--导入驱动-->
     <dependencies>
         <!--mysql驱动-->
         <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
         <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
             <version>5.1.47</version>
         </dependency>
 ​
         <!--Mybatis-->
         <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
         <dependency>
             <groupId>org.mybatis</groupId>
             <artifactId>mybatis</artifactId>
             <version>3.5.2</version>
         </dependency>
 ​
         <!--Junit-->
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <version>4.12</version>
         </dependency>
 ​
     </dependencies>
     <!--mysql驱动-->
     <!--Mybatis-->
     <!--Junit-->
 ​
 ​
 </project>

2.2创建一个模块

image-20210721112130207.png

image-20210721112216233.png

  • 编写mybatis的核心配置文件

image-20210907163309829.png

```
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE configuration
         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
         "http://mybatis.org/dtd/mybatis-3-config.dtd">
 <configuration>
     <environments default="development">
         <environment id="development">
             <transactionManager type="JDBC"/>
             <dataSource type="POOLED">
                 <property name="driver" value="com.mysql.jdbc.Driver"/>
                 <property name="url" value="jdbc:mysql://localhost:3306?mybatis/serverTimezone=GMT%2B8&amp;useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                 <property name="username" value="root"/>
                 <property name="password" value="*********"/>
             </dataSource>
         </environment>
     </environments>
     <mappers>
         <mapper resource="com/isabella/dao/UserMapper.xml"/>
     </mappers>
 </configuration>
```
  • 编写mybatis工具类

    此处包名为util,但标准写法应为utils

image-20210722112536514.png

 package com.isabella.util;
 ​
 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 java.io.IOException;
 import java.io.InputStream;
 ​
 public class MybatisUtils {
 ​
     private static SqlSessionFactory sqlSessionFactory;
 ​
     static {
         String resource = "mybatis-config.xml";
         try {
             InputStream inputStream = Resources.getResourceAsStream(resource);
             sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
         } catch (IOException e) {
             e.printStackTrace();
         }
 ​
     }
 ​
     public static SqlSession getSqlsession(){
         return sqlSessionFactory.openSession();
     }
 ​
 }
 ​

*********为你的数据库密码

2.3编写代码

  • 实体类

image-20210722114439673.png

```
 package com.isabella.pojo;
 ​
 public class User {
     private int id;
     private String name;
     private String pwd;
 ​
     public User() {
     }
 ​
     public User(int id, String name, String pwd) {
         this.id = id;
         this.name = name;
         this.pwd = pwd;
     }
 ​
     public int getId() {
         return id;
     }
 ​
     public void setId(int id) {
         this.id = id;
     }
 ​
     public String getName() {
         return name;
     }
 ​
     public void setName(String name) {
         this.name = name;
     }
 ​
     public String getPwd() {
         return pwd;
     }
 ​
     public void setPwd(String pwd) {
         this.pwd = pwd;
     }
 ​
     @Override
     public String toString() {
         return "User{" +
                 "id=" + id +
                 ", name='" + name + ''' +
                 ", pwd='" + pwd + ''' +
                 '}';
     }
 }
 ​
```
  • Dao接口

    UserDao.java(interface类)

     package com.isabella.dao;
     ​
     import com.isabella.pojo.User;
     ​
     import java.util.List;
     ​
     public interface UserDao {
         List<User> getUserlist();
     }
     ​
    
  • 接口实现类由原来的UserDaoImpl转变为一个Mapper配置文件

    UserMapper.xml

     <?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.isabella.dao.UserDao">
     ​
         <select id="getUserList" resultType="com.isabella.pojo.User">
         select * from mybatis.user;
       </select>
     </mapper>
    

image-20210806145842691.png

2.4测试

注意点:

org.apache.ibatis.binding.BindingException: Type interface com.isabella.dao.UserDao is not known to the MapperRegistry.

MapperRegistry是什么

核心配置文件中注册mappers

  • junit测试

    快捷写测试类方法:Dao接口里面右键,选择go to,再点test,然后create new test

image-20210806150112949.png

UserDaoTest.java

```
 package com.isabella.dao;
 ​
 import com.isabella.pojo.User;
 import com.isabella.util.MybatisUtils;
 import org.apache.ibatis.session.SqlSession;
 import org.junit.Test;
 ​
 import java.util.List;
 ​
 public class UserDaoTest{
     @Test
 ​
     public void test(){
         SqlSession sqlsession = MybatisUtils.getSqlsession();
 ​
         UserDao userDao = sqlsession.getMapper(UserDao.class);
         List<User> userlist = userDao.getUserList();
 ​
         for (User user : userlist){
             System.out.println(user);
         }
 ​
         sqlsession.close();
 ​
 ​
     }
 ​
 }
 ​
```

在两个pom.xml中加上以下代码:*很重要,一般主项目的pom写就行*

```
 <build>
         <resources>
             <resource>
                 <directory>src/main/resources</directory>
                 <includes>
                     <include>**/*.properties</include>
                     <include>**/*.xml</include>
                 </includes>
                 <filtering>true</filtering>
             </resource>
             <resource>
                 <directory>src/main/java</directory>
                 <includes>
                     <include>**/*.properties</include>
                     <include>**/*.xml</include>
                 </includes>
                 <filtering>true</filtering>
             </resource>
         </resources>
     </build>
```

CRUD增删改查

1.namespace

namespace中的包名要和Dao/mapper接口的包名一致

将UserDao改名为UserMapper,接口名要改,测试类名要改,UserMapper.xml中namespace也要改

image-20210809102309056.png

2.select

选择,查询语句;

  • id:就是对应的namespace中的方法名;
  • resultType:Sql语句执行的返回值;
  • parameterType:参数类型

查询某一数据

1.编写接口

UserMapper.java:

 //根据id查询用户
 User getUserById(int id);

2.编写对应的mapper中的sql语句

UserMapper.xml:

 <select id="getUserById" resultType="com.isabella.pojo.User" parameterType="int">
         select * from mybatis.user where id = #{id};
     </select>

3.测试

UserMapperTest.java:

 package com.isabella.dao;
 ​
 import com.isabella.pojo.User;
 import com.isabella.util.MybatisUtils;
 import org.apache.ibatis.session.SqlSession;
 import org.junit.Test;
 ​
 import java.util.List;
 ​
 public class UserMapperTest {
     @Test
 ​
     public void test() {
         SqlSession sqlsession = MybatisUtils.getSqlsession();
 ​
         UserMapper mapper = sqlsession.getMapper(UserMapper.class);
 ​
         User user = mapper.getUserById(1);
         System.out.println(user);
 ​
         sqlsession.close();
 ​
 ​
     }

Insert

UserMapper.java:

  //insert一个用户
     int addUser(User user);
 ​

UserMapper.xml

 <insert id="addUser" parameterType="com.isabella.pojo.User">
         insert into mybatis.user (id, name, pwd) values (#{id},#{name},#{pwd});
     </insert>

UserMapperTest.java:

 package com.isabella.dao;
 ​
 import com.isabella.pojo.User;
 import com.isabella.util.MybatisUtils;
 import org.apache.ibatis.session.SqlSession;
 import org.junit.Test;
 ​
 import java.util.List;
 ​
 public class UserMapperTest {
     
     @Test
     public void addUser(){
         SqlSession sqlsession = MybatisUtils.getSqlsession();
         UserMapper mapper = sqlsession.getMapper(UserMapper.class);
 ​
         int res=mapper.addUser(new User(5,"zs","abcd"));
         System.out.println(res);
         sqlsession.commit();
         sqlsession.close();
     }
 ​
 }

注意:如果不写commit,无法提交事务,数据将不会插入

update

UserMapper.java:

 //修改用户
     int updateUser(User user);

UserMapper.xml:

 < id="updateUser" parameterType="com.isabella.pojo.User">
         update mybatis.user set name=#{name},pwd=#{pwd}  where id=#{id} ;
     </update>

UserMapperTest.java:

  @Test
     public void updateUser(){
         SqlSession sqlsession = MybatisUtils.getSqlsession();
         UserMapper mapper = sqlsession.getMapper(UserMapper.class);
 ​
         mapper.updateUser(new User(3,"哈哈","123123"));
 ​
         sqlsession.commit();
         sqlsession.close();
     }

delete

UserMapper.java:

 //删除一个用户
     int deleteUser(int id);

UserMapper.xml:

 <delete id="deleteUser" parameterType="int">
         delete from mybatis.user where id=#{id};
     </delete>

UserMapperTest.java:

 @Test
     public void deleteUser(){
         SqlSession sqlsession = MybatisUtils.getSqlsession();
         UserMapper mapper = sqlsession.getMapper(UserMapper.class);
 ​
         mapper.deleteUser(3);
 ​
         sqlsession.commit();
 ​
         sqlsession.close();
     }

Map和模糊查询拓展

Map

假设,我们的实体类,或者数据库中的表,字段或者参数过多,我们应当考虑使用Map

Map传递参数,直接在sql中取出key即可

对象传递参数,直接在sql中取出对象的属性即可

只有一个基本类型参数的情况下,可以直接在sql中取到

多个参数用Map,或者注解

UserMapper.java:

 package com.isabella.dao;
 ​
         import com.isabella.pojo.User;
 ​
         import java.util.List;
         import java.util.Map;
 ​
 public interface UserMapper {
     
     //根据id查询用户
 ​
 ​
     User getUserById2(Map<String,Object> map);
 ​
 }
 ​

UserMapper.xml:

 <select id="getUserById2" parameterType="map" resultType="com.isabella.pojo.User">
         select * from mybatis.user where id = #{id} and name = #{name};
     </select>

UserMapperTest.java:

  @Test
     public void getUserById2(){
         SqlSession sqlsession = MybatisUtils.getSqlsession();
         UserMapper mapper = sqlsession.getMapper(UserMapper.class);
 ​
         Map<String,Object> map = new HashMap<String, Object>();
         map.put("name","zfq");
         map.put("id",1);
         User user = mapper.getUserById2(map);
         System.out.println(user);
 ​
         sqlsession.close();
     }

模糊查询

  1. Java代码执行的时候,传递通配符%%

    UserMapper.java:

     //模糊查询
         List<User> getUserLike(String value);
    

    UserMapper.xml:

     <select id="getUserLike" resultType="com.isabella.pojo.User">
             select * from mybatis.user where name like #{value} ;
         </select>
    

    UserMapperTest.java:

      @Test
         public void getUserLike(){
             SqlSession sqlsession = MybatisUtils.getSqlsession();
             UserMapper mapper = sqlsession.getMapper(UserMapper.class);
     ​
             List<User> userList = mapper.getUserLike("%李%");
             for (User user : userList) {
                 System.out.println(user);
             }
     ​
     ​
             sqlsession.close();
         }
    
  2. 在sql拼接中使用通配符

     <select id="getUserLike" resultType="com.isabella.pojo.User">
             select * from mybatis.user where name like "%"#{value}"%" ;
         </select>
    

属性优化

配置解析

核心配置文件

环境配置(environments)

MyBatis 可以配置成适应多种环境

不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。

通过修改environments中default的默认id实现对环境的选择

Mybatis默认的事务管理器就是JDBC,连接池:POOLED

属性(properties)

我们可以通过properties属性来实现引用配置文件

这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。【db.properties】

image-20210809212828269.png

编写一个配置文件

image-20210809212421948.png

db.properties:

 driver=com.mysql.jdbc.Driver
 url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=GMT%2B8&useSSL=false&useUnicode=true&characterEncoding=UTF-8

在核心配置文件中引入

mybatis-config.xml

 <?xml version="1.0" encoding="UTF8" ?>
 <!DOCTYPE configuration
         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
         "http://mybatis.org/dtd/mybatis-3-config.dtd">
 <configuration>
 ​
     <!--引入外部配置文件-->
     <properties resource="db.properties">
         <property name="username" value="root"/>
         <property name="password" value="qq20010404"/>
     </properties>
 ​
 ​
     <environments default="development">
         <environment id="development">
             <transactionManager type="JDBC"/>
             <dataSource type="POOLED">
                 <property name="driver" value="${driver}"/>
                 <property name="url" value="${url}"/>
                 <property name="username" value="${username}"/>
                 <property name="password" value="${password}"/>
             </dataSource>
         </environment>
     </environments>
     <mappers>
         <mapper resource="com/isabella/dao/UserMapper.xml"/>
     </mappers>
 </configuration>
  • 可以直接引入外部文件
  • 可以在其中增加一些属性配置
  • 如果两个文件有同一个字段,优先使用外部配置文件的