1、简介 1.Mybatis是一个优秀的持久层框架 2.持久化 数据持久化
持久化就是将程序的数据在持久状态和瞬时状态转化的过程
内存:断电即失
数据库(JDBC),IO文件持久化
生活:冷藏
因为内存的断电即失与内存的造价,就一些对象不能丢掉
3.持久层 Dao层、Service层、controller层…..
4.为什么需要Mybatis
方便
帮助程序员将数据存到数据库中
传统的JDBC代码太复杂了。简化,框架,自动化
2、第一个Mybatis程序 思路:搭建环境->导入Mybatis->编写代码->测试
1、搭建环境
UserMapper接口
1 2 3 4 5 6 7 8 9 10 package com.zhang.mapper;import com.zhang.pojo.User;import java.util.List;public interface UserMapper { List<User> selectUserList () ; }
User实体类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 package com.zhang.pojo;import lombok.Data;@Data public class User { private int id; private String name; private String 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; } }
UserMapper配置文件
1 2 3 4 5 6 7 8 9 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace ="com.zhang.mapper.UserMapper" > <select id ="selectUserList" resultType ="com.zhang.pojo.User" > select * from user.user; </select > </mapper >
Mybatis的配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <?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 > <typeAliases > <package name ="com.zhang.pojo.User" /> </typeAliases > <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/user?useSSL=false" /> <property name ="username" value ="root" /> <property name ="password" value ="root" /> </dataSource > </environment > </environments > <mappers > <mapper class ="com.zhang.mapper.UserMapper" /> </mappers > </configuration >
3、CRUD 1、namespace namespace中的包名要和Dao/mapper接口的包名一致
2.select 选择查询语句:
id:就是对应的namespace中的方法名
resultType:Sql语句执行的返回值类型!
parameterType:Sql语句参数类型
1.编写接口
1 2 3 4 5 6 7 public interface UserMapper { List<User> selectUserList () ; User getUserByID (int id) ; int addUser (User user) ; int updateUser (User user) ; int deleteUser (int i) ; }
2.编写对应mapper中的sql语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <insert id ="addUser" parameterType ="com.zhang.pojo.User" > insert into user.user(id, name, pwd) values (#{id},#{name},#{pwd}); </insert > <update id ="updateUser" parameterType ="com.zhang.pojo.User" > update user.user set name=#{name} , pwd=#{pwd} where id=#{id}; </update > <delete id ="deleteUser" parameterType ="int" > delete from user.user where id = #{id}; </delete > <select id ="selectUserList" resultType ="com.zhang.pojo.User" > select * from user.user; </select > <select id ="getUserByID" resultType ="com.zhang.pojo.User" parameterType ="int" > select * from user.user where id=#{id}; </select >
3.测试
4.侧重点:增删改查提交事务
4、配置优化
类型别名是为Java类型设置一个短的名字
存在的意义仅是用来减少类完全限定名的冗余
```xml
1 2 3 4 5 6 7 8 9 也可以指定一个包名,MyBatis会在包名下面搜索需要的Java Bean比如: 扫描实体类的包,他的默认别名就为这个嘞的类名,首字母小写! ```xml <typeAliases> <package name="com.zhang.pojo"/> </typeAliases>
若实体类比较多建议用第二种,但第一种可以DIY别名
若第二种方法非要改别名,那就在实体类上加注解
5、映射器(mappers) MapperRegistry:注册绑定我们的Mappers文件
方式一:
1 2 3 <mappers > <mapper resource ="com.zhang.mapper.UserMapper" /> </mappers >
方式二:使用class文件绑定注册
1 2 3 <mappers > <mapper class ="com.zhang.mapper.UserMapper" /> </mappers >
注意点:
接口和他的Mapper配置文件必须同名
接口和他的Mapper配置文件必须在同一个包下
方式三:使用扫描包注入绑定
1 2 3 <mappers > <package class ="com.zhang.mapper.UserMapper" /> </mappers >
6、生命周期
7、resultMap 结果集映射
id name pwd
id name passwoord
resuletMap是Mybatis中最重要最强大的元素
ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。
你完全可以不用显式地配置它们。 虽然上面的例子不用显式配置 ResultMap
8、日志 1、日志工厂 如果一个数据库操作出现了异常,我们需要排错,日志就是最好的助手
曾经的日志:sout,debug
现在的日志
SLF4J
LOG4J【掌握】
LOG4J2
JDK_LOGGING
COMMONS_LOGGING
STDOUT_LOGGING【掌握】
NO_LOGGING
Mybatis具体使用哪一个日志实现,在设置中设定
STDOUT_LOGGING标准日志输出 **
LOG4J 什么是LOG4J:
Log4j是Apache 的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台 、文件、GUI 组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog 守护进程 等
我们也可以控制每一条日志的输出格式
通过定义每一条日志信息的级别,我们能够更加细致的控制日志生成过程
通过一个配置文件来领国的配置,而不需要修改应用代码
导入log4j的包
1 2 3 4 5 <dependency > <groupId > log4j</groupId > <artifactId > log4j</artifactId > <version > 1.2.12</version > </dependency >
log4j.properties’
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 log4j.rootLogger =DEBUG,console,file log4j.appender.console =org.apache.log4j.ConsoleAppender log4j.appender.console.Target =System.out log4j.appender.console.Threshold =DEBUG log4j.appender.console.layout =org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern =[%c]-%m%n log4j.appender.file =org.apache.log4j.RollingFileAppender log4j.appender.file.File =./log/zhang.log log4j.appender.file.MaxFileSize =10mb log4j.appender.file.Threshold =DEBUG log4j.appender.file.layout =org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern =[%p][%d{yy-MM-dd}][%c]%m%n log4j.logger.org.mybatis =DEBUG log4j.logger.java.sql =DEBUG log4j.logger.java.sql.Statement =DEBUG log4j.logger.java.sql.ResultSet =DEBUG log4j.logger.java.sql.PrepareStatement =DEBUG
配置log4j为日志的实现
1 2 3 <settings > <setting name ="logImpl" value ="LOG4J" /> </settings >
直接运行测试
简单使用
要使用Log4j中的类,先导入包import org.apache.log4j.Logger;
日志对象,参数为当前类的class
1 static Logger logger=Logger.getLogger(Mytest.class);
日志级别
1 2 3 logger.info("info:进入了testLog4j" ); logger.debug("debug:进入了testLog4j" ); logger.error("error:进入了testLog4j" );
9、注解开发
UserMapper接口
1 2 3 4 @Select("select * from user.user") List<User> getUsers () ; @Select("SELECT * from user.user where id=#{id} and name=#{name}") User getUser (@Param("id") int id,@Param("name") String name) ;
Mybatis的配置文件中要将绑定接口
1 2 3 <mappers > <mapper class ="com.zhang.mapper.UserMapper" /> </mappers >
3.代码测试
1 2 3 4 5 6 7 8 public void addUsers () { SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); int i = mapper.addUser(new User (5 , "ZHMPIG" , "ZHMDAZHUZHU" )); if (i>0 ){ System.out.println("添加成功" ); } }
4.运行结果
10、Lombok Lombok的依赖坐标
1 2 3 4 5 6 <dependency > <groupId > org.projectlombok</groupId > <artifactId > lombok</artifactId > <version > 1.16.10</version > <scope > provided</scope > </dependency >
插件:在IDEA中打开Setting,再打开插件搜索Lombok
常用注解
1 2 3 4 5 6 @Getter and @Setter @ToString @EqualsAndHashCode @AllArgsConstructor ,@NoArgsConstructor @Data
11、多对一处理 环境搭建:SQL代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 create table teacher( id int(10) not null , name varchar(30) default null, primary key (id) ) ; INSERT INTO teacher(id,name) values (1,'李老师'); create table student( id int(10) not null , name varchar(30) default null, tid int(10) default null, primary key (id), key fktid (tid), constraint fktid foreign key (tid) references teacher(id) ); insert into student(id,name,tid) values (1,'小明',1); insert into student(id,name,tid) values (2,'小红',1); insert into student(id,name,tid) values (3,'小张',1); insert into student(id,name,tid) values (4,'小李',1); insert into student(id,name,tid) values (5,'小王',1);
实体类的构建:
Student
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package com.zhang.pojo;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import lombok.ToString;@Data @AllArgsConstructor @ToString @NoArgsConstructor public class Student { private int id; private String name; private Teacher teacher; }
Teacher
1 2 3 4 5 6 7 8 9 package com.zhang.pojo;import lombok.Data;@Data public class Teacher { private int id; private String name; }
StudentMapper.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <?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.zhang.mapper.StudentMapper"> <select id=" getStudent" resultMap=" StudentTeacher"> select * from user.student </select> <resultMap id=" StudentTeacher" type=" Student"> <result property=" id" column=" id"/> <result property=" name" column=" name"/> <association property=" teacher" column=" tid" javaType=" Teacher" select=" getTeacher" /> </resultMap> <select id=" getTeacher" resultType=" teacher"> select * from user.teacher where id = #{id} </select> </mapper>