1.什么是框架

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

2.三层架构

表现层:展示数据

业务层:处理业务需求

持久层:与数据库交互

3.持久层解决技术

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

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

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

4.mybatis入门

4.1.mybatis环境搭建

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

打jar包

  1. <dependencies>
  2.  
  3. <dependency>
  4.  
  5. <groupId>org.mybatis</groupId>
  6.  
  7. <artifactId>mybatis</artifactId>
  8.  
  9. <version>3.4.5</version>
  10.  
  11. </dependency>
  12.  
  13. <dependency>
  14.  
  15. <groupId>junit</groupId>
  16.  
  17. <artifactId>junit</artifactId>
  18.  
  19. <version>4.10</version>
  20.  
  21. <scope>test</scope>
  22.  
  23. </dependency>
  24.  
  25. <dependency>
  26.  
  27. <groupId>mysql</groupId>
  28.  
  29. <artifactId>mysql-connector-java</artifactId>
  30.  
  31. <version>5.1.6</version>
  32.  
  33. <scope>runtime</scope>
  34.  
  35. </dependency>
  36.  
  37. <dependency>
  38.  
  39. <groupId>log4j</groupId>
  40.  
  41. <artifactId>log4j</artifactId>
  42.  
  43. <version>1.2.12</version>
  44.  
  45. </dependency>
  46.  
  47. </dependencies>

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

  1. public interface IUserDao {
  2.  
  3. List<User> findAll();

  4. }

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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2.  
  3. <!DOCTYPE configuration

  4. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  5.  
  6. "http://mybatis.org/dtd/mybatis-3-config.dtd">

  7. <configuration>
  8. <!-- 配置 mybatis 的环境 -->
  9.  
  10. <environments default="mysql">
  11.  
  12. <!-- 配置 mysql 的环境 -->
  13.  
  14. <environment id="mysql">
  15.  
  16. <!-- 配置事务的类型 -->
  17.  
  18. <transactionManager type="JDBC"></transactionManager>
  19.  
  20. <!-- 配置连接数据库的信息:用的是数据源(连接池) -->
  21.  
  22. <dataSource type="POOLED">
  23.  
  24. <!-- 配置连接数据库的4个基本信息 -->
  25.  
  26. <property name="driver" value="com.mysql.jdbc.Driver"/>
  27.  
  28. <property name="url" value="jdbc:mysql://localhost:3306/数据库名"/>
  29.  
  30. <property name="username" value="root"/>

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

  31. </dataSource>
  32.  
  33. </environment>
  34.  
  35. </environments>
  36.  
  37. <!-- 告知 mybatis 映射配置文件的位置 -->
  38.  
  39. <mappers>
  40.  
  41. <mapper resource="com/itheima/dao/IUserDao.xml"/>
  42.  
  43. </mappers>
  44.  
  45. </configuration>

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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2.  
  3. <!DOCTYPE mapper
  4.  
  5. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  6.  
  7. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  8.  
  9. <mapper namespace="com.itheima.dao.IUserDao">
  10.  
  11. <!-- 配置查询所有操作 -->
  12.  
  13. <select id="findAll" resultType="com.itheima.domain.User">

  14. select * from user

  15. </select>

4.2.环境搭建注意事项

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

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

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

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

4.3.编写测试类

  1. public class MybatisTest {
  2.  
  3. public static void main(String[] args)throws Exception {
  4.  
  5. //1.读取配置文件 ,生成字节输入流
  6.  
  7. InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
  8.  
  9. //2.创建 SqlSessionFactory 的构建者对象
  10. SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
  11.  
  12. //3.使用构建者创建工厂对象
  13.  
  14. SqlSessionFactory factory = builder.build(in);
  15.  
  16. //4.使用 SqlSessionFactory 生产 SqlSession 对象
  17.  
  18. SqlSession sqlSession = factory.openSession();
  19.  
  20. //5.使用 SqlSession 创建 dao 接口的代理对象
  21.  
  22. IUserDao userDao = sqlSession .getMapper(IUserDao.class);
  23.  
  24. //6.使用代理对象执行查询所有方法
  25.  
  26. List<User> users = userDao.findAll();
  27.  
  28. for(User user : users) {
  29.  
  30. System.out.println(user);
  31.  
  32. }

  33. //7.释放资源
  34.  
  35. session.close();
  36.  
  37. in.close();
  38.  
  39. }
  40.  
  41. }

图:mybatis分析

5.基于注解开发

5.1.移除映射配置文件

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

  1. public interface IUserDao {
  2.  
  3. @Select("select * from user")
  4.  
  5. List<User> findAll();
  6.  
  7. }

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

  1. <!-- 告知 mybatis 映射配置的位置 -->
  2.  
  3. <mappers>
  4.  
  5. <mapper class="com.itheima.dao.IUserDao"/>
  6.  
  7. </mappers>

