github:全球最大同性交友网站
1.1 获得mybatis:
maven仓库:
1 | <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> |
github:
中文文档:
1.2 持久层
数据持久化
持久化就是将程序的数据在持久状态和瞬时状态转化的过程
内存:断电即失
持久化:数据库(jdbc),io文件
为什么需要持久化?
有一些对象,不能让他丢掉
内存太贵了
1.3 持久层
Dao层,Service层,Controller层
完成持久化工作的代码块
层是界限明显的
1.4 为什么需要mybatis?
帮助程序员将数据存入到数据库中
方便
传统的JDBC代码太复杂了,简化,框架,自动化
不用Mybatis也可以,学了搭网站更容易上手
之后 Spring SpringMVC SpringBoot
2、第一个Mybatis程序:
思路:搭建环境–>导入Mybatis–>编写代码–>测试
2.1搭建环境
搭建数据库
新建项目
1.新建一个普通的maven项目
2.删除src目录
3.导入maven依赖
1 | <?xml version="1.0" encoding="UTF-8"?> |
2.2 创建模块
编写mybatis的核心配置文件
在maven的src下的resources建立一个mybatis-config.xml文件,从官网上复制代码:(xml的内容不要加注释!!!)
1 | <?xml version="1.0" encoding="UTF-8" ?> |
编写mybatis工具类
1 | package com.kuang.utils; |
2.3 编写代码
实体类
1 | package com.kuang.pojo; |
Dao接口
UserDao.java
1 | package com.kuang.dao; |
接口实现类(由JDBC的UserDaoImpl转变为Mapper配置文件)
创建UserMapper.xml的文件(不要加注释!!!)
1 | <?xml version="1.0" encoding="UTF-8" ?> |
2.4 测试
junit测试
Maven问题:target不生成xml文件(配置文件无法被导出的问题)
解决方法:手动配置资源过滤
maven的配置里(pom.xml)加下面代码:(保险起见,子项目也放一份)
1 | <build> |
UserDaoTest.java
1 | package com.kuang.dao; |
3.增删改查
namespace:包名要和接口一致
查询语句:
id:namespace中的方法名
resultType:Sql语句执行的返回值
parameterType:参数类型
根据id查询用户:
UserDao:
1 | //根据id查询用户 |
UserMapper.xml
1 | <select id="getUserById" parameterType="int" resultType="com.kuang.pojo.User"> |
UserDaoTest.java
1 | @Test |
insert一个用户:
UserDao:
1 | //insert一个用户 |
UserMapper.xml(内容不要加注释!!!)(这里必须用对应的insert,不然会出问题,下同)
1 |
|
UserDaoTest.java
1 | //增删改需要提交事务!! |
修改用户:
UserDao:
1 | //修改用户 |
UserMapper.xml(内容不要加注释!!!)
1 | <update id="updateUser" parameterType="com.kuang.pojo.User"> |
UserDaoTest.java
1 | //增删改需要提交事务!! |
删除用户:
UserDao:
1 | //删除用户 |
UserMapper.xml(内容不要加注释!!!)
1 | <delete id="deleteUser" parameterType="int"> |
UserDaoTest.java
1 | //增删改需要提交事务!! |
读错从下往上读!!!
7、万能的Map
1
User addUser2(Map<String,Object> map);
不用new出一个类(对象)
1
2
3<insert id="addUser2" parameterType="map">
insert into mybatis.user(id,name,pwd) values (#{userid},#{userName},#{passWord});
</insert>
1 | @Test |
4、配置解析
1.核心配置文件
mybatis-config.xml
environment:环境变量
mappers:映射器
properties:属性
settings:设置
typeAliases:类型别名
environment:环境变量
1 | <environments default="development"> |
写环境,新建<environment id="">
,切换环境:<environments default="">
改default的值
1 | ```<dataSource type="POOLED">```:数据源,用于连接数据库,可以填UNPOOLED|POOLED|JNDI |
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=utf8
username=root
password=011125
1 | mybatis-config.xml |
1 | 也可以只写mybatis-config.xml: |
1 |
|
1 | UserMapper.xml(直接用User) |
1 |
|
1 | 在实体类比较少是,使用第一种 |
1 |
|
1 | 整体: |
1 | 然后再运行就会显示整个运行过程,非常方便: |
1 |
|
1 | 创建log4j.properties,找一个合适的配置贴上去,如: |
#控制台输出的相关设置
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/kuang.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][qinjiang%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.PreparedStatement=DEBUG
1 | ``` |
使用输出:
1 | [org.apache.ibatis.logging.LogFactory]-Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter. |
使用方法二(日志级别):
导入包(不要导java.util的):import org.apache.log4j.Logger;
1 | @Test |
7、limit使用java传参
UserDao.java
1 | List<User> getUserByLimit(Map<String,Integer> map); |
UserMapper.xml
1 | <select id="getUserByLimit" parameterType="map" resultType="user"> |
UserDaoTest.java
1 | @Test |
7.2 RowBounds分页(不建议使用)
直接封装成方法,不再使用sql语句sqlSession.selectList()
可以安装各种插件(如PageHelper),也可以用,但是自己无法控制它内部使用的sql语句,限制很多
8、使用注解开发
UserDao.java
1 | @Select("select * from user") |
mybatis-config.xml(绑定接口)
1 | <mappers> |
UserDaoTest.java
1 | @Test |
也可以实现增删改
但是难以解决数据库和实体类名不同的问题!!
9.运行流程(自己总结):
主要文件:MybatisUtils.java,UserDao.java,UserMapper.xml,UserDaoTest.java,mybatis-config.xml,User.java,db.properties,log4j.properties
(1)主程序UserDaoTest.java实例化MybatisUtils.java
(2)MybatisUtils.java先将mybatis-config.xml加载进类,根据mybatis-config.xml的信息将User.java,db.properties,log4j.propertie,UserMapper.xml这几个配置文件加载进类
(3)主程序UserDaoTest.java利用MybatisUtils.java类中的getMapper方法引入UserDao.java这个接口文件里的所有接口
(4)调用UserDao.java的接口,会访问接口名对应的UserMapper.xml中id相同的项,实现数据库操作
10.Lombok
(1)安装(idea自动安装了)
(2)导入包
@Getter and @Setter
@FieldNameConstants
@ToString
@EqualsAndHashCode
@AllArgsConstructor, @RequiredArgsConstructor and @NoArgsConstructor
@Log, @Log4j, @Log4j2, @Slf4j, @XSlf4j, @CommonsLog, @JBossLog, @Flogger, @CustomLog
@Data
@Builder
@SuperBuilder
@Singular
@Delegate
@Value
@Accessors
@Wither
@With
@SneakyThrows
@val
@var
experimental @var
@UtilityClass
Lombok config system
好处:再也不用写get,set等方法了,直接在class前面加一个注解,类就会自动带有这些方法!!(偷懒专用)
@Data:无参构造,get、set、tostring、hashcode、equals
@AllArgsConstructorer:有参
@NoArgsConstructor:无参
举例:以下两个作用相等!!
1 | package com.kuang.pojo; |
1 | package com.kuang.pojo; |
坏处是:代码的可阅读性降低,像是这种插件必须要明白插件作用才能审代码
审代码会变困难,而且可能会添加很多没用的代码(后台),造成代码冗余和内存浪费,感觉和c上来就引用所有库差不多
写的人方便,读和运行的人会麻烦
11.复杂查询环境(一对多,多对一)
略,以后有用再说吧
12.动态sql
拼接不同sql语句:(意味着一般使用mybatis难以出现sql注入漏洞)
https://mybatis.org/mybatis-3/zh/dynamic-sql.html
13.缓存
将内容保存在内存中,直接访问内存进行查询
略,以后有用再说