zoukankan      html  css  js  c++  java
  • Mybatis—curd

    Mybatis简介:
    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行 一些改进。 目前mybatis在github上托管。
    MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发 者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、 创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
    Mybatis通过xml或注解的方式将要执行的各种statement(statement、
    preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的
    sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成 java对象并返回。简单来说,mybatis封装了相关jdbc的操作,经过简单的配置,然后该框架就会帮我 们运行我们写的sql。

    搭建Mybatis工作环境
    step1
    导入jar包(mybatis-3.4.5.jar、mysql-connector-java-5.1.7-bin.jar)。
    step2:
    书写UserBean,DAO接口 。
    step3:
    书写配置文件(两个):
    1、资源文件(主配置文件)SqlMapConfig.xml,用于指定数据库连接参数和框架参数。
    1.1 文件抬头格式书写

    <?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">

    1.2 内容配置

    <configuration>
    <environments default="mysql"> <!--配置数据库连接环境-->
    <environment id="mysql">
    <!--先配置事物 -->
    <transactionManager type="JDBC" />
    <!-- 配置mysql数据源 -->
    <dataSource type="POOLED">
    <property name="driver" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/gokee_0703" />
    <property name="username" value="root" />
    <property name="password" value="123456" />
    </dataSource>
    </environment>
    </environments>
    <!-- 配置映射文件(sql语句)的位置 -->
    <mappers>
    <mapper resource="mapper/UserMapping.xml"/>
    </mappers>
    </configuration>

    2、映射配置文件 SqlMap.xml,用于定义sql语句和映射信息。
    2.1 文件抬头格式书写

    <?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">

    2.2 内容配置

    <mapper namespace="dao.UserDAO">
    <select    id="findUserById" resultType="entity.UserBean" parameterType="String">
    select * from bank where id=#{id}
    </select>
    </mapper>

    参数解析:
    ①namespace为该mapper文件的命名空间,且一个DAO对应一个映射配置文件,值为对应dao的全类名;
    ②id指该sql语句的id,要求唯一,其值为对应接口的方法名;
    ③resultType表示返回数据的类型;
    ④parameterType表示传 入参数的类型。

    代码测试
    书写测试类(核心操作: 获取SqlSession 数据会话对象,调用其提供的方法实现对数据库的操作):

    //使用类加载器加载mybatis的配置文件,并构建sqlSession的工厂 InputStream is = Resources.getResourceAsStream(“xml”);
    SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
    //    获取SqlSession 对象
    SqlSession session = sessionFactory.openSession();
    //获得相关的dao
    IUserDao userDao = session.getMapper(IUserDao.class);

    API解析:
    1、SqlSessionFactoryBuilder :
    该对象负责根据配置文件SqlMapConfig.xml构建SqlSessionFactory实例。
    2、SqlSessionFactory :
    每一个Mybatis的应用程序都将以一个SqlSessionFactory 对象为核心,该对象负责构建SqlSession实例。
    3、SqlSession(数据库会话):
    该对象包含了所有执行Sql操作的方法,用来执行已经映射的sql语句,不过Sqlsession打开数据库,真正 完成交互的是Executor,SqlSession对数据库的操作都是通过Executor来完成的,Executor是动态创建,不需要我们 去管理。

    CURD操作
    1.单表增加操作:
    usermapper.xml:

    <insert id="saveUser" parameterType="entity.BankUser" >
    INSERT INTO bank VALUES(#{id},#{user_name},#{password},#{address})
    </insert>

    java代码:

    UserDAO userDAO=sqlSession.getMapper(UserDAO.class); 
    User user=new User();
    int    i=userDAO.addUser(user); 
    sqlSession.commit();

    1、这里就算不写ResultType 也可以得到默认的返回值int,
    2、mybatis框架独立运行时,需要手动控制事物,进行打开、提交、回滚、关闭操作。若集成了Spring框架, 则可以将其托管到Spring中自动管理。

    2.单表修改操作:
    usermapper.xml:

    <update id="upadateUserName" parameterType="entity.UserBean"> 
    UPDATE bank SET user_name=#{user_name} WHERE id=#{id}
    </update>

    java代码:

    int i=userDAO.updateUser(user);
    session.commit();


    3.单表删除操作:
    usermapper.xml:

    <delete id="deleteUserName" parameterType="String"> 
    DELETE FROM bank WHERE id=#{id}
    </delete>

    java代码;

    int i=userDAO.deleteUserById(“1”);
    session.commit();

    4.单表查询操作:
    1 查询单条数据:
    usermapper.xml:

    <select id="findUserById" parameterType="String"resultType="entity.UserBean">
    select * from bank where id=#{id}
    </select>

    java代码:

    UserDAO userDAO=sqlSession.getMapper(UserDAO.class);
    BankUser bankUser=userDAO.getUserInfoById("1");

    2 查询多条数据:
    usermapper.xml:

    <select id="findUserById" resultType="entity.UserBean"> 
    select * from bank
    </select>

    java代码:

    UserDAO userDAO=sqlSession.getMapper(UserDAO.class); 
    List<UserBean> list =userDAO.userDAO.getAllBankUser1();

    注:这里需要注意一个问题就是resultType代表的是List中的元素类型,而不应该是List本身,所
    以大家会看到如果我们想获取一个UserBean集合, 在配置不应该是resultType=“List”

    3.查询数据返回一个Map(Mybatis自动将数据装入map中,键是字段名,值是字段值)类型:
    usermapper.xml:

    <select    id="findUserById"    parameterType="String" resultType="Map"> 
    select * from bank where id=#{id}
    </select>

    java代码:

    UserDAO userDAO=sqlSession.getMapper(UserDAO.class);
    Map<String,Object> map=userDAO.getUserById("02");


    4 查询单个字段:
    usermapper.xml:

    <select id="findUserById" parameterType="String" resultType="String">
    select userName from bank where    id=#{id}
    </select>

    java代码:

    UserDAO userDAO=sqlSession.getMapper(UserDAO.class); 
    String userName=userDAO.getUserNameById("张三");


    5.关于模糊查询:
    我们知道模糊查询需要使用通配符 %,但是如果直接使用 #,明显不能实现的(下面会讲到#和$的区别):

    SELECT * FROM bank WHERE user_name LIKE #{name}

    所以我们可能会:

    SELECT * FROM    bank WHERE user_name LIKE    ' ${value} '

    但是使用 ${} 也是我们不提倡的方式,所以此时我们可以使用concat函数

    SELECT * FROM    bank WHERE user_name LIKE CONCAT(' ',#{name},' ')

    Mybatis中#和 $参数取值:
    参数的值的获取问题:
    在Mybatis的映射配置文件中可以通过#{ }或 ${ }这两种方式实现参数值的获取,一般来说能使用#{ } 就不要使 用 ${ }。
    1、当传入参数为String类型时:
    使用#{ } 方式可以 通过 #{参数名} 或者默认的 #{_parameter} 来获取参数值,
    但是使用${ }时,不能直接通过${参数名}来获取,需要通过默认方式 ${value} 来取值
    2、#{} 和 ${} 取值的区别:
    #{}进行参数获取时,会把参数转成字符串,即会自动加上一个引号 ‘ ’ ,如

    select * from bank where name= #{name}

    传入名字 “ zhangsan”,最终得到的是 :

    select * from bank where name= ‘ zhangsan’

    ${}是将传入的数据直接显示生成在sql中:

    select * from bank where name= ${value}

    传入名字 “zhangsan”,最终得到:

    select * from bank where name = zhangsan

    直接运行报错,所以需要我们手动添加 ‘ ‘:

    select * from bank where name= ‘ ${value} ’

    但是这样做会带来非常严重的sql注入
    比如传入这样的参数:

    userDAO.getUserIByPsd(" pwd111 ' OR '1'='1 ")

    实际上是

    select * from bank where password= ' pwd111 ' OR '1'='1'

    3、${} 的使用场景:
    多数情况下我们应该使用#{ },但是有些时候我们需要使用${},比如进行动态排序时,根据传入字段排序:

    SELECT * FROM bank order by #{ columnName}

    比如说按照工资排序,你传入salary这个字段,结果:

    SELECT * FROM bank order by 'salary'

    这样明显排序时不起作用的,我们需要

    SELECT * FROM bank order by ${ columnName}

    所以说${ }方式一般用于传入数据库对象,例如传入表名 ,列名这种。

    Mybatis多参数查询映射:
    当sql语句只需要一个参数作为条件时,那么只要通过#{参数名}便可获得该参数值,但是当有多参数时, 这样做会直接报错,这里提供如下解决方案:

    1. 将多个参数传入map, 然后#{keyName} 获取
    2. 将多个参数封装到实体类,然后#{属性名}获取
    3. MyBatis还提供了一个使用@Param注解来参入多个参数的方式。这种方式需要在接口的参数上添加
    public UserBean checkLogin(@Param(value="name")String userName, @Param(value="password")String password);

    在映射文件中便可以通过 #{name} #{password} 取出。

    ResultType和resultMap
    MyBatis中在查询进行select映射的时候,返回数据类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是在同一个select节点中两 者不能够同时存在。
    在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属 性名,值则是其对应的值。
    当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象 对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性。

    <!-- 当表的字段名和实体类的属性名不一致时,MyBatis在进行数据映射时就失败,此时用resultMap解决此问题 -->
    <select id="findById3" parameterType="String"    resultMap="userMap"> 
    SELECT * FROM bank WHERE id=#{id}
    </select>
    <!--id属性:    resultMap标签的标识 ;    type :    返回值的全限定类名,或类型别名 -->
    <resultMap type="entity.UserBean"    id="userMap">
    <id property="userId" column="id"/>
    <result property="userName" column="user_name"/>
    </resultMap>

    注: resultMap 子节点有6个,①id元素 ,用于设置表的主键字段与实体类属性的映射关系,
    ②result元素 ,用于设置表普通字段与实体类属性的映射关系,其他作了解 。
    子节点属性: property: 属性名 column:表的字段名。

  • 相关阅读:
    [leetCode]剑指 Offer 62. 圆圈中最后剩下的数字
    [leetCode]剑指 Offer 61. 扑克牌中的顺子
    [leetCode]剑指 Offer 60. n个骰子的点数
    POJ
    POJ
    POJ
    codeforces
    LightOJ
    CodeForces
    CodeForces
  • 原文地址:https://www.cnblogs.com/ericz2j/p/11108049.html
Copyright © 2011-2022 走看看