Mybatis开发使用

首先我们先了解一下什么是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.工程结构
在这里插入图片描述

  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();
}
                  模糊查询结束
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北京李靓仔爱编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值