1.什么是框架

框架是软件开发中的一套解决方案,不同的框架解决不同的问题

2.三层架构

表现层:展示数据

业务层:处理业务需求

持久层:与数据库交互

3.持久层解决技术

  • JDBC技术(JDBC是一种规范)

  • Spring的JdbaTemplate(工具类):Spring中对Jdbc的简单封装

  • Apache的DBUtils(工具类):和Spring的JdbaTemplate很像,也是对Jdbc的简单封装

4.mybatis入门

4.1.mybatis环境搭建

第一步:创建maven工程并导入坐标

打jar包

<dependencies>

   <dependency>

      <groupId>org.mybatis</groupId> 

      <artifactId>mybatis</artifactId>

      <version>3.4.5</version>

   </dependency>

   <dependency>

      <groupId>junit</groupId> 

      <artifactId>junit</artifactId> 

      <version>4.10</version>

      <scope>test</scope>

   </dependency>

   <dependency>

      <groupId>mysql</groupId>

      <artifactId>mysql-connector-java</artifactId> 

      <version>5.1.6</version>

      <scope>runtime</scope>

   </dependency>

   <dependency>

      <groupId>log4j</groupId> 

      <artifactId>log4j</artifactId> 

      <version>1.2.12</version>

      </dependency>

   </dependencies>

第二步:创建实体类和dao的接口

public interface IUserDao {

     List<User> findAll();

}

第三步:创建SqlMapConfig.xml主配置文件

<?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>
<!-- 配置 mybatis 的环境 --> <environments default="mysql"> <!-- 配置 mysql 的环境 --> <environment id="mysql"> <!-- 配置事务的类型 --> <transactionManager type="JDBC"></transactionManager> <!-- 配置连接数据库的信息:用的是数据源(连接池) --> <dataSource type="POOLED"> <!-- 配置连接数据库的4个基本信息 --> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/数据库名"/> <property name="username" value="root"/>

<property name="password" value="123456"/>

</dataSource> </environment> </environments> <!-- 告知 mybatis 映射配置文件的位置 --> <mappers> <mapper resource="com/itheima/dao/IUserDao.xml"/> </mappers> </configuration>

第四步:创建映射配置文件

<?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.itheima.dao.IUserDao"> 

         <!-- 配置查询所有操作 -->

​         <select id="findAll" resultType="com.itheima.domain.User">

select * from user

</select>

4.2.环境搭建注意事项

第一个:mybatis映射配置文件位置必须和dao接口的包结构相同

第二个:映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名,表示是哪个dao接口

第三个:映射配置文件的操作配置,id属性的取值必须是dao接口的方法名

第四个:映射配置文件中,resultType是将执行完的代码封装到哪个实体类中后边接的是实体类的全限定类名

4.3.编写测试类

public class MybatisTest {

     public static void main(String[] args)throws Exception {

        //1.读取配置文件 ,生成字节输入流

        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");

        //2.创建 SqlSessionFactory 的构建者对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //3.使用构建者创建工厂对象 SqlSessionFactory factory = builder.build(in); //4.使用 SqlSessionFactory 生产 SqlSession 对象 SqlSession sqlSession = factory.openSession(); //5.使用 SqlSession 创建 dao 接口的代理对象 IUserDao userDao = sqlSession .getMapper(IUserDao.class); //6.使用代理对象执行查询所有方法 List<User> users = userDao.findAll(); for(User user : users) { System.out.println(user); }

//7.释放资源 session.close(); in.close(); } }

图:mybatis分析

5.基于注解开发

5.1.移除映射配置文件

5.2.在持久层接口中添加注解,指定sql语句

public interface IUserDao {

  @Select("select * from user")

  List<User> findAll();

}

5.3.修改SqlMapConfig.xml主配置文件(使用class属性指定dao接口的全限定类名,之前是resource属性指定的映射配置文件位置)

<!-- 告知 mybatis 映射配置的位置 -->

<mappers> 

     <mapper class="com.itheima.dao.IUserDao"/> 

</mappers>

6.查询所有的分析

mybatis读取配置文件用到了dom4j(读取xml的技术)的技术

在主配置文件中配置的连接数据库的4个基本信息:创建了Connection对象

主配置文件中的<mappers>标签,能够有映射配置文件信息

配置文件中:有了可执行的sql语句,就可以获取PrepareStatement对象,还能知道封装到的类

代理对象的创建

Proxy有一个方法叫做ProxyInstance,这个方法有三个参数

7.mybatis的CRUD操作

7.1.保存操作

7.1.1在持久层接口中添加保存方法

/**

*保存用户

@param user

@return 影响数据库记录的行数

*/

int saveUser(User user);

7.1.2在配置文件中配置

<!-- 保存用户-->

<insert id="saveUser" parameterType="com.itheima.domain.User">

     insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})

