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