首先我们先了解一下什么是Mybatis
mybatis是一个java持久层框架,java中操作关系型 数据库用的是jdbc,mybatis是对jdbc的一个封装。
1、从一个jdbc程序开始,通过jdbc 程序找到使用原生态的jdbc开发程序,存在哪些问题??通过学习mybatis,mybatis是如何解决这些问题。
2、mybatis的架构(重点)
3、mybatis的入门程序(重点)
实现 用户的查询、添加、修改、删除。
4、mybatis开发dao的两种方法。(重点)
原始的dao开发方式(dao接口和dao实现都需要编写)
mapper代理方式(只需要写dao接口)
5、输入映射类型和输出映射类型。
6、动态sql sql片段
JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?
① 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。 解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
② Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。 解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
③ 向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。 解决: Mybatis自动将java对象映射至sql语句。
④ 对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。 解决:Mybatis自动将sql执行结果映射至java对象。
重点了解,也是面试的时候Mybatis经常问的问题
1.#与$符号的区别:
2.返回主键的方式:
第一种方式:也是最常用的方式
第二种方式:执行完插入语句之后再执行查询插入的主键id
3.一级缓存二级缓存
一级缓存:执行sql语句到数据库进行查询,放入sqlsession中第二次相同的查询就不去数据库查询的操作
二级缓存: SqlSessionFactory层面上的二级缓存默认是不开启的,二级缓存的开席需要进行配置,实现二级缓存的时候,MyBatis要求返回的POJO必须是可序列化的。 也就是要求实现Serializable接口,配置方法很简单,只需要在映射XML文件配置就可以开启缓存了
4.输入和输出映射
通过parameterType完成输入映射,通过resultType和resultMap完成输出映射。
当我们进行参数传递的时候,传递的方式有多种可根据业务来使用parameterType=“int”或者parameterType=“TbUser”传递对象,
当我们进行返回的时候一般返回的是一个对象使用resultType=“TbUser”
当我们进行返回名称与pojo中的属性名称不一致时候,使用resultMap
5.数据进行处理:也就是我们的持久层代码:
一、直接进行
二、代码优化后
6.动态sql和sql片段
当进行多条件查询的时候:可能会出现这种情况:(动态sql)
也可以使用(sql片段的方式)
开发具体步骤:
传统dao开发
1. 导入jar包
从mybatis管网下载(地址:https://github.com/mybatis/mybatis-3/releases)
mybatis-3.2.7.pdf—操作手册
mybatis-3.2.7.jar–核心 jar包
依赖的jar包
别忘记了jdbc的jar
1.工程结构
- log4j.properties(公用文件)
Global logging configuration,建议开发环境中要用debug log4j.rootLogger=DEBUG, stdout # Console output… log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
1.
SqlMapConfig.xml(公用文件)
通过SqlMapConfig.xml加载mybatis运行环境。
<!-- 定义 别名 -->
<typeAliases>
<!--
单个别名的定义
alias:别名,type:别名映射的类型 -->
<!-- <typeAlias type="com.baidu.mybatis.po.User" alias="user"/> -->
<!-- 批量别名定义
指定包路径,自动扫描包下边的pojo,定义别名,别名默认为类名(首字母小写或大写)
-->
<package name="com.baidu.mybatis.po"/>
</typeAliases>
<!-- 和spring整合后 environments配置将废除-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理-->
<transactionManager type="JDBC" />
<!-- 数据库连接池-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--加载mapper映射
如果将和spring整合后,可以使用整合包中提供的mapper扫描器,此处的mappers不用配置了。
-->
<mappers>
<!-- 通过resource引用mapper的映射文件 -->
<mapper resource="sqlmap/TbUser.xml" />
<!-- <mapper resource="mapper/UserMapper.xml" /> -->
<!-- 通过class引用mapper接口
class:配置mapper接口全限定名
要求:需要mapper.xml和mapper.java同名并且在一个目录 中
-->
<!-- <mapper class="com.baidu.mybatis.mapper.UserMapper"/> -->
<!-- 批量mapper配置
通过package进行自动扫描包下边的mapper接口,
要求:需要mapper.xml和mapper.java同名并且在一个目录 中
-->
<package name="com.baidu.mybatis.mapper"/>
</mappers>
4.创建pojo(TbUser.java)
public class TbUser {
private Integer id;
private String name;
5.在src下创建Source Folder名字叫config把jdbc.properties和log4j.properties和SqlMapConfig.xml放里面
在config中创建sqlmap里面创建xml TbUser.xml
在TbUser.xml中写
<?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="test">
<select id="findUserById" parameterType="int" resultType="com.baidu.pojo.TbUser">
select * from tb_user where id=#{id}
</select>
</mapper>
6.创建test
public class test1 {
public static void main(String[] args) throws Exception {
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//获取session工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.获取session
SqlSession session = sessionFactory.openSession();
//3.执行sql
//参数1.:要执行的statment id
TbUser tbUser = (TbUser)session.selectOne("test.findUserById", 1);
System.out.println(tbUser);
//4.关闭
session.close();
}
}
查询单条数据结束
查询tb_user整个表的数据
一:在TbUser.xml中写:
<select id="findAll" resultType="com.baidu.pojo.TbUser">
select * from tb_user
</select>
二:在test1中写:
SqlSession session=null; @Before public void before() throws Exception{ InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml"); //获取session工厂 SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2.获取session session = sessionFactory.openSession(); } //查询所有user表 @Test public void test2(){ List<TbUser> selectList = session.selectList("test.findAll"); for (TbUser tbUser : selectList) { System.out.println(tbUser); } }
tb_user查询整个表结束
查询tb_dept整个表的数据
一:创建TbDept.xml中写:
<?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">
<!-- namespace sql的命名空间 这里先交test,以后还要其他的作用 -->
<mapper namespace="testDept">
<select id="findAllDept" resultType="com.baidu.pojo.TbDept">
select * from tb_dept
</select>
</mapper>
二:在SqlMapConfig。xml中配置:
<mapper resource="sqlmap/TbDept.xml" />
三:在test中写:
SqlSession session=null;
@Before
public void before() throws Exception{
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//获取session工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.获取session
session = sessionFactory.openSession();
}
//查询所有Dept表
@Test
public void test3(){
List<TbDept> selectList = session.selectList("testDept.findAllDept");
for (TbDept tbDept : selectList) {
System.out.println(tbDept);
}
}
tb_dept表查询整个表结束
删除tb_dept中的数据
一:在TbDept.xml中写:
<select id="findById" parameterType="int">
delete from tb_dept where id=#{id}
<!-- delete from tb_dept where id=${value} --> 第二种方式
</select>
二:在test中写:
//删除所有Dept表中数据
@Test
public void test4(){
session.delete("testDept.findById",4);
session.commit();
session.close();
}
删除tb_dept表中的数据结束
模糊查询tb_dept
一:在TbDept.xml中写:
<select id="findMohu" parameterType="String" resultType="com.baidu.pojo.TbDept">
select * from tb_dept where name like '%${value}%'
<!-- select * from tb_dept where name like #{name} -->
</select>
二:在test中写:
//模糊查询
@Test
public void test5(){
List<TbDept> selectList = session.selectList("testDept.findMohu","man"); //#使用改为"%man%"
for (TbDept tbDept : selectList) {
System.out.println(tbDept);
}
session.close();
}
模糊查询结束