mybatis学习成长之路(一)

  从小白开始学习,希望自己学习的过程可以帮助更多需要的人,参考网址:https://www.cnblogs.com/ysocean/p/7237499.html

    1、mybatis的jar包下载地址:https://github.com/mybatis/mybatis-3/releases

    2、浅谈mybatis # $区别:https://www.cnblogs.com/dato/p/7027949.html

  一、mybatis项目讲解

    1、项目架构:

      

    2、主配置文件: mybatis-configuration.xml  

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
 3 <configuration>
 4 <properties resource="properties/db.properties"></properties>
 5 <!--类型命名 -->
 6 <typeAliases>
 7     <!-- 
 8         <typeAlias alias="person" type="com.ys.bean.Person"></typeAlias>
 9      -->
10     <package name="com.ys.bean"/>
11 </typeAliases>
12 
13 
14 <!-- 可以配置多个运行环境,但是每个 SqlSessionFactory 实例只能选择一个运行环境  
15   一、development:开发模式
16    二、work:工作模式-->
17  <environments default="development">
18  <!--id属性必须和上面的default一样  -->
19     <environment id="development">
20     <!--事务管理器
21         一、JDBC:这个配置直接简单使用了 JDBC 的提交和回滚设置。它依赖于从数据源得到的连接来管理事务范围
22         二、MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接。而它会让容器来管理事务的整个生命周期
23             比如 spring 或 JEE 应用服务器的上下文,默认情况下,它会关闭连接。然而一些容器并不希望这样,
24             因此如果你需要从连接中停止它,就可以将 closeConnection 属性设置为 false,比如:
25             <transactionManager type="MANAGED">
26                 <property name="closeConnection" value="false"/>
27             </transactionManager>
28       -->
29       <transactionManager type="JDBC"/>
30     
31       <!--dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象源  -->
32       <dataSource type="POOLED">
33         <property name="driver" value="${driver}"/>
34         <property name="url" value="${url}"/>
35         <property name="username" value="${username}"/>
36         <property name="password" value="${password}"/>
37       </dataSource>
38     </environment>
39   </environments>
40   
41     <mappers>
42        <!-- 注册personMapper.xml文件,
43        personMapper.xml位于com.ys.bean这个包下,所以resource写成com/ys/bean/personMapper.xml-->
44        <mapper resource="com/ys/bean/personMapper.xml"/>
45     </mappers>
46 </configuration>

    3、数据库配置信息:db.properties

1 driver=com.mysql.jdbc.Driver
2 url=jdbc:mysql://localhost:3306/mybatisdemo
3 username=root
4 password=ROOT

    4、数据库实体类映射文件:personMapper.xml 

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE mapper
 3   PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 4   "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 5 <mapper namespace="com.ys.bean.personMapper">
 6   <!-- 根据 pid 查询 person 表中的数据
 7        id:唯一标识符,此文件中的id值不能重复
 8        resultType:返回值类型,一条数据库记录也就对应实体类的一个对象
 9        parameterType:参数类型,也就是查询条件的类型
