zoukankan      html  css  js  c++  java
  • mybatis入门

    一、什么是mybatis

      mybatis是一个持久层的框架。持久就是硬盘中的数据(实际上数据库中的的数据也是硬盘中的数据)

    操作数据技术有原生的JDBC、HIbernate和Mybatis

    二、回顾原生JDBC

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Connection connection=null;
        PreparedStatement statement=null;
        ResultSet resultSet=null;
        
        //1.加载驱动
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        
        //2.连接数据库
        connection=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=ImageServiceDB;", "sa", "AAA@111");
        
        //3.编写sql
        String sql="SELECT * FROM [ImageServiceDB].[dbo].[ImageServerInfo] where [ServerId]=?";
        
        statement=connection.prepareStatement(sql);
        
        //4.设置参数
        statement.setInt(1, 2);
        //54.执行
        resultSet =statement.executeQuery();
        while(resultSet.next()) {
            System.out.println(resultSet.getInt("ServerId"));
            System.out.println(resultSet.getString("ServerName"));
            }
        
        //6.释放资源
        resultSet.close();
        statement.close();
        connection.close();
        }
    View Code

      可以发现以下问题

        1、数据库频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能。

          =>使用数据库连接池管理数据库连接。

        2、sql语句硬编码到java代码中,不利于系统维护。

          =>sql语句配置在xml配置文件中,即使sql变化,不需要对java代码进行重新编译。

        3、preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护。

          =>将sql语句及占位符号和参数全部配置在xml中。

        4、从resutSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,,不利于系统维护

          => 将查询的结果集,自动映射成java对象。

      Mybatis就可以完美的解决以上的问题

    三、Mybatis入门

      1、引入jar

        从https://github.com/mybatis/mybatis-3/releases下载

      2、核心配置文件(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>
        <!-- 和spring整合后 environments 配置废除-->
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC" />
                <dataSource type="POOLED">
                    <property name="driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
                    <property name="url" value="jdbc:sqlserver://localhost:1433;databaseName=ImageServiceDB;" />
                    <property name="username" value="sa" />
                    <property name="password" value="AAA@111" />
                </dataSource>
            </environment>
        </environments>
    </configuration>
    View Code

      3、需求根据用户Id查询

        3.1、创建实体类

    public class User {
    
        private Integer id;
        private String username;// 用户姓名
        private String sex;// 性别
        private Date birthday;// 生日
        private String address;// 地址
    View Code

        3.2、映射文件

    <?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">
    
    <!-- namespace -->
    <mapper namespace="test">
        <!-- 
            id:标识映射文件中的sql,其根本将sql语句封装到mappedStatement对象中,select标签块相当于一个statement
            parameterType:指定输入参数的类型
            resultType:指定sql输出结果的类型,select指定resultType表示将单条记录映射成对-->
        <select id="findUserById" parameterType="int" resultType="com.xxx.mybatis.po.User">
            select * from t_user where id = #{id}
        </select>
    </mapper>

          #{名称}:表示一个占位符,名称:在输入参数类型为简单类型,可以是任意

          ${value}:sql拼接符(不建议使用)

        3.3、在核心配置文件中加载映射文件

        <mappers>
            <mapper resource="User.xml"/>
        </mappers>
    View Code

        3.4、程序编写

        @Test
        public void findUserByIdTest() throws IOException {
        // mybatis核心配置文件
        String resource = "SqlMapConfig.xml";
        // 核心配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 根据核心配置文件,创建SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 通过SqlSessionFactory对象打开SqlSession对象
        SqlSession session = sqlSessionFactory.openSession();
    
        // 通过SqlSession对象操作数据库
        // 第一个参数:映射文件中statement的id,如果调用映射文件的类命名空间不同,需namespace+"."+statement的id
        // 第二个参数:指定和映射文件中输入类型匹配的参数
        User user = session.selectOne("test.findUserById", 1);
        System.out.println(user);
        session.close();
        }
    View Code

      4、根据用户名模糊查询

        4.1、映射文件

        <select id="findUserByName" parameterType="String" resultType="com.xxx.mybatis.po.User">
            <!-- 防止sql注入 -->
            <!-- select * from t_user where name like '%${value}%' -->
            select * from t_user where userName LIKE CONCAT('%',#{value},'%' )
        </select>

        4.2、程序编写

        @Test
        public void findUserByNameTest() throws IOException {
        // mybatis核心配置文件
        String resource = "SqlMapConfig.xml";
        // 核心配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 根据核心配置文件,创建SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 通过SqlSessionFactory对象打开SqlSession对象
        SqlSession session = sqlSessionFactory.openSession();
    
        // 通过SqlSession对象操作数据库
        // 第一个参数:映射文件中statement的id,如果调用映射文件的类命名空间不同,需namespace+"."+statement的id
        // 第二个参数:指定和映射文件中输入类型匹配的参数
        List<User> user = session.selectList("test.findUserByName", "小明");
        System.out.println(user);
        session.close();
        }
    View Code

      5、添加用户

        5.1、映射文件

        <insert id="insertUser" parameterType="com.xxx.mybatis.po.User">
            insert into t_user VALUES (#{username},#{birthday},#{sex},#{address});
        </insert>

        5.2、程序编写

        @Test
        public void insertUserTest() throws IOException {
        // mybatis核心配置文件
        String resource = "SqlMapConfig.xml";
        // 核心配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 根据核心配置文件,创建SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 通过SqlSessionFactory对象打开SqlSession对象
        SqlSession session = sqlSessionFactory.openSession();
        User user = new User();
        user.setUsername("小睡姿");
        user.setBirthday(new Date());
        user.setSex("0");
        user.setAddress("秦国");
        session.insert("test.insertUser", user);
        session.commit();
        session.close();
        }
    View Code

        5.3、自增主键返回

          将插入数据的自增主键设置到对象的属性中(keyProperty="id")

        <insert id="insertUser" parameterType="com.xxx.mybatis.po.User">
            <selectKey keyProperty="id" order="AFTER" resultType="int">
            <!--
                MySql:select LAST_INSERT_ID() as value  
                MSSQL:select @@IDENTITY as value  
            -->
            select @@IDENTITY as value  
            </selectKey>
            insert into t_user VALUES (#{username},#{birthday},#{sex},#{address});
        </insert>

        5.4、获取方式(通过对象的get属性方法获取)

        @Test
        public void insertUserTest() throws IOException {
        // mybatis核心配置文件
        String resource = "SqlMapConfig.xml";
        // 核心配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 根据核心配置文件,创建SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 通过SqlSessionFactory对象打开SqlSession对象
        SqlSession session = sqlSessionFactory.openSession();
        User user = new User();
        user.setUsername("小睡姿");
        user.setBirthday(new Date());
        user.setSex("0");
        user.setAddress("秦国");
        int result=session.insert("test.insertUser", user);
        System.out.println(result);
        session.commit();
        System.out.println(user.getId());    
        session.close();
        }

        5.5、非自增主键返回(1、先查询生成主键,并将其设置到对象的主键属性中,2、在插入执行时从对象中取出主键属性值)

        <insert id="insertUser" parameterType="com.xxx.mybatis.po.User">
            <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
                <!-- Oracl:SELECT 序列名.NEXTVAL FROM DUAL 
                MySql:select uuid() 
                MSSQL:select newid() -->
                select select newid()
            </selectKey>
            insert into t_user VALUES (#{id},#{username},#{birthday},#{sex},#{address});
        </insert>

      6、删除用户

        6.1、映射文件

        <delete id="deleteUser" parameterType="java.lang.Integer">
            delete from t_user where id=#{id}
        </delete>

        6.2、程序编写

     @Test
        public void deleteUserTest() throws IOException {
        // mybatis核心配置文件
        String resource = "SqlMapConfig.xml";
        // 核心配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 根据核心配置文件,创建SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 通过SqlSessionFactory对象打开SqlSession对象
        SqlSession session = sqlSessionFactory.openSession();
        
        session.delete("test.deleteUser", 1);
        session.commit();    
        session.close();
        }
    View Code

      7、更新用户

        7.1、映射文件

          根据id更新用户需要用户id和用户更新信息,输入参数类型parameterType指定user对象,对象包括用户id(必须存在)和更新信息

        <update id="deleteUser" parameterType="com.xxx.mybatis.po.User">
            update t_user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
            where id=#{id}
        </update>

        7.2、编写程序

    @Test
        public void updateUserTest() throws IOException {
        // mybatis核心配置文件
        String resource = "SqlMapConfig.xml";
        // 核心配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 根据核心配置文件,创建SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 通过SqlSessionFactory对象打开SqlSession对象
        SqlSession session = sqlSessionFactory.openSession();
        
        //用户信息
        User user = new User();
        user.setId(2);
        user.setUsername("王晓");
        user.setBirthday(new Date());
        user.setSex("1");
        user.setAddress("中国");
        
        session.update("test.updateUser", user);
        session.commit();
        session.close();
        }
    View Code

    四、Mybatis应用步骤

      1、配置Mybatis核心配置文件

      2、创建实体类,映射文件输入输出参数类型会用到

      3、配置映射文件(Sql语句、Sql输入参数类型、输出参数类型等)

      4、编写Java程序

        4.1、通过读取Mybatis核心配置文件获取SqlSessionFactory对象

        4.2、通过SqlSessionFactory对象获取SqlSession对象

        4.3、SqlSession对象通过配置映射文件中statement的id操作数据库

      

    五、总结:

      1、mybatis的配置文件有两个主要文件:①、核心配置文件,②、映射文件

      2、所有的sql语句都是通过映射文件配置的

      3、session操作数据库的常用方法:

        查询一条记录:selectOne

        查询多条记录:selectList

        添加方法:insert

        更新方法:update

        删除方法:delete

      4、 #{}和${}    

        ①、#{}接收输入参数,类型可以是简单类型,pojo、hashmap。

          接收简单类型,#{}中可以写成value或其它名称      

          接收pojo对象值,通过OGNL读取对象中的属性值(属性.属性.属性...的方式获取对象属性值)

        ②、${}表示一个拼接符号,会引用sql注入(不建议使用${}

                  ${}接收输入参数,类型可以是简单类型,pojo、hashmap。

          接收简单类型,${}中只能写成value

          接收pojo对象值,通过OGNL读取对象中的属性值(属性.属性.属性...的方式获取对象属性值)

  • 相关阅读:
    Python
    deleted
    deleted
    ZOJ 3593 One Person Game(ExGcd + 最优解)题解
    ZOJ 3609 Modular Inverse(扩展欧几里得)题解
    P2234 [HNOI2002]营业额统计(Splay树)题解
    FJUT seventh的tired树上路径(01字典树)题解
    HDU 4825 Xor Sum(01字典树)题解
    Newcoder Metropolis(多源最短路 + Dijkstra堆优化)题解
    HDU 5938 Four Operations(乱搞)题解
  • 原文地址:https://www.cnblogs.com/WarBlog/p/14927812.html
Copyright © 2011-2022 走看看