• Mybatis 学习笔记


    可学习渠道  MYBATIS 入门教程

    1. Mybatis 介绍

      Mybatis 是 sqlmap 技术,对 JDBC 进行封装,将大量的 SQL 语句外部化。

      平时我们都用JDBC访问数据库,除了需要自己写 SQL 之外,还必须操作 Connection,Statment, ResultSet  这些其实只是手段的辅助类。 不仅如此,访问不同的表,还会写很多雷同的代码,显得繁琐和枯燥。

      那么用了 Mybatis 之后,只需要自己提供 SQL 语句,其他的工作,诸如建立连接,Statement, JDBC 相关异常处理等等都交给 Mybatis 去做了,那些重复性的工作 Mybatis 也给做掉了,我们只需要关注在增删改查等操作层面上,而把技术细节都封装在了我们看不见的地方。

    2. Mybatis 使用流程

    2.1 创建数据库和表

    # 创建数据库,略
    
    # 使用数据库
    use database_name ; 
    
    # 创建 user 表
    create table users(id int primary key auto_increment , name varchar(20) , age int);

    2.2 创建模块,添加 Maven 依赖

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <project xmlns="http://maven.apache.org/POM/4.0.0"
     3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     5     <modelVersion>4.0.0</modelVersion>
     6 
     7     <groupId>com.share</groupId>
     8     <artifactId>mybatis</artifactId>
     9     <version>1.0-SNAPSHOT</version>
    10 
    11     <dependencies>
    12 
    13         <!-- MySQL依赖 -->
    14         <dependency>
    15             <groupId>mysql</groupId>
    16             <artifactId>mysql-connector-java</artifactId>
    17             <version>5.1.17</version>
    18         </dependency>
    19 
    20         <!-- 单元测试依赖 -->
    21         <dependency>
    22             <groupId>junit</groupId>
    23             <artifactId>junit</artifactId>
    24             <version>4.11</version>
    25         </dependency>
    26 
    27         <!-- mybatis依赖 -->
    28         <dependency>
    29             <groupId>org.mybatis</groupId>
    30             <artifactId>mybatis</artifactId>
    31             <version>3.2.1</version>
    32         </dependency>
    33 
    34     </dependencies>
    35 
    36 </project>
    pom.xml

    2.3 创建实体类 User

     1 public class User {
     2 
     3     private Integer id;
     4     private String name;
     5     private int age;
     6 
     7     public Integer getId() {
     8         return id;
     9     }
    10 
    11     public void setId(Integer id) {
    12         this.id = id;
    13     }
    14 
    15     public String getName() {
    16         return name;
    17     }
    18 
    19     public void setName(String name) {
    20         this.name = name;
    21     }
    22 
    23     public int getAge() {
    24         return age;
    25     }
    26 
    27     public void setAge(int age) {
    28         this.age = age;
    29     }
    30 }
    View Code

    2.4 创建映射文件

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     3      "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     4     <!-- 定义名字空间 -->
     5     <mapper namespace="users">
     6     <!-- 定义insert语句 ,获得生成的id字段-->
     7     <insert id="insert" >
     8         insert into users(name,age) values(#{name},#{age})
     9     </insert>
    10 </mapper>     
    UserMapper.xml

    2.5 创建配置文件

     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 <configuration>
     6     <properties>
     7         <property name="driver" value="com.mysql.jdbc.Driver"/>
     8         <property name="url" value="jdbc:mysql://localhost:3306/database_name"/>
     9         <property name="username" value="root"/>
    10         <property name="password" value="root"/>
    11     </properties>
    12 
    13     <environments default="development">
    14         <environment id="development">
    15             <transactionManager type="JDBC"/>
    16             <dataSource type="POOLED">
    17             <property name="driver" value="${driver}"/>
    18             <property name="url" value="${url}"/>
    19             <property name="username" value="${username}"/>
    20             <property name="password" value="${password}"/>
    21             </dataSource>
    22         </environment>
    23     </environments>
    24 
    25     <mappers>
    26         <mapper resource="UserMapper.xml"/>
    27     </mappers>
    28 
    29 </configuration>    
    mybatis-config.xml

    2.6 测试

     1 /**
     2 * 测试 insert
     3 */
     4 @Test
     5 public void tastInsert() throws Exception {
     6     //加载配置文件
     7     InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
     8     //创建会话工厂(Builder 模式)
     9     SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(in);
    10     //开启会话,相当于连接
    11     SqlSession sess = sf.openSession();
    12 
    13     User u = new User();
    14     u.setName("sam");
    15     u.setAge(17);
    16 
    17     sess.insert("users.insert", u);
    18     sess.commit();
    19     sess.close();
    20     System.out.println("insert success !!!");
    21 }

    3. CRUD

    3.1 修改 UserMapper.xml

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     3         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     4 <!-- 定义名字空间 -->
     5 <mapper namespace="users">
     6     <!-- 定义insert语句 ,获得生成的id字段-->
     7     <insert id="insert" useGeneratedKeys="true" keyProperty="id">
     8         insert into users(name,age) values(#{name},#{age})
     9     </insert>
    10     
    11     <update id="update">
    12         update users set name = #{name} , age = #{age} where id = #{id}
    13     </update>
    14 
    15     <delete id="delete">
    16         delete from users where id = #{id}
    17     </delete>
    18     
    19     <select id="selectById" resultMap="rmUser">
    20       SELECT
    21         u.id uid,
    22         u.name uname,
    23         u.age uage ,
    24         o.id oid ,
    25         o.orderno oorderno ,
    26         o.price oprice
    27       from
    28         users u left OUTER join orders o on o.cid = u.id
    29       WHERE
    30         u.id = #{id}
    31     </select>
    32     <select id="selectAll" resultType="_User">
    33       select * from users
    34     </select>
    35     <!-- 用户映射 -->
    36     <resultMap id="rmUser" type="_User">
    37         <id column="uid" property="id" />
    38         <result column="uname" property="name" />
    39         <result column="uage" property="age"/>
    40         <collection property="orders" ofType="_Order" column="uid">
    41             <id column="oid" property="id" />
    42             <result column="oorderno" property="orderNo" />
    43             <result column="oprice" property="price"/>
    44         </collection>
    45     </resultMap>
    46 </mapper>
    UserMapper.xml

    3.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 <configuration>
     6     <properties>
     7         <property name="driver" value="com.mysql.jdbc.Driver"/>
     8         <property name="url" value="jdbc:mysql://localhost:3306/database_name?allowMultiQueries=true"/>
     9         <property name="username" value="root"/>
    10         <property name="password" value="123456"/>
    11     </properties>
    12 
    13     <!--添加别名-->
    14     <typeAliases>
    15         <typeAlias type="com.share.mybatis.domain.User" alias="_User"/>
    16     </typeAliases>
    17 
    18     <environments default="development">
    19         <environment id="development">
    20             <transactionManager type="JDBC"/>
    21             <dataSource type="POOLED">
    22                 <property name="driver" value="${driver}"/>
    23                 <property name="url" value="${url}"/>
    24                 <property name="username" value="${username}"/>
    25                 <property name="password" value="${password}"/>
    26             </dataSource>
    27         </environment>
    28     </environments>
    29 
    30     <mappers>
    31         <mapper resource="UserMapper.xml"/>
    32     </mappers>
    33 
    34 </configuration>
    mybatis-config.xml

    3.3 测试

      1 /**
      2      * 测试 insert
      3      */
      4     @Test
      5     public void tastInsert() throws Exception {
      6         //加载配置文件
      7         InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
      8         //创建会话工厂(Builder 模式)
      9         SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(in);
     10         //开启会话,相当于连接
     11         SqlSession sess = sf.openSession();
     12 
     13         Order o = new Order();
     14         o.setOrderNo("2");
     15         o.setPrice(160);
     16         o.setId(5);
     17         User user = new User();
     18         user.setId(5);
     19         o.setUser(user);
     20 
     21 
     22         sess.insert("orders.insert", o);
     23         sess.commit();
     24         sess.close();
     25         System.out.println("insert success !!!");
     26     }
     27 
     28     /**
     29      * 测试 update
     30      */
     31     @Test
     32     public void tastUpdate() throws Exception {
     33         //加载配置文件
     34         InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
     35         //创建会话工厂(Builder 模式)
     36         SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(in);
     37         //开启会话,相当于连接
     38         SqlSession sess = sf.openSession();
     39 
     40         User u = new User();
     41         u.setName("Amy");
     42         u.setAge(18);
     43         u.setId(2);
     44 
     45         sess.update("users.update", u);
     46         sess.commit();
     47         sess.close();
     48         System.out.println("update success !!!");
     49     }
     50 
     51     /**
     52      * 测试 delete
     53      */
     54     @Test
     55     public void tastDelete() throws Exception {
     56         //加载配置文件
     57         InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
     58         //创建会话工厂(Builder 模式)
     59         SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(in);
     60         //开启会话,相当于连接
     61         SqlSession sess = sf.openSession();
     62 
     63         User u = new User();
     64         u.setId(3);
     65 
     66         sess.delete("users.delete", u);
     67         sess.commit();
     68         sess.close();
     69         System.out.println("delete success !!!");
     70     }
     71 
     72     /**
     73      * 测试 SelectOne
     74      */
     75     @Test
     76     public void testSelectOne() throws IOException {
     77         //加载配置文件
     78         InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
     79         //创建会话工厂(builder模式)
     80         SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(in);
     81         //开启会话,相当于连接
     82         SqlSession sess = sf.openSession();
     83         User u = sess.selectOne("users.selectById", 5);
     84         sess.commit();
     85         System.out.println(u.getName());
     86         sess.close();
     87     }
     88 
     89     /**
     90      * 测试 SelectAll
     91      */
     92     @Test
     93     public void testSelectAll() throws IOException {
     94         //加载配置文件
     95         InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
     96         //创建会话工厂(builder模式)
     97         SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(in);
     98         //开启会话,相当于连接
     99         SqlSession sess = sf.openSession();
    100         List<User> list = sess.selectList("users.selectAll");
    101         sess.commit();
    102         System.out.println(list.size());
    103         sess.close();
    104     }

    4. 一对一

    4.1 说明

    一对一的本质为: 多对一 + 唯一性约束

    4.2 创建表,加外键和唯一约束

    # 删除 wifes_fk 表
    drop table if exists wifes_fk ;
    # 删除 husbands_fk 表
    drop table if exists husbands_fk ;
    
    # 创建 husbands_fk 表 create table husbands_fk(id
    int primary key auto_increment, hname varchar(20)) ;
    # 创建 wifes_fk 表 create table wifes_fk(id
    int primary key auto_increment, wname varchar(20) , hid int , foreign key (hid) references husbands_fk(id) , unique (hid)) ;
    # 插入数据 insert into husbands_fk(hname) values(
    'tomas') ;
    # 插入数据 insert into wifes_fk(wname , hid) values(
    'jerry' , 1) ;

    5. 一对多

    待补充。。。

    6. 多对一

    待补充。。。

    7. 多对多

    7.1 准备表

    # 创建教师表
    create table teas(id int primary key auto_increment, tname varchar(20)) ;
    # 创建学生表 create table stus(id
    int primary key auto_increment, sname varchar(20)) ;
    # 创建链接表 create table links(tid
    int , sid int , primary key (tid,sid) , foreign key (tid) references teas (id) , foreign key (sid) references stus (id)) ;

    7.2 创建类

      Teacher.java

     1 import java.util.ArrayList;
     2 import java.util.List;
     3 
     4 /**
     5  * 教师类
     6  */
     7 public class Teacher {
     8 
     9     private Integer id;
    10     private String tname;
    11     private List<Student> stus = new ArrayList<Student>();
    12 
    13     /**
    14      * 方便关联关系
    15      */
    16     public void addStudents(Student... stus) {
    17         for (Student s : stus) {
    18             this.getStus().add(s);
    19             s.getTeas().add(this);
    20         }
    21     }
    22 
    23     public List<Student> getStus() {
    24         return stus;
    25     }
    26 
    27     public void setStus(List<Student> stus) {
    28         this.stus = stus;
    29     }
    30 
    31     public Integer getId() {
    32         return id;
    33     }
    34 
    35     public void setId(Integer id) {
    36         this.id = id;
    37     }
    38 
    39     public String getTname() {
    40         return tname;
    41     }
    42 
    43     public void setTname(String tname) {
    44         this.tname = tname;
    45     }
    46 }
    Teacher.java

      Student.java

     1 import java.util.ArrayList;
     2 import java.util.List;
     3 
     4 /**
     5  * 学生类
     6  */
     7 public class Student {
     8 
     9     private Integer id;
    10     private String sname;
    11     private List<Teacher> teas = new ArrayList<Teacher>() ;
    12 
    13     public List<Teacher> getTeas() {
    14         return teas;
    15     }
    16  
    17     public void setTeas(List<Teacher> teas) {
    18         this.teas = teas;
    19     }
    20 
    21     public Integer getId() {
    22         return id;
    23     }
    24 
    25     public void setId(Integer id) {
    26         this.id = id;
    27     }
    28 
    29     public String getSname() {
    30         return sname;
    31     }
    32 
    33     public void setSname(String sname) {
    34         this.sname = sname;
    35     }
    36 }
    Student.class

    7.3 映射文件

      TeacherMapper.xml

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     3         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     4 <!-- 定义名字空间 -->
     5 <mapper namespace="teas">
     6     <insert id="insert" useGeneratedKeys="true" keyProperty="id">
     7         insert into teas(tname) values(#{tname})
     8     </insert>
     9     
    10     <insert id="insertLink">
    11       <foreach collection="stus" item="s">
    12           insert into links(tid,sid) values(#{id} , #{s.id}) ;
    13       </foreach>
    14     </insert>
    15 
    16     <select id="selectOne" resultMap="rmTeacher">
    17         select
    18           t.id tid , t.tname ttname , s.id sid , s.sname ssname
    19         from
    20           teas t
    21           left outer join links l on l.tid = t.id
    22           left outer join stus s on l.sid = s.id
    23         WHERE
    24           t.id = #{id}
    25     </select>
    26     <resultMap id="rmTeacher" type="_Teacher">
    27         <id column="tid" property="id"/>
    28         <result column="ttname"  property="tname"/>
    29         <collection property="stus" ofType="_Student" column="tid">
    30             <id column="sid" property="id" />
    31             <result column="ssname" property="sname"/>
    32         </collection>
    33     </resultMap>
    34 </mapper>
    TeacherMapper.xml

      

      StudentMapper.xml

    1 <?xml version="1.0" encoding="UTF-8" ?>
    2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    3         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    4 <!-- 定义名字空间 -->
    5 <mapper namespace="stus">
    6     <insert id="insert" useGeneratedKeys="true" keyProperty="id">
    7         insert into stus(sname) values(#{sname})
    8     </insert>
    9 </mapper>
    StudentMapper.xml

    7.4 修改配置文件,允许执行多条语句

    在  mybatis-config.xml   文件中的  properties  里的  url  中添加      ?allowMultiQueries=true"

    允许执行多条语句

    <property name="url" value="jdbc:mysql://localhost:3306/DataBase_Name?allowMultiQueries=true"/>

    添加别名

    <!--添加别名-->
    <typeAliases>
        <typeAlias type="com.share.mybatis.domain.Student" alias="_Student"/>
        <typeAlias type="com.share.mybatis.domain.Teacher" alias="_Teacher"/>
    </typeAliases>

    指定 mappers

    <mappers>
        <mapper resource="StudentMapper.xml"/>
        <mapper resource="TeacherMapper.xml"/>
    </mappers>

    7.5 执行插入

     1 public class More2More {
     2     @Test
     3     public void testInsert() throws IOException {
     4         //加载配置文件
     5         InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
     6         //创建会话工厂(Builder 模式)
     7         SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(in);
     8         //开启会话,相当于连接
     9         SqlSession sess = sf.openSession();
    10 
    11         //创建对象
    12         Teacher t1 = new Teacher();
    13         Teacher t2 = new Teacher();
    14 
    15         Student s1 = new Student();
    16         Student s2 = new Student();
    17         Student s3 = new Student();
    18         Student s4 = new Student();
    19 
    20         //设置关联
    21         t1.addStudents(s1, s2, s3);
    22         t2.addStudents(s2, s3, s4);
    23 
    24         sess.insert("teas.insert", t1);
    25         sess.insert("teas.insert", t2);
    26 
    27         sess.insert("stus.insert", s1);
    28         sess.insert("stus.insert", s2);
    29         sess.insert("stus.insert", s3);
    30         sess.insert("stus.insert", s4);
    31 
    32         //插入关系
    33         sess.insert("teas.insertLink", t1);
    34         sess.insert("teas.insertLink", t2);
    35 
    36         sess.commit();
    37         sess.close();
    38         System.out.println("ok");
    39 
    40     }
    41 }
    More2More.java

    7.6 查询教师

    在 TeacherMapper.xml 中添加查询

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     3         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     4 <!-- 定义名字空间 -->
     5 <mapper namespace="teas">
     6     <insert id="insert" useGeneratedKeys="true" keyProperty="id">
     7         insert into teas(tname) values(#{tname})
     8     </insert>
     9     
    10     <insert id="insertLink">
    11       <foreach collection="stus" item="s">
    12           insert into links(tid,sid) values(#{id} , #{s.id}) ;
    13       </foreach>
    14     </insert>
    15 
    16     <select id="selectOne" resultMap="rmTeacher">
    17         select
    18           t.id tid , t.tname ttname , s.id sid , s.sname ssname
    19         from
    20           teas t
    21           left outer join links l on l.tid = t.id
    22           left outer join stus s on l.sid = s.id
    23         WHERE
    24           t.id = #{id}
    25     </select>
    26     <resultMap id="rmTeacher" type="_Teacher">
    27         <id column="tid" property="id"/>
    28         <result column="ttname"  property="tname"/>
    29         <collection property="stus" ofType="_Student" column="tid">
    30             <id column="sid" property="id" />
    31             <result column="ssname" property="sname"/>
    32         </collection>
    33     </resultMap>
    34 </mapper>
    TeacherMapper.xml

    查询部分代码

    @Test
    public void testSelectOne() throws IOException {
        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(in);
        SqlSession sess = sf.openSession();
        Teacher t = sess.selectOne("teas.selectOne" , 1);
        sess.commit();
        System.out.println("ok");
    }
    且将新火试新茶,诗酒趁年华。
  • 相关阅读:
    DRF(四)
    DRF----------(三)
    DRF--------(二)
    DRF(一)
    VUE(四)
    VUE(三)
    VUE(二)
    DRF 序列化组件 模型层中参数补充
    django中基于python3.6使用容联发送短信
    django-jwt token校验源码简析
  • 原文地址:https://www.cnblogs.com/share23/p/9657900.html
Copyright © 2020-2023  润新知