6.查询所有的分析

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

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

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

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

代理对象的创建

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

7.mybatis的CRUD操作

7.1.保存操作

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

  1. /**
  2.  
  3. *保存用户
  4.  
  5. @param user
  6.  
  7. @return 影响数据库记录的行数
  8.  
  9. */
  10.  
  11. int saveUser(User user);

7.1.2在配置文件中配置

<!-- 保存用户-->

  1. <insert id="saveUser" parameterType="com.itheima.domain.User">
  2.  
  3. insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
  4.  
  5. </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测试类

  1. private InputStream in;
  2.  
  3. private SqlSession sqlSession;
  4.  
  5. private IUserDao userDao;
  6.  
  7. private SqlSessionFactory factory;
  8.  
  9. @Before //用于在测试方法执行之前执行
  10.  
  11. public void init() throws Exception{
  12.  
  13. //1.读取配置文件 ,生成字节输入流
  14.  
  15. in = Resources.getResourceAsStream("SqlMapConfig.xml");
  16.  
  17. //2.创建 SqlSessionFactory 的构建者对象

    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
  18.  
  19. //3.使用构建者创建工厂对象
  20.  
  21. factory = builder.build(in);
  22.  
  23. //4.使用 SqlSessionFactory 生产 SqlSession 对象
  24.  
  25. sqlSession = factory.openSession();
  26.  
  27. //5.使用 SqlSession 创建 dao 接口的代理对象
  28.  
  29. userDao = sqlSession .getMapper(IUserDao.class);
  30.  
  31. }
  32.  
  33. @After
  34.  
  35. public void destroy()throws Exception{
  36.  
  37. //提交事务
  38.  
  39. sqlSession .commit();
  40.  
  41. //7.释放资源
  42.  
  43. sqlSession .close();
  44.  
  45. in.close();
  46.  
  47. }
  48.  
  49. @Test
  50.  
  51. public void testSave(){
  52.  
  53. User user = new User();
  54.  
  55. user.setUsername("modify User property"); user.setAddress("北京市顺义区");
  56.  
  57. user.setSex("男");
  58.  
  59. user.setBirthday(new Date());
  60.  
  61. System.out.println("保存操作之前:"+user);
  62.  
  63. //6.执行保存方法
  64.  
  65. userDao.saveUser(user);
  66.  
  67. System.out.println("保存操作之后:"+user);
  68.  
  69. }

7.2.更新

7.2.1在持久层添加更新方法

  1. /**
  2.  
  3. *更新用户
  4.  
  5. @param user
  6.  
  7. @return 影响数据库记录的行数
  8.  
  9. */
  10.  
  11. int updateUser(User user);

7.2.2在配置文件中配置

  1. <!-- 更新用户 -->
  2.  
  3. <update id="updateUser" parameterType="com.itheima.domain.User">
  4.  
  5. update user set username=#{username},birthday=#{birthday},sex=#{sex}, address=#{address} where id=#{id}
  6.  
  7. </update>

7.2.3测试类

  1. @Test
  2.  
  3. public void testUpdateUser()throws Exception{
  4.  
  5. User user=new User();
  6.  
  7. user.setrId(50);
  8.  
  9. user.setrUsername(“智障”);
  10.  
  11. user.setrAddress(“吉林省长春市”);
  12.  
  13. user.setrSex("女");
  14.  
  15. user.setrBirthday(new Date());
  16.  
  17. //执行保存方法
  18.  
  19. userDao.updateUser(User);

    }

7.3删除用户

7.3.1在持久层添加删除方法

  1. /**
  2.  
  3. *根据 id 删除用户
  4.  
  5. @param userId
  6.  
  7. @return
  8.  
  9. */
  10.  
  11. int deleteUser(Integer userId); //注意,删除时不用传入user对象,根据id删除

7.3.2在配置文件中配置

  1. <!-- 删除用户 -->
  2.  
  3. <delete id="deleteUser" parameterType="java.lang.Integer">
  4.  
  5. delete from user where id = #{uid}
  6.  
  7. </delete>

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

注意parameterType参数类型

7.3.3测试类

  1. @Test
  2. public void testDeleteUser() throws Exception {
  3.  
  4. //执行操作
  5.  
  6. userDao.deleteUser(52);
  7.  
  8. }

7.4查询一个

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

  1. /**
  2.  
  3. 根据 id 查询
  4.  
  5. param userId
  6.  
  7. return
  8.  
  9. */
  10.  
  11. User findById(Integer userId); // 返回的是一个user对象

7.4.2在配置文件中配置

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

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

细节:

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

resultType 属性:

用于指定结果集的类型。

parameterType 属性:

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

#{}中内容的写法:

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

