Mybatis
2023-08-25 14:54:37 0 举报
登录查看完整内容
Mybatis教程
作者其他创作
大纲/内容
Connection
PreparedStatement
ResultSet
spring中对jdbc的简单封装
Spring的JdbcTemplate
Apache的DBUtils
JDBC是规范
Spring的jdbcTemplate和Apache的DBUtils都只是工具
以上这些都不是框架
持久层技术解决方案
入门
持久层框架
使用额ORM思想实现了结果集封装
对象关系映射
表的字段和实体类的属性对应起来
ORM
概述
sql语句
1.创建Maven工程并导入坐标
private Integer id; private String username; private Date birthday; private String sex; private String address;
实体类
package com.baicaizhi.dao;import com.baicaizhi.domain.User;import org.apache.ibatis.annotations.Select;import java.util.List;public interface IUserDao { /** * 查询所有操作 * @return */ @Select(\"select * from user \") List<User> findAll();}
dao接口
package com.baicaizhi.dao.impl;import com.baicaizhi.dao.IUserDao;import com.baicaizhi.domain.User;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import java.util.List;public class UserDaoImpl implements IUserDao { private SqlSessionFactory factory; public UserDaoImpl(SqlSessionFactory factory){ this.factory = factory; } public List<User> findAll() { SqlSession session = factory.openSession(); List<User> users = session.selectList(\"com.baicaizhi.dao.IUserDao.findAll\"); session.close(); return users; }}
dao接口实现类
2.创建实体类和dao接口
<?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=\"mysql\"><!-- 配置mysql的环境--> <environment id=\"mysql\"><!-- 配置事务的类型--> <transactionManager type=\"JDBC\"></transactionManager><!-- 配置数据源(连接池)--> <dataSource type=\"POOLED\"><!-- 配置连接数据库的四个基本信息--> <property name=\"driver\" value=\"com.mysql.jdbc.Driver\"/> <property name=\"url\" value=\"jdbc:mysql://localhost:3306/mybatisStudy\"/> <property name=\"username\" value=\"root\"/> <property name=\"password\" value=\"root\"/> </dataSource> </environment> </environments> <mappers> <mapper class=\"com.baicaizhi.dao.IUserDao\"></mapper> </mappers></configuration>
3.创建Mybatis的主配置文件
<?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\"><mapper namespace=\"com.baicaizhi.dao.IUserDao\"><!-- 配置查询所有--> <select id=\"findAll\" resultType=\"com.baicaizhi.domain.User\"> select * from user </select></mapper>
4.创建映射的配置文件
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.37</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency>
依赖配置
项目结构
环境搭建
package com.baicaizhi.test;import com.baicaizhi.dao.IUserDao;import com.baicaizhi.dao.impl.UserDaoImpl;import com.baicaizhi.domain.User;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.InputStream;import java.util.List;public class MybatisTest { /** * 入门案例 * @param args */ public static void main(String[] args) throws Exception { //1.读取配置文件 InputStream in = Resources.getResourceAsStream(\"SqlMapConfig.xml\"); //2.创建SqlSessionFactory工厂 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(in); //3.使用SqlSession创建Dao接口的代理对象 IUserDao userDao = new UserDaoImpl(factory); //4.使用代理对象执行方法 List<User> users = userDao.findAll(); for (User user : users) { System.out.println(user); } //5.释放资源 in.close(); }}
创建工厂使用了构建者模式
解耦
生产SqlSession使用了工厂模式
不修改源码的基础上对已有的方法增强
创建Dao接口实现类使用了代理模式
分析:
入门案例
1.创建代理对象
2.在代理对象中调用selectList方法
mybatis在使用代理dao的方式实现CRUD时做了什么事?
分析
自定义Mybatis框架
<?xml version=\"1.0\" encoding=\"UTF-8\"?><project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>mybatisd</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.37</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies></project>
依赖文件
<?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=\"mysql\"><!-- 配置mysql的环境--> <environment id=\"mysql\"><!-- 配置事务的类型--> <transactionManager type=\"JDBC\"></transactionManager><!-- 配置数据源(连接池)--> <dataSource type=\"POOLED\"><!-- 配置连接数据库的四个基本信息--> <property name=\"driver\" value=\"com.mysql.jdbc.Driver\"/> <property name=\"url\" value=\"jdbc:mysql://localhost:3306/mybatisStudy\"/> <property name=\"username\" value=\"root\"/> <property name=\"password\" value=\"root\"/> </dataSource> </environment> </environments><!-- 配置映射文件的位置--> <mappers><!-- <mapper class=\"com.baicaizhi.dao.IUserDao\"></mapper>--> <mapper resource=\"com/baicaizhi/dao/IUserDao.xml\"></mapper> </mappers></configuration>
配置文件
package com.baicaizhi.dao;import com.baicaizhi.domain.User;import org.apache.ibatis.annotations.Select;import java.util.List;public interface IUserDao { List<User> findAll(); void saveUser(User user); void updateUser(User user); void deleteUser(Integer userid); User findById(int id); List<User> findByUserName(String username); int findTotal();}
<?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\"><mapper namespace=\"com.baicaizhi.dao.IUserDao\"> <select id=\"findAll\" resultType=\"com.baicaizhi.domain.User\"> select * from user </select> <insert id=\"saveUser\" parameterType=\"com.baicaizhi.domain.User\
映射文件
测试文件
单表CRUD操作
int
string
简单类型
javaBean
Object(对象) Graphic(图) Navigation(导航) Language(语言)
他是通过对象的取值方法来获取数据.在写法上把get给省略了
类中:user.getUsername()
OGNL表达式写法:user.username
例如
OGNL表达式
pojo对象
javaBeanVO
pojo包装对象
parameterType输入
pojo列表
resultType输出
参数和返回值
减少我们获取连接所消耗的时间
1.POOLED:采用传统的javax.sql.DataSource规范中的连接池
目的是模仿windos的注册表 类似于Map结构
3.JNDI:
type属性
1.配置位置
配置方式
mybatis中的连接池
连接池
通过sqlSession对象的commit和rollback方法实现事务的提交和回滚
事务控制及设计方法
<if test=\"userSex != null\"> and sex = #{userSex} </if>
前边需要增加where 1= 1
if
<where> <if test=\"userName != null\"> and username = #{userName} </if> <if test=\"userSex != null\"> and sex = #{userSex} </if> </where>
替换where 1= 1 系统自动增加where字段
where
select * from user where id in();
collection
语句的开始部分
open
语句的结束部分
close
item
分隔符
sperator
属性
<select id=\"findByIds\" parameterType=\"queryvo\" resultMap=\"userMap\"> select * from user <where> <if test=\"ids != null and ids.size() > 0\"> <foreach collection=\"ids\" open=\"and id in (\" close=\")\" item=\"uid\" separator=\
案例
foreach
<sql id=\"default\"> select * from user </sql>
<select id=\"findAll\" resultMap=\"userMap\">-- select * from user; <include refid=\"default\"></include> </select>
sql
动态SQL
延迟加载
一对一采用
立即加载
<settings> <setting name=\"lazyLoadingEnabled\" value=\"true\"/> <setting name=\"aggressiveLazyLoading\" value=\"true\"/>在 3.4.1 及之前的版本中默认为 true</settings>
配置设置
存在于内存中的临时数据
什么是缓存
为什么使用缓存
经常查询并且不经常改变的
数据的正确与否对最终结果影响不大的
适用缓存的数据
经常改变的数据
数据的正确与否对最终结果影响恩达的
不适用缓存的数据
一级缓存
指的是SqlSessionFactory对象的缓存由同一个SqlSessionFactory对象创建的SqlSession共享缓存
<settings> <setting name = \"cacheEnabled\" value= \"true\"/></settings>
增加<cache/>标签
在<select> 标签中增加 useCache = \"true\"
使用步骤
二级缓存
缓存等级
什么情况下清空一级缓存
缓存
<!-- 指定带有注解的dao所在位置--> <mappers> <package name=\"com.baicaizhi.dao\"/> </mappers>
<!-- 配置别名--> <typeAliases> <package name=\"com.baicaizhi.domain\"/> </typeAliases>
SqlMapConfig.xml
package com.baicaizhi.dao;import com.baicaizhi.domain.User;import org.apache.ibatis.annotations.Select;import java.util.List;public interface IUserDao { @Select(\"select * from user\") List<User> findAll();}
单标CRUD
多表查询
缓存的配置
注解开发
select * from user where #{};select * from user where '${}' 必须使用单引号
用法
1.#{}和${}的区别
优点
缺点
3.Mybatis优点和缺点
常见面试
Mybatis
0 条评论
回复 删除
下一页