ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

mybatis

2022-06-16 10:32:31  阅读:137  来源: 互联网

标签:mapper jdbc 配置文件 sysRole sqlSession sql mybatis


01. 原始JDBC操作的分析

  >> 问题

    >  数据库连接的创建、释放频繁,造成系统资源浪费从而影响系统性能;

    > sql语句在代码中硬编码,造成代码不易维护,实际应用中的sql变化可能较大,sql变动需要改变java代码;

    > 查询操作时,需要手动将结果集中的数据封装到实体中,插入操作时,需要手动将实体的数据设置到sql语句的占位符的位置;

  >> 应对方案

    > 使用数据库连接池初始化连接资源;

    > 将sql语句抽取到xml配置文件中;

    > 使用反射、内省等底层技术,自动将实体与表进行属性与字段的自动映射;

 02. mybatis 配置文件头信息

  ** 在使用 mybatis  时,有二种文件,一种是基于模块的应用功能进行配置的文件,即:mapper 文件;  一般命名为: XxxxMapper.xml

   另外一种,是对整个 mybatis 进行配置的配置文件,即主配置文件; 一般命名为  sqlMapConfig.xml

      在实际使用时,命名没有特殊要求,自行命名即可;

  >> 基于模块应用的配置文件配置信息

1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
3 
4 <mapper namespace="sysRole">      //命名空间定义
5     <select id="findAll" resultType="club.wuyu.domain.SysRole">  //sql对应id及返回值对应封装类型
6         select * from sys_Role    //要执行的sql 
7     </select>
8 </mapper>

   >> mybatis 主配置文件

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
 3 
 4 <configuration>
 5     <environments default="dev">
 6         <environment id="dev">
 7             <transactionManager type="JDBC"></transactionManager>
 8             <dataSource type="POOLED">
 9                 <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
10                 <property name="url" value="jdbc:mysql://localhost:3306/test"/>
11                 <property name="username" value="root"/>
12                 <property name="password" value="123456"/>
13             </dataSource>
14         </environment>
15     </environments>
16 
17     <mappers>     //业务mapper配置文件的登记
18         <mapper resource="club/wuyu/mapper/SysRoleMapper.xml"/>
19     </mappers>
20 </configuration>

 

   >> 为确保在发布项目时,mapper 相关配置文件与相应的domain, dao, service 发布到同一位置,在做配置文件时,同样需要配置相应的包路径

    *  Resources 上右键 > new Directory >  输入:   club/wuyu/mapper  才能生成三级目录

     若直接输入 club.wuyu.mapper 将生成一级目录,文件夹的名称为  club.wuyu.mapper (这一点与在java中建包时不一样) 

  >> 测试代码

 1     @Test
 2     public void test1() throws IOException {
 3         //加载核心配置文件
 4         InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
 5         //获取sqlSession工厂对象
 6         SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
 7         //通过工厂对象,获得sqlSession对象
 8         SqlSession sqlSession = sessionFactory.openSession();
 9         //执行sql语句
10         List<SysRole> sysRoleList = sqlSession.selectList("sysRole.findAll");
11         //展示结果
12         System.out.println(sysRoleList);
13         //释放资源
14         sqlSession.close();
15     }

 03. 插入操作 (修改操作与插入操作一样,配置文件中使用 update 而已,关于参数的类型及参数值的使用,与insert 一样)

1     <!--插入操作-->
2     <insert id="save" parameterType="club.wuyu.domain.SysRole">  //使用 parameterType 标识参数类型
3         insert into user values (#{id},#{roleName},#{roleDesc})  //使用 #{实体属性名} 接收参数值
4     </insert>

 

 1     @Test
 2     public void test2() throws IOException {
 3         //加载核心配置文件
 4         InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
 5         //获取sqlSession工厂对象
 6         SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
 7         //通过工厂对象,获得sqlSession对象
 8         SqlSession sqlSession = sessionFactory.openSession();
 9         //执行操作
10         SysRole sysRole = new SysRole();
11         sysRole.setRoleName("测试");
12         sysRole.setRoleDesc("测试用的一个分组");
13 
14         sqlSession.insert("sysRole.save",sysRole);  
15         sqlSession.commit();   //执行插入操作后,需要提交事务,否则数据不会进数据库
16 
17         //释放资源
18         sqlSession.close();
19     }

 

04.关于简单数据类型参数的处理

1     <!--删除操作-->
2     <delete id="delete" parameterType="java.lang.Integer">  //简单数据类型参数的定义
3         delete from sys_Role where id=#{id}          //参数值的引用,任意 ; #{id} ,也可以使用 #{a},#{b}...
4     </delete>

 

1 //执行操作
2         sqlSession.delete("sysRole.delete",8);
3         sqlSession.commit();

  ** 在配置mapper文件及执行操作时,因手误,在配置文件中,使用了 <update>标签,sql还是 delete 

      在执行时,使用了 insert 

   最终结果:依然是删除了数据;

     >> 各标签与函数的使用,之所以有insert , update ,delete ,主要还是在于语义的理解上,毕竟真实执行的sql还是delete;

05. 核心配置文件的层级结构

    

 

  >> 关于 environment 环境变量参数的解析

    >  transactionmanager:  事务管理器;

      * JDBC: 直接使用 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域;

      * MANAGED: 这个配置几乎没做什么;从来不提交或回滚一个连接;而是让容器来管理事务的整个生命周期(如:JEE应用服务器的上下文);

            默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将closeConnection属性设置为false来阻止它默认的关闭行为;

    > dataSource : 数据源

      * UNPOOLED: 这个数据源的实现只是每次被请求时打开和关闭连接;

      * POOLED:这种数据源的实现,利用"池"的概念将JDBC连接对象组织起来;

      * JNDI: 这个数据源的实现,是为了能在如EJB或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用;

 

 05. 关于 jdbc.properties 数据库连接配置参数抽取处理

  >> 抽取数据库连接参数到配置文件 jdbc.properties

1 jdbc.driver=com.mysql.cj.jdbc.Driver
2 jdbc.url=jdbc:mysql://localhost:3306/test
3 jdbc.username=root
4 jdbc.password=123456

 

  >> mybatis 主配置文件中对 jdbc.properties 配置文件的引用 (注意:是在  configuration 标签体内)     

 1 <configuration>
 2     <properties resource="jdbc.properties"/>
 3 
 4     <environments default="dev">
 5         <environment id="dev">
 6             <transactionManager type="JDBC"></transactionManager>
 7             <dataSource type="POOLED">
 8                 <property name="driver" value="${jdbc.driver}"/>
 9                 <property name="url" value="${jdbc.url}"/>
10                 <property name="username" value="${jdbc.username}"/>
11                 <property name="password" value="${jdbc.password}"/>
12             </dataSource>
13         </environment>
14     </environments>
15 
16     <mappers>
17         <mapper resource="club/wuyu/mapper/SysRoleMapper.xml"/>
18     </mappers>
19 </configuration>

 

06. 关于 typeAliases 别名的配置 ( configuration 标签体内)

 

 

    按顺序说明,将 typeAliases 标签体整体,放到 <properties > 后面就可以了

 

 

 

 

 

 

 

 

 

 

 

 

标签:mapper,jdbc,配置文件,sysRole,sqlSession,sql,mybatis
来源: https://www.cnblogs.com/jieling/p/16379303.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有