java框架学习之mybatis
框架开发准备
- 开发工具:idea ;
- 开发需要架包: 链接:https://pan.baidu.com/s/14nVP--ePvXSFpi4YTmDVWQ
提取码:cxqr ; - mysql 8.0.16
mybatis框架的搭建
1.创建一个普通java项目
2.导入mybatis需要架包
3.在根目录(src)下配置mysql配置文件 mysqlsource.properties
#MySQL8版本 jdbc连接时
#URL后必须接serverTimezone参数,否则报异常,其值设置为Asia/Shanghai,
#不要设置为UTC或其他,否则MySQL添加数据或获取数据时得到的时间戳和本机或本服务器时间会不一致
#characterEncoding=GBK数据库字符集
#rewriteBatchedStatements=true让mysql数据库开启批处理模式 该参数只支持mysql5.1.40及以上版本的驱动才能实现高性能的批量插入
connectionURL=jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8
driverClass=com.mysql.cj.jdbc.Driver
password=root
userName=root
根据数据库名与账号密码更改
4.在根目录(src)下配置mybatis配置文件 mybatis-config.xml
<?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>
<!-- 加载工程中的.properties配置文件 -->
<properties resource="mysqlsource.properties"/>
<!-- 配置MyBatista所需的数据源 -->
<environments default="MyDataSource">
<environment id="MyDataSource">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driverClass}"/>
<property name="url" value="${connectionURL}"/>
<property name="username" value="${userName}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
</configuration>
5.创建包结构
6.在vo包下创建实体类TeacherVO.java
package com.mybatis.vo;
public class TeacherVO {
private Long tid;
private String tname;
private String subject;
public TeacherVO(Long tid, String tname, String subject) {
this.tid = tid;
this.tname = tname;
this.subject = subject;
}
public TeacherVO() {
}
public Long getTid() {
return tid;
}
public void setTid(Long tid) {
this.tid = tid;
}
public String getTname() {
return tname;
}
public void setTname(String tname) {
this.tname = tname;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
@Override
public String toString() {
return "TeacherVO{" +
"tid=" + tid +
", tname='" + tname + '\'' +
", subject='" + subject + '\'' +
'}';
}
}
7.在vo包下配置TeacherVO.xml配置文件
<?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">
<!-- namespace 属性赋值就是对象dao接口的全称 -->
<mapper namespace="com.mybatis.dao.TeacherDao">
<!-- ORM Object-relattion-mapping -->
<!--type属性就是把resutlset结果集封装成指定的JAVA对象 赋予类的全称-->
<resultMap id="teacherResultMap" type="com.mybatis.vo.TeacherVO">
<!-- id标签指向的是数据表中主键列
column属性是指向数据表的主键列名
jdbcType属性是指向数据库对应列名的数据类型
property属性指向对应的JAVA对象中属性名称
-->
<id column="tid" jdbcType="BIGINT" property="tid"/>
<result column="tname" jdbcType="VARCHAR" property="tname"/>
<result column="subject" jdbcType="VARCHAR" property="subject"/>
</resultMap>
</mapper>
并在mybatis-config.xml中添加TeacherVO.xml的映射
<mappers>
<mapper resource="com/mybatis/vo/TeacherVO.xml"></mapper>
</mappers>
9.在factory包下创建MybatisSessionFactory的
package com.mybatis.factory;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
public class MybatisSessionFactory {
private static SqlSessionFactory sqlSessionFactory;
//加载mybatis-config.xml配置文件
static {
InputStream ins = MybatisSessionFactory.class.getClass().getResourceAsStream("/mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(ins);
}
public static SqlSession getSession(){
if (sqlSessionFactory==null) throw new NullPointerException("session工厂创建失败");
//设置BATCH 批处理模式
//fasle代表是事务是非自动提交 true代表的是自动提交事务
SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH, false);
return session;
}
}
10.在根目录(src下)创建log4j2.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- 设置log4j2的自身log级别为warn -->
<!-- -->
<!--
status设置为DEBUG,这样用户可以在Eclipse的console看到Log4j2启动和加载配置文件时的打印信息,如果不需要就设置OFF
status可设置为OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL
monitorInterval是用来设置配置文件的动态加载时间的,单位是秒。
monitorInterval="30"表示每30秒配置文件会动态加载一次。
在程序运行过程中,如果修改配置文件,程序会随之改变。 -->
<configuration status="INFO" monitorInterval="30">
<!-- 设置日志文件目录变量名及变量值
该properties配置如果没有配置,就直接将该值写入到相应的位置
-->
<properties>
<property name="LOG_HOME">C:\log_file</property>
<property name="FILE_NAME">testdaomybatis</property>
</properties>
<appenders>
<!--
Console:在命令行打印
RollingFile:打印到文件中
Rolling的意思是当满足一定条件后,就重命名原日志文件用于备份,并从新生成一个新的日志文件。
例如需求是每天生成一个日志文件,但是如果一天内的日志文件体积已经超过1G,就从新生成,两个条件满足一个即可。
这在log4j 1.x原生功能中无法实现,在log4j2中就很简单了。
-->
<console name="Console" target="SYSTEM_OUT">
<PatternLayout charset="utf-8" pattern="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</console>
<RollingFile name="RollingFileInfo" fileName="${LOG_HOME}/${FILE_NAME}/${FILE_NAME}_info.log"
filePattern="${LOG_HOME}/${FILE_NAME}/$${date:yyyy-MM}/${FILE_NAME}_info-%d{yyyy-MM-dd}-%i.log">
<!--
ConsoleAppender、
FileAppender(以及他的堂哥RandomAccessFileAppender)、
RollingFileAppender(以及他的堂哥RollingRandomAccessFileAppender),
其中RollingFileAppender是三个appender中的大哥大,因为他一个人的文档篇幅就是其它两个appender文档篇幅总和的6~7倍左右。。。
RollingFile/RollingRandomAccessFile的属性:
fileName 指定当前日志文件的位置和文件名称
filePattern 指定当发生Rolling时,文件的转移和重命名规则
SizeBasedTriggeringPolicy 指定当文件体积大于size指定的值时,本配置设置为100M的文件存储空间,如果超过100M,
触发Rolling,按照filePattern属性设置值进行操作。会自动将以前的内容,创建类似 2014-09(年-月)的目录,
然后按 "xxx-年-月-日-序号"命名,打成压缩包
DefaultRolloverStrategy 指定打成压缩包最多保存的个数
TimeBasedTriggeringPolicy 这个配置需要和filePattern结合使用,注意filePattern中配置的文件重命名规则是${log_path}/zcrTest%d{yyyy-MM-dd}.log,
最小的时间粒度是dd,即分钟,TimeBasedTriggeringPolicy指定的size是1,结合起来就是每一天生成一个新文件。
如果改成%d{yyyy-MM-dd HH},最小粒度为小时,则每一个小时生成一个文件。
控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)
onMatch="ACCEPT" 表示匹配该级别及以上
onMatch="DENY" 表示不匹配该级别及以上
onMatch="NEUTRAL" 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上
onMismatch="ACCEPT" 表示匹配该级别以下
onMismatch="NEUTRAL" 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的
onMismatch="DENY" 表示不匹配该级别以下的
onMatch实际上指的就是匹配下限值
onMismatch实际上指的就是匹配上限值
下面这段配置过滤的信息级别就是:大于等于 DEBUG级别 小于等于WARN级别
-->
<Filters>
<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<!-- 每天生成一个日志文件 -->
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<!-- 最大保存文件数 -->
<DefaultRolloverStrategy max="20" />
</RollingFile>
<RollingFile name="RollingFileWarn" fileName="${LOG_HOME}/${FILE_NAME}/${FILE_NAME}_warn.log"
filePattern="${LOG_HOME}/${FILE_NAME}/$${date:yyyy-MM}/${FILE_NAME}_warn-%d{yyyy-MM-dd}-%i.log">
<Filters>
<ThresholdFilter level="WARN"/>
<ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<!-- 每天生成一个日志文件 -->
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
<RollingFile name="RollingFileError" fileName="${LOG_HOME}/${FILE_NAME}/${FILE_NAME}_error.log"
filePattern="${LOG_HOME}/${FILE_NAME}/$${date:yyyy-MM}/${FILE_NAME}_error-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="ERROR"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
<!-- 类似私人订制的log 信息追踪 -->
<!-- <RollingFile name="RollingFileTrace" fileName="${LOG_HOME}/${FILE_NAME}/${FILE_NAME}_info.log"
filePattern="${LOG_HOME}/${FILE_NAME}/$${date:yyyy-MM}/${FILE_NAME}_info-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="TRACE"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile> -->
</appenders>
<!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
<loggers>
<!-- <logger name="org.mybatis" level="DEBUG"></logger> -->
<!-- <logger name="org.springframework" level="INFO"></logger>
<logger name="org.mybatis" level="INFO"></logger> -->
<!-- 指定某个类的log信息按指定的level级别写入到指定ref属性配置的文件中
additivity属性为一个开关配置 true在控制台打印信息和文件中记录信息,否则false不执行控制台打印信息,只在文件中记录信息
name属性值为指定的某个包名或类名,如指定com.test.log.MyLoggerTest类名name="com.test.log.MyLoggerTest"
如指定com.test.log包中所有类name="com.test.log“,谨记不要写成name="com.test.log.*“ -->
<!-- <Logger name="com.test.log" level="TRACE" additivity="false">
<AppenderRef ref="RollingFileTrace" />
</Logger> -->
<!-- level属性值可设为all、trace、debug、info、warn、error、fatal -->
<root level="all">
<AppenderRef ref="Console"/>
<!-- <appender-ref ref="Console"/> -->
<!-- <appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/> -->
</root>
</loggers>
</configuration>
简单的增删查改
1.teacher表的查
- 在TeacherVO.xml中添加select语句
<select id="selectAllTeacher" resultMap="teacherResultMap">
select tid,tname,subject from teacher
</select>
查询语句不适合写*,应写字段名
- 在dao包下建TeacherDao接口
package com.mybatis.dao;
import com.mybatis.vo.TeacherVO;
import java.util.List;
public interface TeacherDao {
public List<TeacherVO> selectAllTeacher();
}
方法名应与查询执行语句的id相同
- 在到包下建一个测试类MybatisTest.java
package com.mybatis.dao;
import com.mybatis.factory.MybatisSessionFactory;
import com.mybatis.vo.TeacherVO;
import org.apache.ibatis.session.SqlSession;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.List;
public class MybatisTest {
private static Logger log= LogManager.getLogger();
public static void main(String[] args) {
SqlSession session = MybatisSessionFactory.getSession();
TeacherDao mapper = session.getMapper(TeacherDao.class);
List<TeacherVO> list = mapper.selectAllTeacher();
for (TeacherVO teacherVO : list) {
System.out.println(teacherVO);
}
}
}
运行结果
2.teacher表的删
- 在TeacherVO.xml下加入删除语句
<delete id="deleteTeacherByPrimaryKey" parameterType="java.lang.Long">
delete from teacher where tid=#{tid}
</delete>
- 在TeacherDao下创建接口方法
public int deleteTeacherByPrimaryKey(Long tid);
- 在MybatisTeat调用方法测试
int i = mapper.deleteTeacherByPrimaryKey(9L);
System.out.println(i);
session.commit();
session.close();
记得事务回滚与session的关闭
运行结果
3.teacher表的增加
- 在TeacherVO.xml下增加插入语句
<insert id="insertOneTeacherVoReturnPrimaryKey" parameterType="com.mybatis.vo.TeacherVO" keyProperty="tid" keyColumn="tid" useGeneratedKeys="true">
insert into teacher(tname,subject) value (#{tname},#{subject})
<selectKey keyColumn="tid" keyProperty="tid" resultType="java.lang.Long" order="AFTER">
select LAST_INSERT_ID FROM DUAL
</selectKey>
</insert>
- 在TeacherDao接口下创建增加方法
public int insertOneTeacherVoReturnPrimaryKey(TeacherVO tvo);
- 在MybatisTest.java测试
TeacherVO tvo = new TeacherVO(null,"莉老师", "php");
mapper.insertOneTeacherVoReturnPrimaryKey(tvo);
session.commit();
session.close();
log.debug(tvo);
运行结果
4.teacher表的修改
- 在TeacherVO.xml配置修改语句
<update id="updateOneTeacherVoByPrimaryKey" parameterType="com.mybatis.vo.TeacherVO">
update teacher set tname=#{tname},subject=#{subject} where tid=#{tid}
</update>
- 在TeacherDao接口下创建修改方法
public int updateOneTeacherVoByPrimaryKey(TeacherVO tvo);
-在MybatisTes.javat测试
mapper.updateOneTeacherVoByPrimaryKey(new TeacherVO(7L, "王老师", "c#"));
session.commit();
session.close();
运行结果