抱怨是一件最没意义的事情。如果实在难以忍受周围的环境,那就暗自努力练好本领,然后跳出那个圈子。你好,我是梦阳辰,快来和我一起学习吧!
引入
1.三层架构
界面层:和用户打交道的,接收用户的请求参数,显示处理结果的。(jsp , htnml , servlet)
业务逻辑层:接收了界面层传递的数据,计算逻辑,调用数据库,获取数据
数据访问层:就是访问数据库,执行对数据的查询,修改,删除等等的。
三层对应的包
界面层:controller包( servlet)
业务逻辑层:service包(xxxservice类)
数据访问层:dao包(xxxDao类)
三层中类的交互
用户使用界面层–>业务逻辑层—>数据访问层(持久层)–>数据库(mysql)
三层对应的处理框架
界面层—servlet—springmvc(框架)
业务逻辑层—service类–spring(框架)
数据访问层—dao类–mybatis (框架)
模版:
1、规定了好一些条款,内容-2.加入自己的东西
框架是一个模块
1.框架中定义好了一些功能。这些功能是可用的
2.可以加入项目中自己的功能,这些功能可以利用框架中写好的功能。
框架是一个软件,半成品的软件,定义好了一些基础功能,需要加入你的功能就是完整的。基础功能是可重复使用的,可升级的
框架特点:
1.框架一般不是全能的,不能做所有事情。
2.框架是针对某一个领域有效。特长在某一个方面,比如mybatis做数据库操作强,但是他不能做其它的。
3.框架是一个软件。
01.概述
使用JDBC的缺陷
1.代码比较多,开发效率低
2.需要关注 Connection ,Statement,ResultSet对象创建和销毁
3.对 ResultSet查询的结果,需要自己封装为List
4.重复的代码比较多些
5.业务代码和数据库的操作混在一起
框架是一个软件,半成品的软件,定义好了一些基础功能,需要加入你的功能就是完整的。基础功能是可重复使用的,可升级的
框架特点:
1.框架一般不是全能的,不能做所有事情
2.框架是针对某一个领域有效。特长在某一个方面,比如mybatis做数据库操作强,但是他不能做其它的。
3.框架是一个软件
什么是 MyBatis/p>
MyBatis是一款优秀的持久层框架。
它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
mybatis框架
一个框架,早期叫做ibatis,代码在github.
mybatis是MyBatis sQL Mapper Framework for Java (sql映射框架)
1)sql mapper :sql映射
可以把数据库表中的一行数据映射为一个java对象。
一行数据可以看做是一个java对象。操作这个对象,就相当于操作表中的数据
2)Data Access 0bjects (DAOs) 数据访问,对数据库执行增删改查。
mybatis提供了哪些功能:
1.提供了创建connection能力tate不用你执行sqile”t人的约力
2.提供了执行sql语句的能力,不用你执行sql
3.提供了循环sql,把sql的结果转为java对象,list集合的能力
4 .提供了关闭资源的能力,不用你关闭conneqtion,statement,Resultset
开发人员做的是:提供sql语句
MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。
2013年11月迁移到Github。
总结:
mybatis是一个sql映射框架,提供的数据库的操作能力。增强的JDBC.
使用mybatis让开发人员集中精神写sql就可以了,不必关心connection ,statement,ResultSet的创建,销毁,sql的执行.org.mybatismybatis3.5.6
持久化
数据持久化
持久化就是将程序的数据在持久状态和瞬时状态转化的过程。
内存:断电即失。
数据库(jdbc),io文件持久化。
生活:冷藏。
为什么需要持久化/p>
有一些对象,不能让他丢失。
内存很贵。
持久层
Dao层,Serice层,Controller层…
完成持久化工作的代码块。
层界限十分明显。
为什么需要Mybatis/p>
帮助程序员将数据存入到数据库中。
方便
传统的JDBC代码太复杂了,简化。框架。自动化。
不用Mybatis也可以,更容易上手。技术没有高低之分。
特点:
简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
提供映射标签,支持对象与数据库的orm字段关系映射
提供对象关系映射标签,支持对象关系组建维护
提供xml标签,支持编写动态sql。
02.Mybatis快速入门
实现步骤:
1.新建表SET FOREIGN_KEY_CHECKS=0;– —————————— Table structure for `student`– —————————-DROP TABLE IF EXISTS `student`;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`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;– —————————— Records of student– —————————-INSERT INTO `student` VALUES (‘1’, ‘梦阳辰’, ‘1’);INSERT INTO `student` VALUES (‘2’, ‘小红’, ‘1’);INSERT INTO `student` VALUES (‘3’, ‘小张’, ‘1’);INSERT INTO `student` VALUES (‘4’, ‘小李’, ‘1’);INSERT INTO `student` VALUES (‘5’, ‘小王’, ‘1’);– —————————— Table structure for `teacher`– —————————-DROP TABLE IF EXISTS `teacher`;CREATE TABLE `teacher` (
`id` int(10) NOT NULL,
`name` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;– —————————— Records of teacher– —————————-INSERT INTO `teacher` VALUES (‘1’, ‘黄老师’);– —————————— Table structure for `user`– —————————-DROP TABLE IF EXISTS `user`;CREATE TABLE `user` (
`id` int(20) NOT NULL AUTO_INCREMENT,
`name` varchar(30) DEFAULT NULL COMMENT ‘用户名’,
`pwd` varchar(30) DEFAULT NULL COMMENT ‘密码’,
PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;– —————————— Records of user– —————————-INSERT INTO `user` VALUES (‘1’, ‘梦阳辰’, ‘123456’);INSERT INTO `user` VALUES (‘2’, ‘MengYangChen’, ‘1234567’);INSERT INTO `user` VALUES (‘3’, ‘meng’, ‘123456’);
2.加入maven的mybatis坐标, mysql驱动的坐标
3.创建实体类,student–保存表中的一行数据的
4.创建持久层的dao接口,定义操作数据库的方法
5.创建一个mybatis使用的配置文件
叫做sql映射文件:写sql语句的。一般一个表一个sql映射文件。这个文件是xml文件。
6.创建mybatis的主配置文件:
一个项目就一个主配置文件。
主配置文件提供了数据库的连接信息和sql映射文件的位置信息
7.创建使用mybatis类,
通过mybatis访问数据库
思路:
搭建环境–>导入Mybatis–>编写代码–>测试
1.搭建环境:
创建操作的数据库
数据库mybtis
IDEA新建maven项目
导入maven依赖
2.新建配置文件mybatis-config.xml
配置文件信息: PUBLIC “-//mybatis.org//DTD Config 3.0//EN” “http://mybatis.org/dtd/mybatis-3-config.dtd”>
新建Mybatis工具类
1.使用Mybatis获取sqlSessionFactory对象
从 XML 中构建 SqlSessionFactory
MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,使得从类路径或其它位置加载资源文件更加容易。
从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。
MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,使得从类路径或其它位置加载资源文件更加容易。String resource = “mybatis-config.xml”;
nputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new
SqlSessionFactoryBuilder().build(inputStream);
2.从 SqlSessionFactory 中获取 SqlSession
既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。//sqlSessionFactory –>sqlSessionpublic class MybatisUtils {private static SqlSessionFactory sqlSessionFactory;static {try {//使用Mybatis获取sqlSessionFactory对象String resource = “mybatis-config.xml”;InputStream inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {e.printStackTrace();}}/**
* 从 SqlSessionFactory 中获取 SqlSession
* @return SqlSession对象
*/public static SqlSession getSqlSession(){/*SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;*/return sqlSessionFactory.openSession();}}
编写代码
1.实体类//实体类(javaBean)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;}}
2.Dao/Mapper接口public interface UserDao {List selectUser();}
3.接口实现类
由原来的UserDaolmp转变为一个Mapper配置文件。
以前的方式就是写一个类实现接口,再重写接口方法,在方法中获取数据库连接,执行sql语句。
在Mybatis中免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
一个语句既可以通过 XML 定义,也可以通过注解定义。我们先看看 XML 定义语句的方式,事实上 MyBatis 提供的所有特性都可以利用基于 XML 的映射语言来实现,这使得 MyBatis 在过去的数年间得以流行。如果你用过旧版本的 MyBatis,你应该对这个概念比较熟悉。 但相比于之前的版本,新版本改进了许多 XML 的配置,后面我们会提到这些改进。这里给出一个基于 XML 映射语句的示例,它应该可以满足上个示例中 SqlSession 的调用。 PUBLIC “-//mybatis.org//DTD Mapper 3.0//EN””http://mybatis.org/dtd/mybatis-3-mapper.dtd”>select * from mybatis.user
为了这个简单的例子,我们似乎写了不少配置,但其实并不多。在一个 XML 映射文件中,可以定义无数个映射语句,这样一来,XML 头部和文档类型声明部分就显得微不足道了。文档的其它部分很直白,容易理解。
测试
核心文件mybatis-config.xml需要注册mappers
测试中可能遇到的问题:
1.配置文件没有注册
2.绑定接口错误。
3.方法名不对。
4.返回类型不对。
5.Maven导出资源问题。
src/main/resources **/*.properties
**/*.xmlfalse src/main/java **/*.properties
**/*.xmlfalse
写到这里终于把搞了我好久的问题解决了,错误:Error:(3.28)java:程序报org.apache.ibatis.io不存在…。
网上很多解决方案是使用idea自带的maven,说是idea2020.1版本的问题。
我的解决方案:
解决方法:试过mvn idea:moudle命令的方法,但还是没有用。最后没办法
只能将在github网址下的mybatis3.5.6的jar包导入到新建的文件夹lib中。
解决办法,将mybatis-config.xml文件的配置信息true该为false
03.Mybatis实现增删改查
为了规范将接口名UserDao统一改为UserMapper。
注意增删改需要提交事务
代码:/**
* 接口操作user表
*/
public interface UserMapper {
//查询student表的所有数据
List selectUser();
//根据id查询用户
User selectUserById(int id);
//insert一个用户
int insertUser(User user);
//更新一个用户
int updateUser(User user);
//删除一个用户
int deleteUser(int id);
}
mapper
PUBLIC “-//mybatis.org//DTD Mapper 3.0//EN”
“http://mybatis.org/dtd/mybatis-3-mapper.dtd”>
select * from mybatis.user
select * from mybatis.user where id=#{id}
insert into mybatis.user (id,name,pwd) values(#{id},#{name},#{pwd});
update mybatis.user set name =#{name},pwd=#{pwd} where id=#{id} ;
delete from mybatis.user where id=#{id}
测试代码:public class UserMapperTest {
@Test
public void test(){
//1.获取SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//方式一:getMapper
//2.执行sql,获取sql,面向接口编程,获取UserMapper接口(以前是实现接口的实现类,现在是配置文件)
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List userList = mapper.selectUser();
/*String sqlId = “com.mengyangchen.dao.UserDao”+”.”+”selectUser”;
List userList = sqlSession.selectList(sqlId);*/
for(User user:userList){
System.out.println(user);
}
//3.关闭SqlSession
sqlSession.close();
}
@Test
public void selectUserById(){
//获取执行sql的对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);//获取接口
User user = mapper.selectUserById(1);
System.out.println(user);
sqlSession.close();
}
@Test
public void insertUser(){
//获取执行sql的对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);//获取接口
int num = mapper.insertUser(new User(3,”MengYangChen”,”123456″));
//提交事务
if(num>0){
System.out.println(“插入成功!”);
}
sqlSession.commit();
sqlSession.close();
}
@Test
public void updateUser(){
//获取执行sql的对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);//获取接口
int num = mapper.updateUser(new User(3,”陈末”,”123456″));
//提交事务
if(num>0){
System.out.println(“更新成功!”);
}
sqlSession.commit();
sqlSession.close();
}
@Test
public void deleteUser(){
//获取执行sql的对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);//获取接口
int num = mapper.deleteUser(3);
//提交事务
if(num>0){
System.out.println(“删除成功!”);
}
sqlSession.commit();
sqlSession.close();
}
}
使用Map
假设实体类,属性过多,我们可以考虑用Map.当然用实体类属性的set和get方法也是一样的。map可以放多个对象中的属性。
使用map,后面的值可以不和实体类属性相同,只需要和map的键相同即可。
例如:int updateUser2(Mapmap);
update mybatis.user set pwd =#{passWord} where id =#{userId}
public void updateUser2(){//获取执行sql的对象SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);//获取接口Mapmap = new HashMap();map.put(“userId”,2);map.put(“passWord”,”1234567″);int num = mapper.updateUser2(map);//提交事务if(num>0){System.out.println(“更新成功!”);}sqlSession.commit();sqlSession.close();}
Map传递参数,直接在sql中取出key即可。
对象传递参数,直接在sql中去对象的属性即可。
模糊查询
在sql拼接中使用通配符可以防止sql注入。//模糊查询List selectUserLike(String value);
select * from mybatis.user where name like “%”#{value}”%”;
/**
* 模糊查询*/@Testpublic void selectUserLike(){//获取执行sql的对象SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);//获取接口List list = new LinkedList();list = mapper.selectUserLike(“梦”);for (User list1:list) {System.out.println(list1);}sqlSession.close();}
也可以:select * from mybatis.user where name like #{value};
/**
* 模糊查询*/@Testpublic void selectUserLike(){//获取执行sql的对象SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);//获取接口List list = new LinkedList();list = mapper.selectUserLike(“%梦%”);for (User list1:list) {System.out.println(list1);}sqlSession.close();}
第二种方式可能存在sql注入。
04.XML配置解析
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。
配置文档的顶层结构如下:
configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
properties(属性)编写一个配置文件
db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatisserSSL=false&useUnicode=true&characterEncoding=UTF-8username=root
password=123456
核心配置文件中引入:
位置需在第一位
PUBLIC “-//mybatis.org//DTD Config 3.0//EN””http://mybatis.org/dtd/mybatis-3-config.dtd”> 可以直接引入外部文件,并且可以在其中增加一些属性配置,如果两个文件中都对有同一属性的配置,优先使用外部配置文件中的配置。 设置(settings) 是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。 下表描述了设置中各项设置的含义、默认值等。 https://mybatis.org/mybatis-3/zh/configuration.html#typeAliases 类型别名(typeAliases) 类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。例如: 当这样配置时,Blog 可以用在任何使用 domain.blog.Blog 的地方。 也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如: 每一个在包 domain.blog 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 domain.blog.Author 的别名为 author;若有注解,则别名为其注解值。见下面的例子:@Alias(“author”)public class Author {…} 映射器(mappers) 我们需要告诉 MyBatis 到哪里去找到这些语句。 在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射文件。 你可以使用相对于类路径的资源引用,或完全限定资源定位符(包括 file:/// 形式的 URL),或类名和包名等。例如: 需要接口和它的Mapper配置文件同名,并在同一包下。 需要接口和它的Mapper配置文件同名,并在同一包下。 05.生命周期和作用域 理解我们之前讨论过的不同作用域和生命周期类别是至关重要的,因为错误的使用会导致非常严重的并发问题。
06.解决属性名和字段名不一致的问题
解决方法:
起别名,将sql语句的字段名取一个别名跟属性名相同。
方法二:resultMap结果集映射
select * from mybatis.user where id=#{id}
ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。
07.日志
日志工厂
如果一个数据库操作,出现了异常,我们需要排错。日志就是最好的助手。
曾经:sout,debug
现在:日志工厂
LOG4J
什么是Log4j/p>
Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;
我们也可以控制每一条日志的输出格式;
通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。【百度百科】
快速入门
1.先导入log4j的包。log4jlog4j1.2.17
2.新建log4j.properties文件#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
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/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][%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
配置logrj为日志的实现
3.日志级别
info
debug
error
08.分页
limit分页1语法: SELECT from user limit startIndex,pagesize;2.SELECT * from user limit 3;#[o,n]
使用Mybatis实现分页,核心为sqlselect from mybatis.user limit #{startindex} ,#{pagesize}
RowBounds实现分页(了解即可,不推荐使用)
MyBatis分页插件PageHelper
这是MyBatis的初步了解与使用,你也许还需要了解注解开发,缓存等。
这些内容将在下一篇文章中介绍。
我是MyBatis的第一篇。
文章知识点与官方知识档案匹配,可进一步学习相关知识MySQL入门技能树首页概览31413 人正在系统学习中 相关资源:糖烟茶酒行业管理软件 烟酒进销存店铺销售收银管理系统
来源:曲径通幽清风与酒
声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!