mybatis
2021-12-27 21:08:58 34 举报
AI智能生成
登录查看完整内容
MyBatis
作者其他创作
大纲/内容
1、界面(视图)层:接收用户的请求参数,显示处理结果。(jsp、html、servlet) controller包(servlet)2、业务逻辑层:接收了界面层传递的数据,计算逻辑,调用数据库,获取数据。 service包(XXXService类)3、数据访问(持久)层:访问数据库,执行对数据的查询、修改、删除等。 dao包(XXXDao类)
三层架构及对应的包
用户使用界面层——>业务逻辑层——>数据访问层(持久层)——>数据库
三层中类的交互
三层架构
框架是一个舞台,是一个模板。半成品软件,定义好了一个领域的基础功能。
界面层--servlet--SpringMVC业务逻辑层--service类--Spring数据访问层--dao类--MyBatis
三层对应的处理框架
框架是什么
使用JDBC的缺陷:效率低、重复代码多等
MyBatis作用
MyBatis是持久性框架(半自动),和Hibernate(全自动)不同。iBatis到MyBatisSQL映射框架:MyBatis SQL Mapper Framework for Java1、sql mapper:sql映射 可以把数据库表中的一行数据,映射为一个java对象。2、Data Access Objects(DAOs):数据访问,对数据库执行CRUD
MyBatis历史
1、提供了Connection,Statement,ResultSet;2、执行sql;3、提供了循环sql,把sql结果转为java对象,List集合的能力。4、提供了关闭资源的能力,不用开发人员关闭Conn等。
MyBatis能力
总结:MyBatis是一个sql映射框架,提供的数据库操作能力,增强的JDBC,使用MyBatis让开发人员集中写SQL即可。不必关心Connection、Statement、ResultSet的创建,销毁,sql执行。
MyBatis框架概述
框架概述
搭建MyBatis开发环境
<!--MyBatis依赖-->
<!--MySQL驱动-->
静态资源文件:<resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources>
1、pom文件中加入maven依赖
2、创建dao接口:定义操作数据的方法
1、指定约束文件<?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\"> mybatis-3-mapper是约束文件的名称,扩展名是dtd的。
2、约束文件作用:限制,检查在当前文件中出现的标签,属性必须符合mabatis的要求
3、mapper是当前文件的根标签,必须的。 namespace:叫做命名空间,唯一值的,可以是自定义的字符串。 要求使用dao接口的全限定名称。
4、在当前文件中,可使用特定的标签,表示数据库的特定操作<select> <update><insert><delete>
例: <select id=\"selectStudents\" resultType=\"com.kx.bean.Student\
5、id:要执行的sql语法的唯一标识,mybatis会根据id值找到要执行的sql语句,建议和接口名方法一致 resultType:表示结果类型的,sql语句执行后得到ResultSet,遍历ResultSet得到java对象的类型,值写类型的全限定名称。
<?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根标签<!--环境配置:数据库的连接信息--> <environments default=\"online\"> <!--environment:一个数据库信息的配置环境 id(development):一个唯一值,自定义,表示环境名称 default:必须和某个environment的id值一样。 告诉mybatis使用哪个数据库的连接 --> <environment id=\"development\"> <!--transactionManager:mybatis的事务类型 type:JDBC(表示使用jdbc中的Connection对象的commit,rollback做事务处理) --> <transactionManager type=\"JDBC\"/> <!--dataSource:表示数据源,连接数据库的 type:表示数据源的类型,POOLED表示使用连接池 --> <dataSource type=\"POOLED\"> <!--driver、url、username、password固定不能自定义--> <property name=\"driver\" value=\"${driver}\"/> <property name=\"url\" value=\"${url}\"/> <property name=\"username\" value=\"${username}\"/> <property name=\"password\" value=\"${password}\"/> </dataSource> </environment> <environment id=\"online\"> <transactionManager type=\"JDBC\"/> <dataSource type=\"POOLED\"> <property name=\"driver\" value=\"com.mysql.cj.jdbc.Driver\"/> <property name=\"url\" value=\"jdbc:mysql://localhost:3306/ssm\"/> <property name=\"username\" value=\"root\"/> <property name=\"password\" value=\"123456\"/> </dataSource> </environment> </environments>
<!--settings:控制mybatis全局行为--> <settings> <!--设置mybatis输出日志--> <setting name=\"logImpl\" value=\"STDOUT_LOGGING\"/> </settings> <!--环境配置:数据库的连接信息-->
<!--sql mapper(sql映射文件)的位置--> <mappers> <!--一个mapper标签指定一个文件的位置 从类路径开始的路径信息。 target/classes --> <mapper resource=\"org/kx/dao/StudentDao.xml\"/> </mappers>
mybatis主文件配置
1、Resources:mybatis中的一个类,负责读取主配置文件InputStream in = Resources.getResourceAsStream(\"mybatis.xml\");
2、SqlSessionFactoryBuilder:创建SqlSessionFactory对象SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
3、SqlSessionFactory:重量级对象,程序创建一个对象耗时比较长,使用资源多。 在这个项目中,有一个就够用了。SqlSessionFactory:接口,接口实现类:DefaultSqlSessionFactorySqlSessionFactory作用:获取SqlSession对象SqlSession sqlSession=sqlSessionFactory .openSession();openSession()方法说明:1、openSession():无参数的,获取是非自动提交事务的SqlSession对象2、openSession(boolean):openSession(true)获取自动提交事务的SqlSession openSession(false)非自动提交事务的SqlSession
4、SqlSessionSqlSession接口:定义了操作数据的方法,例如:selectOne/selectList/insert/update/delete/commit/rollbackSqlSession接口的实现类DefaultSqlSession。使用要求:SqlSession对象非线程安全,需在方法内部使用,执行完sql后,需关闭,执行sqlSession.close()。
主要类的介绍
public class MyBatisUtils { private static SqlSessionFactory sqlSessionFactory = null; static { String config = \"mybatis.xml\"; //需要和你的项目中的文件名一致 try { InputStream in = Resources.getResourceAsStream(config); //创建SqlSessionFactory对象 sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); } catch (IOException e) { e.printStackTrace(); } } //获取SqlSession的方法 public static SqlSession getSqlSession() { SqlSession sqlSession = null; if (sqlSessionFactory != null) { sqlSession = sqlSessionFactory.openSession(); //非自动提交事务 } return sqlSession; }}
MyBatis工具类获取sqlSession
3、创建mapper文件,也叫sql映射文件写sql语句的,mybatis会执行这些sql
实现步骤
第一个入门的mybatis例子
MyBatis框架快速入门
JDK:实现接口; CGLIB:继承类;
动态代理分类
使用MyBatis的动态代理:MyBatis帮我们创建dao接口的实现类,使用SqlSession.getMapper(dao接口.class)获取这个dao接口的对象//获得接口的代理对象,例如:StudentDao dao=sqlSession.getMapper(StudentDao.class);
什么是动态代理
1、获取SqlSession对象,SqlSessionFactory.openSession()
2、使用getMapper()获取某个接口的对象,sqlSession.getMapper(接口.class)
3、使用dao接口的方法,调用方法就执行了mapper文件中的sql
使用动态代理方式
1)dao接口和mapper文件放在同一个目录2)dao接口和mapper文件名称一致3)mapper文件中的namespace的值是dao接口的全限定名称4)dao接口中方法不要使用重载方法5)mapper文件中的id是接口中方法名称
使用动态代理方式的要求
MyBatis框架动态代理
从java代码中把实际的值传入到mapper文件中
1、一个简单类型的参数:#{任意字符}
例:接口 public List<Student> selectMultiParam(@Param(\"myname\
2、多个简单类型的参数,使用@Param(\"自定义名称\")
3、使用一个java对象,对象的属性值作为mapper文件找到参数,#{java对象的属性名称}
5、使用Map作为参数,#{map的key}
理解参数
1、#使用 ? 在sql中做占位的,表示列值的,放在等号右侧。使用jdbc中的PreparedStatement对象执行sql,效率高,避免sql注入。
2、$占位符,表示字符串的连接,把sql语句连接成一个字符串。使用Sjdbc中tatement对象执行sql,效率低,有sql注入 $:可以替换表名或者列名
#和$区别
类型的全限定名称
例如java.lang.Integer别名是int
类型的别名
resultType
自定义列值赋值给哪个属性
当你的列名和属性名不一样
指定列名和java对象的属性对应关系
resultMap
在java代码中指定like的内容
在mapper中拼接like
like
MyBatis返回结果
sql的内容是变化的,可以根据条件获取到不同的sql语句。主要是where部分发生变化。
<if test=\"判断java对象的属性值\">
判断条件的,条件为true,就会把if之间的sql加入到主sql之后
<if>
用来包含多个if的,当多个if有一个成立,会自动增加一个where关键字,并去掉if中多余的and、or等
<where>
循环java中的数组,list集合的。主要用在sql的in语句中。
collection:表示接口中的方法参数的类型,如果是数组使用array,List集合使用listitem:自定义表示数组和集合成员的变量open:循环开始时的字符close:循环结束时的字符separator:集合成员之间的分隔符
<foreach>
先定义<sql id=\"自定义名称唯一\">sql语句,表名,字段等</sql>
再使用<include refid=\"id的值\">
步骤
sql代码片段,复用
动态SQL
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false&allowPublicKeyRetrieval=true jdbc.user=root jdbc.password=123456
1)在resources目录中定义一个属性配置文件,xx.properties, 例:jdbc.properties,在属性配置文件中,定义数据,格式是key=value key:一般使用\".\"做多级目录的(清晰)。 例:jdbc.mysql.driver
2)在mybatis的主配置文件中,使用<property>指定文件的位置 在需要使用值的地方,${key}
1、数据库的属性配置文件的使用
使用resource和package指定路径<!--sql mapper(sql映射文件)的位置--><mappers> <!--第一种,单个文件映射--> <mapper resource=\"org/kx/dao/StudentDao.xml\"/> <!--第二种,使用包名--> <package name=\"org.kx.dao\"/></mappers>
2、mapper文件的位置
主配置文件
功能:实现多种数据库的分页,mysql就是代替limit语句的
1)加依赖<!--PageHelper依赖--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.3.0</version> </dependency>
2)mybatis中配置插件 <!--配置插件--> <plugins> <plugin interceptor=\"com.github.pagehelper.PageInterceptor\"/> </plugins>
pageHelper做数据分页,支持多种数据库。
扩展
MyBatis
0 条评论
回复 删除
下一页