总结
获取mybatis.xml 通过Resource 将其转化为流
通过SqlSessionFactoryBuilder().build(inputStream); 解析mybatis.XML文件
使得Configuration获得所有的配置信息
sqlSessionFactory实例化
transaction事务
创建executor执行器
创建sqlsession
实现CRUD
查看是否执行成功 失败就回滚 成功就提交 关闭
#{} 可以有效防止sql注入
万能的map
Map传递参数,直接在sql中取出即可。 parameterType=“map”
对象传递参数,直接在sql中取出对象的属性即可 parameterType=“Object”
只有一个基本类型参数的情况下,可以直接在sql中取到
多个参数用map,或者注解
usermapper
int addUser2(Map<String,Object> map);
mapper.xml
<insert id="addUser2" parameterType="map">
insert into mybatis.user(id,name,pwd) values (#{userid},#{username},#{userpwd});
</insert>
测试
@Test
public void adduser2(){
SqlSession sqlSession = null;
//1.获取sqlsession对象
sqlSession = MybatisUtils.getSqlSession();
//2.执行sql
//方式一: getMapper
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<>();
map.put("userid",1);
map.put("username","xiaoming");
map.put("userpwd","123456");
userMapper.addUser2(map);
//3.关闭sqlsession
sqlSession.close();
}
}
模糊查询
传递通配符
List getUserLike(String value);
mapper.getUserLike(“%李%”);
select * from user where name like “%”#{value}“%”
select * from user where name like Concat(Concat("%",#{value,JDBCTYPE=VARCHAR}),"%")
核心配置文件
mybatis-config.xml
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:
configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
environment(环境变量)
mybatis 默认的事务管理器就是JDBC 连接池 pooled
properties(属性)
这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
username=root
password=12345678
在核心文件中引入properties
注意 配置文件中标签存放有顺序
!-- 引入外部配置文件-->
<properties resource="db.properties">
</properties>
<!-- 选中版本-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}}"/>
<property name="url" value="${url}}"/>
<property name="username" value="${username}}"/>
<property name="password" value="${password}}"/>
</dataSource>
</environment>
<environment id="test">
<transactionManager type=""></transactionManager>
<dataSource type=""></dataSource>
</environment>
</environments>
可以引入外部文件
可以在其中增加一些属性配置
如果两个文件有同一个字段,优先使用外部配置文件
typeAliases(类型别名)
类型别名可为 Java 类型设置一个缩写名字。
它仅用于 XML 配置,意在降低冗余的全限定类名书写。
<typeAliases>
<!-- 给实体类起别名--> 可以diy。适合实体类型少的
<typeAlias type="pojo.User" alias="User"></typeAlias>
<!-- 指定一个包名,没有把提示会在包下面搜索需要的javabean 默认别名为这个类的别名-->
不可以diy. 若有注解可以为注解的名字. 在实体类添加注解@Alias("user")
<package name="com.zxw.pojo"/>
</typeAliases>
基本类型的别名 前面加_ 下划线
包装类的别名 就是小写
settings(设置)
cacheEnabled 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。 true | false true
lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。 true | false
useGeneratedKeys 允许 JDBC 支持自动生成主键,需要数据库驱动支持。如果设置为 true,将强制使用自动生成主键。尽管一些数据库驱动不支持此特性,但仍可正常工作(如 Derby)。 true | false False
mapUnderscoreToCamelCase 是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。 true | false False
logImpl 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING 未设置
其他插件
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
mybatis-plus
mybatis-generator-core
通用mapper
映射器 mappers
MapperRegister 注册绑定mapper文件
方式一:
使用相对路径的资源引用
<mappers>
<mapper resource="com/zxw/dao/UserMapper.xml"></mapper>
</mappers>
方式二:
使用映射器接口类 使用class文件
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
</mappers>
注意点:接口和mapper配置文件必须同名 必须在同一个包下
方式三:
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
注意点:接口和mapper配置文件必须同名 必须在同一个包下
生命周期和作用域
作用域和生命周期类别是至关重要的,因为错误的使用会导致非常严重的并发问题。
SqlSessionFactoryBuilder
一旦创建了 SqlSessionFactory,就不再需要它了。局部变量
SqlSessionFactory
SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。
SqlSessionFactory 的最佳作用域是应用作用域。 有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式
SqlSession
连接池的一个请求
每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。
用完之后需要赶紧关闭,否则资源被占用
解决属性名和字段名不一致的问题
类型处理器
解决方法1: 起别名
select id,name,pwd as passwrod from user where id=1;
解决方法2:
resultMap
<resultMap id="UserMap" type="com.zxw.pojo.User">
**<!-- column 数据库字段 property 实体类中的属性-->**
<result column="pwd" property="password"></result>
</resultMap>
日志
日志工厂
如果以恶搞数据库操作出现了异常,我们需要排错,日志就是最好的帮手
logImpl 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 SLF4J |
LOG4J | ···
LOG4J2 |
JDK_LOGGING |
COMMONS_LOGGING |
STDOUT_LOGGING | ···
NO_LOGGING
具体使用哪个日志实现 在设置中设定
STDOUT_LOGGING 标准日志输出
在mybatis核心配置文件中配置
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
LOG4J日志
Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
先导入LOG4J依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
<type>bundle</type>
</dependency>
配置 log4j.properties 配置文件
### 配置根 ###
log4j.rootLogger = debug,console ,fileAppender,dailyRollingFile,ROLLING_FILE,MAIL,DATABASE
### 设置输出sql的级别,其中logger后面的内容全部为jar包中所包含的包名 ###
log4j.logger.org.apache=dubug
log4j.logger.java.sql.Connection=dubug
log4j.logger.java.sql.Statement=dubug
log4j.logger.java.sql.PreparedStatement=dubug
log4j.logger.java.sql.ResultSet=dubug
### 配置输出到控制台 ###
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{ 1 }:%L - %m%n
### 配置输出到文件 ###
log4j.appender.fileAppender = org.apache.log4j.FileAppender
log4j.appender.fileAppender.File = logs/log.log
log4j.appender.fileAppender.Append = true
log4j.appender.fileAppender.Threshold = DEBUG
log4j.appender.fileAppender.layout = org.apache.log4j.PatternLayout
log4j.appender.fileAppender.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 配置输出到文件,并且每天都创建一个文件 ###
log4j.appender.dailyRollingFile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyRollingFile.File = logs/log.log
log4j.appender.dailyRollingFile.Append = true
log4j.appender.dailyRollingFile.Threshold = DEBUG
log4j.appender.dailyRollingFile.layout = org.apache.log4j.PatternLayout
log4j.appender.dailyRollingFile.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n### 配置输出到文件,且大小到达指定尺寸的时候产生一个新的文件 ###log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender log4j.appender.ROLLING_FILE.Threshold=ERROR log4j.appender.ROLLING_FILE.File=rolling.log log4j.appender.ROLLING_FILE.Append=true log4j.appender.ROLLING_FILE.MaxFileSize=10KB log4j.appender.ROLLING_FILE.MaxBackupIndex=1 log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
### 配置输出到邮件 ###
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=chenyl@yeqiangwei.com
log4j.appender.MAIL.SMTPHost=mail.hollycrm.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=chenyl@yeqiangwei.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
### 配置输出到数据库 ###
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=root
log4j.appender.DATABASE.password=
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=SampleMessages.log4j
log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j'
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout
配置log4j为日志的实现
<settings>
<setting name="logImpl" value="LOG4J "/>
</settings>
log4j的使用 测试使用
简单使用
导包
org.apache.log4j.Logger
日志对象
static Logger logger = Logger.getLogger(需要日志的类.class);
日志级别
info debug error
分页
limit 分页
select * from user limit startIndex,pageSize
mapper
paraeterType(map)
select * from user limit #{startIndex,}, #{pageSize}
RowBounds
java 分页
第三方插件
mybatis pagehelper
使用注解开发
适合简单sql开发
面向接口编程:解耦,可扩展
UserMapper
底层主要应用反射
@Select("select * from user")
List<User> getUserList();
将接口绑定注册在核心配置文件
<mappers>
<mapper class="com.zxw.dao.UserMapper"></mapper>
</mappers>
return sqlSessionFactory.openSession(true); 开启自动提交
传递多个参数时 在每一个参数前添加@Param注解。基本类型和String类型 需要加上。引用类型不需要加 只有一个基本类型的话 可以忽略 建议加上
@Select("select * from user where id = #{id}")
User getUserById(@Param("id")int id);