记住Mybatis的使用过程为:创建可序列化实体类,定义接口,提供配置文件。 然后在Spring RestController对外访问方法中调用mapper接口操作数据库。 ------------------------使用注解方式的 MyBatis--------------------------------------------------------------------------- //创建可序列化实体类 用lombok4个注解实现自动生成settergetter和无参全参构造函数 import lombok.Data; import lombok.Builder;//builer和data合用会造成没有无参构造函数,所以需要加上下边2个注解 import lombok.NoArgsConstructor; import lombok.AllArgsConstructor; import com.fasterxml.jackson.annotation.JsonProperty; @Builder @Data @NoArgsConstructor @AllArgsConstructor public class Student implements Serializable { private static final long serialVersionUID = -7748312639957930069L; private String id; private String name; // 班级,在学生表中,可以抽象到实体班级中 @JsonProperty(value ="studentclass")//处理jackson序列化JSON字符串大小写问题 private StudentClass studentclass; // 学校,在学生表中,可以抽象到实体学校中 private StudentSchool studentschool; ...... +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //Mapper接口 1.用mybatis的@Mapper注解一个interface接口, 用于将SQL语句映射到java可调用的函数中供RestController层调用, 同时用于SQL语句读写数据库。 同时此interface接口需要用@Repository注解使其作为DAO接口托管给spring生成bean等一系列操作。 import org.apache.ibatis.annotations.*; import org.springframework.stereotype.Repository; @Repository @Mapper public interface StudentMapper {......} 2.添加SQL映射,用于把SQL查询结果结果封装成java对象, @Result:用于指定数据库查询结果的一个字段到Java对象的属性的映射,实现结果集封装。 @Results:用于定义多个@Result注解的集合。 @One:用于多表查询一对一结果集封装。 @Many:用于多表查询一对多结果集封装。 @Select:用于映射查询语句。 @Results({ // property对应实体的属性值,column对应数据表字段 @Result(property="id",column="id"), @Result(property="name", column="name"), @Result(property ="teacher",column="id", javaType =site.zhangzhuo.shit.mapper.Teacher.class,//单条类型用结果类 one=@One(select="xxx.xxx.xxx.StudentMapper.findTeacherByStudentId"))//查询结果遇到one执行本SQL实现多表查询 @Result(property="schoolbags",column="id", javaType = List.class,//多条结果类型用List many=@Many(select="xxx.xxx.xxx.StudentMapper.findSchoolBagsByStudentId"))//查询结果遇到many执行本SQL实现多表查询 } @Select("select t.id, t.name from student t where t.id = #{id} ") Student getStudent(@Param("id") Long id);//函数被RestController调用,返回的是个java对象,对象类需要@Data注解。 @Insert:用于映射插入语句。 @Update:用于映射更新语句。 @Delete:用于映射删除语句。 @SelectProvider:用于映射复杂的查询语句,可以使用Java类来构造SQL。 @InsertProvider:用于映射复杂的插入语句。 @UpdateProvider:用于映射复杂的更新语句。 @DeleteProvider:用于映射复杂的删除语句。 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //RestController类 1.创建@RestController注解Class类,用于连接http出入口和mybatis的Mapper对象。 import org.springframework.web.bind.annotation.*; import org.springframework.beans.factory.annotation.Autowired; 2.类内@Autowired注解注入Mapper对象。 private StudentMapper studentMapper; 3.类内 @RequestMapping注解成员函数创建http出入口, 同时用@RequestParam注解函数参数来接收http传来的数据, 同时在函数内调用上边注入的mybatis的Mapper对象的成员函数,传入数据定位参数,获取数据, 最后将获取的数据return(当return的数据是个java对象的时候,@RequestMapping会默认用JACKSON将其序列化为JSON字符串返回http)。 @RequestMapping(value = "/studentXML", method = RequestMethod.GET) public Object getStudentXML(@RequestParam Long id){ return studentNewMapper.getStudent(id); } @RequestMapping(value = "/student", method = RequestMethod.POST) public String addStudent(@RequestBody Student student){ studentMapper.saveStudent(student); return "ok"; } -------------------------------------------------------------------------------------------------------------------------- ------------------------使用XML方式的 MyBatis------------------------------------------------------------------------------ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 逻辑顺序: @Mapper接口方法名称、入参、返回值-》XML文件CRUD元素id、占位符#{}、SQL语句结果集ResultType/ResultMap的id-》ResultMap元素的type属性类型-》子元素Result的column映射到property;子元素association的columnPrefix到property处理及子元素Result的column映射到property;子元素collection到property处理及javaType属性集合类型、ofType属性对象类型、子元素Result的column映射到property。 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //创建可序列化实体类同上 //Mapper接口java文件不用数据库操作注解了只用传参,注意这里的@Param是ibatis的而不是Spring的。 public interface StudentNewMapper { Student getStudent(@Param("id") Long id); List getStudents(); void saveStudent(@Param("student") Student student); void updateStudent(@Param("student") Student student); void deleteStudent(@Param("id") String id); } //@Mapper XML配置文件,真正的映射在这里::::::::::::::::::::::::::::::::::::: //详细参考mybatis中文网https://mybatis.net.cn/sqlmap-xml.html select t.id, t.name, t.class_no, t.class_name, t.school_no, t.school_name, s.id AS school_bag_id, s.name AS shool_bag_name, e.id AS teacher_id, e.name AS teacher_name from student t left join school_bag s on t.id = s.student_id left join teacher e on t.id = e.student_id insert into student (id, name, class_no, class_name, school_no, school_name) values (#{student.id}, #{student.name}, #{student.studentClass.no}, #{student.studentClass.name}, #{student.studentSchool.sno}, #{student.studentSchool.sname}); insert into school_bag values (#{schoolbag.id},#{schoolbag.name},#{student.id}) ; insert into teacher (id,name,student_id) values (#{student.teacher.id},#{student.teacher.name},#{student.id}) update student set name = #{student.name}, class_no= #{student.studentClass.no}, class_name= #{student.studentClass.name}, school_no= #{student.studentSchool.sno}, school_name= #{student.studentSchool.sname} where id = #{student.id} delete from student where id = #{id} +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 查询结果的column,SQL的AS处理一次,的columnPrefix属性处理一次,映射一次 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SQL本身的AS语法和ResultMap都可以达到返回结果列名映射的效果。对于把ResultMap参数换成ResultType而没有显式指定ResultMap的select语句,其实MyBatis会在幕后自动创建一个 ResultMap,再根据属性名来映射列到 JavaBean的属性上。 resultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作。实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份 resultMap 能够代替实现同等功能的数千行代码。ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。 这些元素是结果映射的基础。id 和 result 元素都将一个列的值映射到一个简单数据类型(String, int, double, Date 等)的属性或字段。 注入使你在初始化时为类设置属性的值,而不用getter/setter方法。 关联元素处理“有一个”的关系,其columnPrefix属性可以对column再做一道工序。 关联的不同之处是,你需要告诉 MyBatis 如何加载关联。MyBatis 有两种不同的方式加载关联: 嵌套 Select 查询:通过执行另外一个 SQL 映射语句来加载期望的复杂类型。会导致“N+1 查询问题”。 嵌套结果映射:使用嵌套的结果映射来处理连接结果的重复子集。(这个比起直接ResultMap个人感觉就是结构清晰和避免了多次写对象名而已) 集合元素处理“有多个”的关系,属性和关联元素几乎是一样的,除了新增的 “ofType” 属性。 读作:“posts是一个存储 Post类对象的 ArrayList集合” 集合的多结果集(ResultSet)属性,尚待研究。。。。。。 鉴别器的概念很好理解——它很像 Java 语言中的 switch 语句。 一个鉴别器的定义需要指定 column 和 javaType 属性。column 指定了 MyBatis 查询被比较值的地方。 而 javaType 用来确保使用正确的相等测试。 自动映射autoMapping属性:通过在ResultMap上设置 autoMapping 属性来为指定的结果映射设置启用/禁用自动映射。 当自动映射查询结果时,MyBatis 会获取结果中返回的列名并在 Java 类中查找相同名字的属性(忽略大小写)。 这意味着如果发现了 ID 列和 id 属性,MyBatis 会将列 ID 的值赋给 id 属性。通常数据库列使用大写字母组成的单词命名,单词间用下划线分隔;而 Java 属性一般遵循驼峰命名法约定。为了在这两种命名方式之间启用自动映射,需要将 mapUnderscoreToCamelCase 设置为 true。甚至在提供了结果映射后,自动映射也能工作。在这种情况下,对于每一个结果映射,在 ResultSet 出现的列,如果没有设置手动映射,将被自动映射。在自动映射处理完毕后,再处理手动映射。 !!!!!!!!!!properties数据库url中开启多语句allowMultiQueries=true并利用分号实现多条insert。另外利用foreach插入map中的list!!!!!! +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ------------------------------------------------------------------------------------------------------------------------- Mybatis内部对于sql执行的大致步骤: 创建 SqlSessionFactory:使用Mybatis首先需要创建一个 SqlSessionFactory 对象,SqlSessionFactory 负责创建数据库连接和 SqlSession 对象。读取MyBatis 的主配置文件(mybatis-config.xml)并使用 SqlSessionFactoryBuilder 来创建SqlSessionFactory。 创建 SqlSession:通过 SqlSessionFactory 创建一个 SqlSession 对象。SqlSession 代表了与数据库的一次会话,它可以执行 SQL 操作并管理数据库连接。通常,每个线程都会创建自己的 SqlSession。 执行 SQL 语句:在 SqlSession 中,通过调用方法执行 SQL 语句。MyBatis 支持多种方式来执行 SQL,包括 selectOne()、selectList()、insert()、update()、delete() 等方法。 SQL 语句解析:MyBatis 会解析 SQL 语句,包括动态 SQL,参数映射和结果映射。这包括了将 Java 对象转化为 SQL 语句中的参数,以及将查询结果映射回Java对象。 执行 SQL :MyBatis 将 SQL 语句发送到数据库,并执行相应的操作,如查询、插入、更新或删除。数据库返回结果或受影响的行数,这取决于SQL语句的类型。 处理结果:MyBatis 最终会将SQL的执行结果映射为 Java 对象,然后返回给调用者。映射过程通常基于映射文件中的配置。结果集的处理包括将数据库查询结果映射为 Java 对象的属性值。 ------------------------------------------------------------------------------------------------------------------------- MyBatis 就会自动为@Mapper 注解的接口创建一个实现类(实际上是一个代理对象),并将其注册到 Spring IOC 容器中,你就可以在你的服务类中直接注入 并使用它。 ------------------------------------------注意点---------------------------------------------------------------- 实体成员对象名不要用短驼峰如:iNo。因为你手写的它的setter方法或者lombok的@Data注解对其生成的setter方法为setINo(),而JACKSON反序列化根据此setINo()方法得到的对象名是ino(不是iNo),他会将开头连续的大写都转为小写而不是只转换一个字母。关于这种机制可以看JACKSON的官方说明,他们认为他们没错,这也是一种转换规范。当然也不要用全大写NO,同样会出问题。若果非要这样写的话,可以用@JsonProperty(“xxx”)解决。 ------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------数据库常用操作--------------------------------------------------------- 创建数据库 create database database_name; 创建用户 CREATE USER 'username'@'%' IDENTIFIED BY 'mypassword'; 授权用户访问数据库的所有权限: GRANT ALL PRIVILEGES ON *.* TO 'username'@'%'; 刷新权限 FLUSH PRIVILEGES; 登陆新用户username mysql -u username -p 选择新数据库 USE database_name; 创建新表 CREATE TABLE table_name ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL ); 添加数据 INSERT INTO table_name (name, age, gender) VALUES ('John', 25, 'Male'); 查看数据 SELECT * FROM table_name; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 其他: 查看表列表 SHOW TABLES IN database_name; 查看表结构 DESCRIBE table_name; 删除用户 DROP USER 'username'@'%'; 删除数据库 DROP DATABASE database_name; 删除表 DROP TABLE table_name; 删除部分数据 DELETE FROM tb_name WHERE clause; 查看用户权限 SHOW GRANTS FOR '用户名'@'主机名'; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 使用mysqldump命令导出数据 -- 导出一个库 mysqldump -u root -p database_name > database_name.sql -- 导出所有库 mysqldump -u root -p --all-databases > all_databases.sql 将.sql文件上传到目标服务器 使用mysql命令导入数据 -- 导入一个库(建库) mysql -h x.x.x.x -u root -p database_name < database_name.sql -- 导入所有库 mysql -h x.x.x.x -u root -p < all_databases.sql +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ubuntu关闭mysql服务自启动 sudo update-rc.d mysql disable -------------------------------------------------------------------------------------------------------------------------