</insert>

细节:

parameterType 属性:

代表参数的类型,因为我们要传入的是一个类的对象,所以类型就写类的全名称。

sql 语句中使用#{}字符:

它代表占位符,相当于原来 jdbc 部分所学的?,都是用于执行语句时替换实际的数据。

具体的数据是由#{}里面的内容决定的。

#{}中内容的写法:

由于我们保存方法的参数是 一个 User 对象,此处要写 User 对象中的属性名称。它用的是 ognl 表达式。

ognl 表达式:

它是 apache 提供的一种表达式语言,全称是: Object Graphic Navigation Language 对象图导航语言

它是按照一定的语法格式来获取数据的。

语法格式就是使用 #{对象.对象}的方式

#{user.username}它会先去找 user 对象,然后在 user 对象中找到 username 属性,并调用 getUsername()方法把值取出来。但是我们在 parameterType 属性上指定了实体类名称,所以可以省略 user. 而直接写 username

7.1.3测试类

     private InputStream in;

     private SqlSession sqlSession;

     private IUserDao userDao;

     private SqlSessionFactory factory;

@Before //用于在测试方法执行之前执行

public void init() throws Exception{

  //1.读取配置文件 ,生成字节输入流

  in = Resources.getResourceAsStream("SqlMapConfig.xml");

  //2.创建 SqlSessionFactory 的构建者对象 

SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //3.使用构建者创建工厂对象 factory = builder.build(in); //4.使用 SqlSessionFactory 生产 SqlSession 对象 sqlSession = factory.openSession(); //5.使用 SqlSession 创建 dao 接口的代理对象 userDao = sqlSession .getMapper(IUserDao.class); } @After public void destroy()throws Exception{ //提交事务 sqlSession .commit(); //7.释放资源 sqlSession .close(); in.close(); } @Test public void testSave(){ User user = new User(); user.setUsername("modify User property"); user.setAddress("北京市顺义区"); user.setSex("男"); user.setBirthday(new Date()); System.out.println("保存操作之前:"+user); //6.执行保存方法 userDao.saveUser(user); System.out.println("保存操作之后:"+user); }

7.2.更新

7.2.1在持久层添加更新方法

/**

*更新用户

@param user

@return 影响数据库记录的行数

*/

int updateUser(User user);

7.2.2在配置文件中配置

<!-- 更新用户 -->

<update id="updateUser" parameterType="com.itheima.domain.User">

update user set username=#{username},birthday=#{birthday},sex=#{sex}, address=#{address} where id=#{id} 

</update>

7.2.3测试类

@Test

public void testUpdateUser()throws Exception{

  User user=new User();

  user.setrId(50);

  user.setrUsername(“智障”);

  user.setrAddress(“吉林省长春市”);

  user.setrSex("女");

  user.setrBirthday(new Date());

//执行保存方法

userDao.updateUser(User);

}

7.3删除用户

7.3.1在持久层添加删除方法

/**

*根据 id 删除用户

@param userId

@return

*/

int deleteUser(Integer userId); //注意,删除时不用传入user对象,根据id删除

7.3.2在配置文件中配置

<!-- 删除用户 -->

<delete id="deleteUser" parameterType="java.lang.Integer">

delete from user where id = #{uid}

</delete>

注意:此处#{} 中的内容可以随便写,由于数据类型是基本类型,所以此处可以随意写。

注意parameterType参数类型

7.3.3测试类

@Test
public void testDeleteUser() throws Exception { //执行操作 userDao.deleteUser(52); }

7.4查询一个

7.4.1在持久层添加查询一个方法

/**

根据 id 查询

param userId

return 

*/

User findById(Integer userId);   // 返回的是一个user对象

7.4.2在配置文件中配置

<!-- 根据 id 查询 -->

<select id="findById" resultType="com.itheima.domain.User" parameterType="int"> select * from user where id = #{uid} </select> ​

细节:

此处是user类型,所以要写resultType 属性

resultType 属性:

用于指定结果集的类型。

parameterType 属性:

用于指定传入参数的类型。

#{}中内容的写法:

由于数据类型是基本类型,所以此处可以随意写。

7.4.3测试类

@Test

public void testFindOne() { 

   //执行操作

   User user = userDao.findById(41);

   System.out.println(user);

}

7.5根据名称模糊查询

7.5.1.在持久层添加模糊查询方法

/**

*根据名称模糊查询

*@param username

*@return

*/

List<User> findByName(String username);      //注意,返回的应该是一个List集合,你想吧,不可能那么巧合模糊查询只有一个结果啊

7.5.2.在配置文件中配置

<!-- 根据名称模糊查询 -->

<select id="findByName" resultType="com.itheima.domain.User" parameterType="String">

select * from user where username like #{username}

</select>

注意:List集合这块传入了User对象,所以还是应该有resultType属性

7.5.3.测试类中加入模糊查询

@Test

public void testFindByName(){

  //执行查询一个方法

  List<User> users = userDao.findByName("%王%");

  for(User user : users){

    System.out.println(user);

   }

}

7.6.模糊查询的另一种方式

第一步:在持久层添加模糊查询方法

/**

*根据名称模糊查询

*@param username

*@return

*/

List<User> findByName(String username);

第二步:在配置文件中的修改sql语句使用模糊查询

<select id="findByName" parameterType="string" resultType="com.itheima.domain.User">       

    select * from user where username like'%${value}%' 

</select>

注意:如果用这种模糊查询的写法,那么${value}的写 法就是固定的,不能写成其它名字

第三步:测试类

@Test

public void testFindByName(){ //执行模糊查询方法

   List<User> users = userDao.findByName("王");

   for(User user : users){

     System.out.println(user);

   }

}

注意:此时测试类中的王不用加匹配符%了

7.7两种模糊查询比较

在测试类中使用模糊查询更好,不推荐在配置文件中修改sql语句使用模糊查询

原因:一个是使用statement对象的字符串拼接sql

另一个是使用preparedStatement的参数占位符,当然是使用这个啊

7.8.查询时使用聚合函数查询总记录条数

7.8.1.在持久层添加查询总记录条数方法

/**

*查询总记录条数

*@return

*/

int findTotal()

7.8.2.在配置文件中配置

<!-- 查询总记录条数 -->

<select id="findTotal" resultType="int">

select count(*) from user;

</select>

7.8.3.测试类

@Test

public void testFindTotal() throws Exception {

//执行操作

    int count=userDao.findTotal();

    System.out.println(count);

}

mybatis学习日记的更多相关文章

  1. mybatis学习日记-day01

    Mybatis说明: MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的 ...

  2. MyBatis学习日记(一):拜见小主——MyBatis

    近日学习MyBatis,特将学习过程及一点心得记录于此. MyBatis为何物? MyBatis 是支持定制化SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC ...

  3. MyBatis学习日记(三):戏说MyBatis配置文件

    properties标签 properties标签可以用来加载别的配置文件,比如可以加载数据库的配置文件,jdbc.properties. 下面是jdbc.properties jdbc.driver ...

  4. MyBatis学习日记(二): MyBatis Say Hello

    首先在Eclipse中创建一个maven工程: 在maven工程下的pom.xml文件中添加MyBatis.MySQL.Junit依赖: <project xmlns="http:// ...

  5. Linux学习日记-使用EF6 Code First(四)

    一.在linux上使用EF 开发环境 VS2013+mono 3.10.0 +EF 6.1.0 先检测一下EF是不是6的 如果不是  请参阅 Linux学习日记-EF6的安装升级(三) 由于我的数据库 ...

  6. MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作(转载)

    本文转载自:http://www.cnblogs.com/jpf-java/p/6013540.html 上一篇博文MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybati ...

  7. MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合(转载)

      孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(八)--Mybatis3.x与Spring4.x整合 一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: m ...

  8. MyBatis学习总结(七)——Mybatis缓存(转载)

      孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(七)--Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的 ...

  9. (原创)mybatis学习二,spring和mybatis的融合

    mybatis学习一夯实基础 上文介绍了mybatis的相关知识,这一节主要来介绍mybaits和spring的融合 一,环境搭建 1,jar包下载,下载路径为jar包 2,将包导入到java工程中 ...

  10. (原创)mybatis学习一,夯实基础

    一,what?(是什么) MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可 ...

随机推荐

  1. python(牛客)试题解析2 - 中等

    导航 一.NC192 二叉树的后序遍历 二.NC117 合并二叉树 三.求长度最长的的连续子序列使他们的和等于sum 四.按顺序取出固定长度内容并合并两个数组为一个新数组 五.输出所有结果小于k的整数 ...

  2. HDC2022的无障碍参会体验,手语服务是如何做到的?

    华为开发者大会2022(HDC)上,HMS Core手语数字人以全新形象亮相,并在直播中完成了长达3个多小时的实时手语翻译,向线上线下超过一千万的观众提供了专业.实时.准确的手语翻译服务,为听障人士提 ...

  3. 1 c++编程基础

    重新系统学习c++语言,并将学习过程中的知识在这里抄录.总结.沉淀.同时希望对刷到的朋友有所帮助,一起加油哦! 生命就像一朵花,要拼尽全力绽放!死磕自个儿,身心愉悦! 1 c++揭开面纱 1.1 编程 ...

  4. 一文带你了解 Spring 的@Enablexxx 注解

    layout: post categories: Java title: 一文带你了解 Spring 的@Enablexxx 注解 tagline: by 子悠 tags: - 子悠 前面的文章给大家 ...

  5. Oracle plsql Database links

    在多系统对接的过程中,子系统要用到的基础数据例如部门和用户名是要和门户OA系统保持一致的,这个哦每天都要更新同步一次, 在Oracle中,存储过程可以完美的简单的解决这一问题.把目标数据库在plsql ...

  6. 社论 22.10.9 优化连续段dp

    CF840C 给定一个序列 \(a\),长度为 \(n\).试求有多少 \(1\) 到 \(n\) 的排列 \(p_i\),满足对于任意的 \(2\le i\le n\) 有 \(a_{p_{i-1} ...

  7. 兼容IE全版本及所有市面浏览器的网页变黑白处理方式

    大家应该有发现最近几天不少网站变成了黑白色,在哀悼日时,很多网站都需要全站变成黑白配色,今天对这个实现的技术做了一些探索性了解,在此进行一个记录分享. 使用的样式部分:下面的css部分想必大家应该都可 ...

  8. C/C++标准输入输出函数终极最全解析(不全捶我)

    C/C++的一众输入输出函数的区别常常搞得人晕头转向,二者之中又以输入函数更加令人头疼.本文尝试整理C/C++的各种输入输出函数. 由于输入涉及空格.换行符的读取.忽略等问题,因此输入比输出更麻烦.所 ...

  9. DC-9靶场练习

    Vulnhub靶场-DC-9 准备工作 kali和靶机都选择NAT模式(kali与靶机同网段) 下载链接:https://download.vulnhub.com/dc/DC-9.zip 一.主机发现 ...

  10. python注释、变量、数据类型详细

    目录 1.python注释 2.PEP8规范 3.变量与常量 1.python中的变量 2.变量名的命名规范 3.常量的基本使用 1.python注释 什么是注释? 注释是对代码的解释说明,写注释是为 ...