10    -->
11   <select id="selectPersonById"
12             resultType="person" parameterType="int">
13     <!-- 这里和普通的sql 查询语句差不多,对于只有一个查询条件后面的 #{pid}表示占位符,里面不一定要写pid,写啥都可以,但是不要空着;如果有多个查询条件,则要写pojo类里面的属性 -->
14     select * from person where pid = #{pid}
15   </select>
16    
17   <!-- 查询person 表所有数据 -->
18   <select id="getAllPerson" resultType="person">
19     select * from person
20   </select>
21    
22   <!-- 根据id更新数据 -->
23   <update id="updatePersonById" parameterType="person">
24     update person set pname=#{pname},page=#{page} where pid = #{pid}
25   </update>
26    
27   <!-- 向 person 表插入一条数据 -->
28   <insert id="addPerson" parameterType="person" useGeneratedKeys="true" keyProperty="pid">
29     insert into person(pname,page) values(#{pname},#{page})
30   </insert>
31    
32   <!-- 根据 pid 删除数据 -->
33   <delete id="deletePersonById" parameterType="int">
34     delete from person where pid=#{pid}
35   </delete>
36    
37   <!-- 多表关联查询 -->
38    <!-- 1、映射学生对象的resultMap -->
39    <resultMap type="student" id="studentResultMap" >
40            <id property="id" column="id"/>
41            <result property="name" column="name"/>
42            <result property="sex" column="sex"/>
43            <result property="age" column="age"/>
44            <!-- 关联映射 -->
45            <association property="clazz" column="class_id" javaType="com.ys.bean.Clazz" select="selectClazzWithId"></association>
46    </resultMap>
47    
48    <!-- 根据班级id查询班级 -->
49    <select id="selectClazzWithId" resultType="com.ys.bean.Clazz">
50        select * from tb_clazz where id =#{id}
51    </select>
52    
53    <!-- 查询所有学生信息 -->
54    <select id="selectStudent" resultMap="studentResultMap">
55        select * from tb_STUDENT;
56    </select>
57    
58    <!-- 2、映射班级对象的resultMap  -->
59    <resultMap id="clazzresultMap" type="com.ys.bean.Clazz" >
60            <id property="id" column="id" />
61            <result property="code" column="code" />
62            <collection property="students" javaType="ArrayList" column="id" ofType="com.ys.bean.Student" select="selectStudentWithId"></collection>
63    </resultMap>
64    
65    <!-- 根据班级id查询学生 -->
66    <select id="selectStudentWithId" resultType="com.ys.bean.Student">
67            select * from tb_STUDENT where class_id = #{id}
68    </select>
69    
70    <!-- 查询所有班级信息 -->
71    <select id="selectClazz" resultMap="clazzresultMap">
72            select * from tb_clazz
73    </select>
74    
75 </mapper>

    5、实体类

      (1)、Clazz

 1 package com.ys.bean;
 2 
 3 import java.util.List;
 4 
 5 
 6 public class Clazz {
 7     private Integer id;
 8     private String code;
 9     private List<Student> students;
10     
11     public Integer getId() {
12         return id;
13     }
14     public void setId(Integer id) {
15         this.id = id;
16     }
17     public String getCode() {
18         return code;
19     }
20     public void setCode(String code) {
21         this.code = code;
22     }
23     public List<Student> getStudents() {
24         return students;
25     }
26     public void setStudents(List<Student> students) {
27         this.students = students;
28     }
29     
30     @Override
31     public String toString() {
32         return "Clazz [code=" + code + ", id=" + id + "]";
33     }
34 }

      (2)、Person

package com.ys.bean;
 
public class Person {
    private int pid;
    private String pname;
    private int page;
     
    public int getPid() {
        return pid;
    }
    public void setPid(int pid) {
        this.pid = pid;
    }
    public String getPname() {
        return pname;
    }
    public void setPname(String pname) {
        this.pname = pname;
    }
    public int getPage() {
        return page;
    }
    public void setPage(int page) {
        this.page = page;
    }
    @Override
    public String toString() {
        return "Person [pid=" + pid + ", pname=" + pname + ", page=" + page
                + "]";
    }
}

      (3)、Student

package com.ys.bean;

public class Student {
    private Integer id;
    private String name;
    private String sex;
    private Integer age;
    private Clazz clazz;
    
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public Clazz getClazz() {
        return clazz;
    }
    public void setClazz(Clazz clazz) {
        this.clazz = clazz;
    }
    
    @Override
    public String toString() {
        return "Student [age=" + age + ", clazz=" + clazz.toString() + ", id=" + id
                + ", name=" + name + ", sex=" + sex + "]";
    }
    
    
}

    6、测试代码

  1 package com.ys.test;
  2  
  3 import java.io.InputStream;
  4 import java.util.List;
  5  
  6 import org.apache.ibatis.session.SqlSession;
  7 import org.apache.ibatis.session.SqlSessionFactory;
  8 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  9 import org.junit.Before;
 10 import org.junit.Test;
 11  
 12 import com.ys.bean.Clazz;
 13 import com.ys.bean.Person;
 14 import com.ys.bean.Student;
 15  
 16 public class MyBatisTest {
 17     SqlSession session;
 18      
 19     @Before
 20     public void beforeLoadXML(){
 21         //加载 mybatis 配置文件
 22         InputStream inputStream = MyBatisTest.class.getClassLoader().getResourceAsStream("mybatis-configuration.xml");
 23         //构建sqlSession的工厂
 24         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
 25         //根据 sqlSessionFactory 产生 session
 26         session = sqlSessionFactory.openSession();
 27     }
 28      
 29     //根据 pid 查询 person 表中的数据
 30     @Test
 31     public void testSelectById(){
 32         //这个字符串有 personMapper.xml 文件中 两个部分构成
 33         //<mapper namespace="com.ys.bean.personMapper"> 的 namespace 的值
 34         //<select id="selectPersonById" > id 值
 35         String statement = "com.ys.bean.personMapper"+".selectPersonById";
 36         Person p = session.selectOne(statement, 1);
 37         System.out.println(p);
 38         session.close();
 39     }
 40      
 41     //查询person 表所有数据
 42     @Test
 43     public void testGetAllPerson(){
 44         String statement = "com.ys.bean.personMapper"+".getAllPerson";
 45         List<Person> listPerson = session.selectList(statement);
 46         System.out.println(listPerson);
 47         session.close();
 48     }
 49      
 50     //根据id更新数据
 51     @Test
 52     public void updateById(){
 53         String statement = "com.ys.bean.personMapper.updatePersonById";
 54         Person p = new Person();
 55         p.setPid(1);
 56         p.setPname("aaa");
 57         p.setPage(11);
 58         session.update(statement, p);
 59         session.commit();
 60         session.close();
 61     }
 62      
 63     //向 person 表插入一条数据
 64     @Test
 65     public void addPerson(){
 66         String statement = "com.ys.bean.personMapper.addPerson";
 67         Person p = new Person();
 68         //由于我们设置了主键的自增长机制,故这里不需要手动设置 pid 的值
 69         //p.setPid(1);
 70         p.setPname("addd");
 71         p.setPage(22);
 72         session.insert(statement, p);
 73         session.commit();
 74         session.close();
 75     }
 76      
 77     //根据 pid 删除person 表中的数据
 78     @Test
 79     public void deletePersonById(){
 80         String statement = "com.ys.bean.personMapper.deletePersonById";
 81         session.delete(statement, 6);
 82         session.commit();
 83         session.close();
 84     }
 85     
 86     @Test
 87     public void selectStudent(){
 88         String statement = "com.ys.bean.personMapper.selectStudent";
 89         List<Student> student_list = session.selectList(statement);
 90         for(Student stu:student_list){
 91             System.out.println(stu.toString());
 92         }
 93         session.commit();
 94         session.close();
 95     }
 96     
 97     @Test
 98     public void selectClazz(){
 99         String statement = "com.ys.bean.personMapper.selectClazz";
100         List<Clazz> student_list = session.selectList(statement);
101         for(Clazz clazz:student_list){
102             System.out.println(clazz.toString());
103             List<Student> students = clazz.getStudents();
104             for(Student stu:students){
105                 System.out.println(stu.getId()+" "+stu.getName()+" "+stu.getSex());
106             }
107         }
108         session.commit();
109         session.close();
110     }
111     
112 }

    7、数据库表的设计以及插入语句

 1 /**
 2 CREATE table tb_clazz(
 3         id int PRIMARY KEY AUTO_INCREMENT,
 4         code VARCHAR(18)
 5 );
 6 INSERT INTO tb_clazz(code) VALUES('J1601');
 7 INSERT INTO tb_clazz(code) VALUES('J1602');
 8 **/
 9 SELECT * FROM tb_clazz
10 
11 /**
12 CREATE table tb_STUDENT(
13         id int PRIMARY KEY AUTO_INCREMENT,
14         NAME VARCHAR(18),
15         sex CHAR(3),
16         age INT,
17         class_id INT,
18         FOREIGN KEY(class_id) REFERENCES tb_clazz(id)
19 );
20 INSERT INTO tb_STUDENT(NAME,sex,age,class_id) VALUES('jack','男',22,1);
21 INSERT INTO tb_STUDENT(NAME,sex,age,class_id) VALUES('rose','女',18,1);
22 INSERT INTO tb_STUDENT(NAME,sex,age,class_id) VALUES('tom','男',25,2);
23 INSERT INTO tb_STUDENT(NAME,sex,age,class_id) VALUES('mary','女',20,2);
24 */
25 SELECT * FROM tb_STUDENT
原文地址:https://www.cnblogs.com/ouyy/p/8861799.html