JavaEE——Mybatis

1.jdbc编程实现数据库操作

package com.iot.mybatis.jdbc;

//import java.sql.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JdbcTest {
    public static void main(String[] args) {
        //数据库连接
        Connection connection = null;
        //预编译的Statement,使用预编译的Statement提高数据库性能
        PreparedStatement preparedStatement = null;
        //结果集
        ResultSet resultSet = null;

        try {
            //加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");

            //通过驱动管理类获取数据库链接
            connection =  DriverManager.getConnection("jdbc:mysql://120.25.162.238:3306/mybatis001?characterEncoding=utf-8", "root", "123");
            //定义sql语句 ?表示占位符
            String sql = "select * from user where username = ?";
            //获取预处理statement
            preparedStatement = connection.prepareStatement(sql);
            //设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
            preparedStatement.setString(1, "王五");
            //向数据库发出sql执行查询,查询出结果集
            resultSet =  preparedStatement.executeQuery();
            //遍历查询结果集
            while(resultSet.next()){
                System.out.println(resultSet.getString("id")+"  "+resultSet.getString("username"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            //释放资源
            if(resultSet!=null){
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(preparedStatement!=null){
                try {
                    preparedStatement.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

        }

    }

}

上面的代码存在的问题:
  (1).数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能。
  设想:使用数据库连接池管理数据库连接。
  (2).将sql语句硬编码到java代码中,如果sql语句修改,需要重新编译java代码,不利于系统维护。
  设想:将sql语句配置在xml配置文件中,即使sql变化,不需要对java代码进行重新编译。
  (3).向preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护。
  设想:将sql语句及占位符号和参数全部配置在xml中。
  (4).从resutSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,不利于系统维护。
  设想:将查询的结果集,自动映射成java对象。

2.mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成(半自动化,大部分需要程序员编写sql)满足需要sql语句。
mybatis可以将向 preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。(输出映射)
mybatis框架原理图:
这里写图片描述

3.入门程序示例
  (1)创建SqlMapConfig.xml全局配置文件
  (2)映射文件User.xml(原始的ibatis命名方式),在映射文件中配置sql语句
   parameterType:在映射文件中通过parameterType指定输入参数的类型
   resultType:在映射文件中通过resultType指定输出结果的类型
   #{}和${}
    #{} 表示一个占位符号
    ${}表示一个拼接符号,会引起sql注入,所以不建议使用
   selectOne和selectList
    selectOne表示查询一条记录进行映射,使用selectList也可以使用,只不过只有一个对象
    selectList表示查询出一个列表(参数记录)进行映射,不嗯能够使用selectOne查,不然会报下面的错:
    
  (3)在SqlMapConfig.xml中加载User.xml映射文件
  (4)加载配置文件,根据会话工厂SqlSessionFactory 创建会话SqlSession对象,通过SqlSession操作数据库

详见,以下大佬博客内容,

https://blog.csdn.net/h3243212/article/details/51016271

4.使用mapper代理方法开发
  1.编写mapper.xml和mapper.java接口文件
  2.在mapper.xml种namespace等于mapper接口的地址
  3.mapper.java接口种的方法和mapper.xml种id一致
  4.mapper.java接口中的方法输入参数类型和mapper.xml中的statement的parameterType指定的类型一致。
  5.mapper.java接口中的返回值和mapper.xml中的statement的resultType指定的类型一致。

  以上开发规范主要是对以下代码的统一生成:
  User user = sqlSession.selectOne(“test.findUserById”,id) ;
  sqlSession.insert(“test.insertUser”,user) ;
  …

5.在spring-mybatis.xml中加载mapper.xml文件
  1.加载单个映射文件
  < mapper resource=”“>
 2.通过mapper接口加载
   < mapper class=”mapper.xml的路径”>
 3.批量加载多个
  < package name=”包名”>

6.输入映射
  1.简单类型
  2.复杂类型
    类
    包装类(用于连接查询,不同的类组成一个包装类)

7.输出映射
  1.resultType
    使用resultType进行输出映射,只有查询出来的列明和pojo中的属性名一致,该列才可以映射成功。
    不管是输出pojo单个对象还是一个列表,在mapper.xml中mapper.xml中resultType指定的类型是一样的。只在mapper.java中指定的返回值类型不一样。如果是单个对象,返回值是对象类型,如果是对象列表,返回值是List
    
  2.resultMap
    如果查询出来的列明和pojo属性名不一样,通过顶i有一个resultMap对列明和pojo属性名之间做一个映射。
    1.定义resultMap
      type:最终映射的对象类型
      id:对resultMap的唯一标识
        column:查询出来的列明
        property:type指定的pojo类型中的属性名

<resultMap id="UserInfoMap" type="org.javaex.blog.view.UserInfo">
        <result column="id" property="id" />
        <result column="login_name" property="loginName" />
        <result column="pass_word" property="passWord" />
    </resultMap>
//....
<select id="checkUser" resultMap="UserInfoMap">

  
8.Spring整合Mybatis
  (1)整合思路
    需要spring通过单例方式管理SqlSessionFactory。
    spring和mybatis整合生成代理对象,使用SqlSessionFactory创建SqlSession。(spring和mybatis整合自动完成)
    持久层的mapper都需要由spring进行管理。
    这里写图片描述
    
  1.配置sqlSessionFactory——spring.xml
    1.1 配置数据数据库连接参数及连接池

<util:properties id="config" location="classpath:db.properties"></util:properties>
    <!-- 配置数据库连接参数及连接池 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="#{config.driver}" />
        <property name="url" value="#{config.url}" />
        <property name="username" value="#{config.username}" />
        <property name="password" value="#{config.password}" />
    </bean> 

    1.2 配置sqlSessionFactory

<!-- 配置SqlSessionFactoryBean -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 注入连接池 -->
        <property name="dataSource" ref="dataSource"></property>
        <!-- 映射文件的位置 -->
        <property name="mapperLocations" value="classpath:cn/javaex/blog/dao/*.xml"></property>
    </bean>

  
  2.mapper代理开发
   2.1 mapper.java和mapper.xml(mapper.java接口不需要实现类)
   2.2 在spring.xml中通过MapperFactoryBean创建代理对象

<!-- mapper配置
    MapperFactoryBean:根据mapper接口生成代理对象
    -->
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
        //mapperInterface指定mapper接口
        <property name="mapperInterface" value="com.iot.ssm.mapper.UserMapper"/>
        //ref就是上面配置的sqlSessionFactory
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>

  2.2 最终版
   因为上面只能一次配置一个mapper,因此最终版应该如下:在spring.xml中通过MapperScannerConfigurer进行mapper扫描(建议使用)

<!-- mapper批量扫描,从mapper包中扫描出mapper接口,自动创建代理对象并且在spring容器中注册
    遵循规范:将mapper.java和mapper.xml映射文件名称保持一致,且在一个目录中
    自动扫描出来的mapper的bean的id为mapper类名(首字母小写)
    -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <!-- 指定扫描的包名
    如果扫描多个包,每个包中间使用半角逗号分隔
    -->
    <property name="basePackage" value="com.iot.ssm.mapper"/>
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>

</bean>

  3.在spring-mybatis中加载mapper.xml(上面三种方法)
  
  

猜你喜欢

转载自blog.csdn.net/u012990327/article/details/80211370