7.4.3测试类

  1. @Test
  2.  
  3. public void testFindOne() {
  4.  
  5. //执行操作
  6.  
  7. User user = userDao.findById(41);
  8.  
  9. System.out.println(user);
  10.  
  11. }

7.5根据名称模糊查询

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

  1. /**
  2.  
  3. *根据名称模糊查询
  4.  
  5. *@param username
  6.  
  7. *@return
  8.  
  9. */
  10.  
  11. List<User> findByName(String username); //注意,返回的应该是一个List集合,你想吧,不可能那么巧合模糊查询只有一个结果啊

7.5.2.在配置文件中配置

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

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

  2. select * from user where username like #{username}

    </select>

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

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

  1. @Test
  2.  
  3. public void testFindByName(){
  4.  
  5. //执行查询一个方法
  6.  
  7. List<User> users = userDao.findByName("%王%");
  8.  
  9. for(User user : users){
  10.  
  11. System.out.println(user);
  12.  
  13. }
  14.  
  15. }

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

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

  1. /**
  2.  
  3. *根据名称模糊查询
  4.  
  5. *@param username
  6.  
  7. *@return
  8.  
  9. */
  10.  
  11. List<User> findByName(String username);

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

  1. <select id="findByName" parameterType="string" resultType="com.itheima.domain.User">
  2.  
  3. select * from user where username like'%${value}%'
  4.  
  5. </select>

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

第三步:测试类

  1. @Test
  2.  
  3. public void testFindByName(){ //执行模糊查询方法
  4.  
  5. List<User> users = userDao.findByName("王");
  6.  
  7. for(User user : users){
  8.  
  9. System.out.println(user);
  10.  
  11. }
  12.  
  13. }

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

7.7两种模糊查询比较

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

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

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

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

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

  1. /**
  2.  
  3. *查询总记录条数
  4.  
  5. *@return
  6.  
  7. */
  8.  
  9. int findTotal()

7.8.2.在配置文件中配置

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

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

select count(*) from user;

</select>

7.8.3.测试类

  1. @Test
  2.  
  3. public void testFindTotal() throws Exception {
  4.  
  5. //执行操作
  6.  
  7. int count=userDao.findTotal();
  8.  
  9. System.out.println(count);
  10.  
  11. }

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. .NET深入了解哈希表和Dictionary

    引子 问题:给定一串数字{1,2,5,7,15,24,33,52},如何在时间复杂度为O(1)下,对数据进行CURD? 数组:我创建一个Length为53的数组,将元素插入相同下标处,是不是就可以实现 ...

  2. ubuntu 22.04安装多个gcc

    sudo apt install gcc-9 g++-9 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 - ...

  3. Referenced file contains errors (http://mybatis.org/dtd/mybatis-3-config.dtd). For more information, right click on the message in the Problems View and select "Show Details..."

    mybatis配置文件报错Referenced file contains errors mybatis的配置文件报错 The errors below were detected when vali ...

  4. PGL图学习之项目实践(UniMP算法实现论文节点分类、新冠疫苗项目实战,助力疫情)[系列九]

    原项目链接:https://aistudio.baidu.com/aistudio/projectdetail/5100049?contributionType=1 1.图学习技术与应用 图是一个复杂 ...

  5. mingw+CLion环境下在Windows下编译配置并使用opencv

    目录 安装(mingw环境) 在项目中使用opencv QtCreator使用opencv 安装(mingw环境) vs环境没配过不知道 下载地址 解压到目标目录     解压后的目录结构(build ...

  6. 【SQL真题】SQL1: 各个视频的平均完播率 【AVG/SUM/IF/CASE】

    题目: https://www.nowcoder.com/practice/96263162f69a48df9d84a93c71045753?tpId=268&tqId=2285032& ...

  7. Springboot优雅进行字段检验

    Springboot优雅进行字段检验 1.Controller VS Service 推荐与业务无关的放在controller层中进行校验,而与业务相关的放在service层中校验. 2.常用校验工具 ...

  8. 天坑,这样一个lambda随机取数据也有Bug

    前几天,一位网友跟我说他编写的一段很简单的代码遇到了奇怪的Bug,他要达到的效果是从一个List中随机取出来一条数据,代码如下: 1 var random = new Random(); 2 var ...

  9. ArcObjects SDK 012 PageLayout和Page

    1.从ArcMap角度看结构 一个Mxd文件包含一个PageLayout对象和一个多多个Map对象,每个Map会被包成MapFrame,添加到PageLayout中.我们用ArcMap打开一个mxd文 ...

  10. ORM执行sql语句 双下划线 外键字段创建 ORM跨表查询

    目录 模型层之ORM执行SQL语句 方式1一 方式二 方式三 神奇的双下划线查询 ORM外键字段的创建 1.创建基础表 2.确定外键关系 3.表的查看 数据的录入 外键字段相关操作 针对一对多 ''' ...