从小白开始学习,希望自己学习的过程可以帮助更多需要的人,参考网址: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