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读取对象中的属性值(属性.属性.属性...的方式获取对象属性值)

原文地址:https://www.cnblogs.com/WarBlog/p/14927812.html