Mybatis学习记录(1)

1.Mybatis介绍

    Mybatis是apache的一个开源项目iBatis,Mybatis是一个优秀的持久层框架,他对jdbc的操作数据库的过程进行封装,使开发者只需要关注sql本身,不需要花费精力去处理例如注册驱动,创建connection,创建statement,手动设置参数,结果集检索等jdbc复杂的过程代码。

 Mybatis通过xml或注解的方式将要执行的各种statement(statement,preparedStatement,CallableStatement)配安置起来,并通过java对象和statement中的sql进行映射生成最终执行sql语句,最后由mybatis框架执行sql,并将结果映射成java对象返回。

2.jdbc编程问题

   (1)数据库连接创建,释放频繁造成系统资源浪费,从而影响系统性能。(使用连接池可以解决此问题)

   (2)Sql语句在代码中硬编码,造成代码不亦伟乎,实际应用中sql变化的可能较大,sql变动需要改变java代码。

   (3)使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护。

   (4)对结果集解析存在硬编码(查询列名),sql变化导致解析代码变化,系统不易维护。(将数据库记录封装成pojo对象解析比较方便)

3.Mybatis架构

  

  (1)mybatis配置SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。

    此文件需要在SqlMapConfig.xml中加载。

  (2)通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂

  (3)由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。

  (4)mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。

  (5)Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。

  (6)Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,

  输入参数映射就是jdbc编程中对preparedStatement设置参数。    

  (7)Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中

  对结果的解析处理过程。

 4.使用Mybatis的入门程序

 先配置核心文件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配置将废除  链接Mysql时,spring管理连接 jdbcTemplate c3p0-->
    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事务管理 -->
            <transactionManager type="JDBC" />
            <!-- 数据库连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url"
                    value="jdbc:mysql://localhost:3306/javaweb_mybatis?characterEncoding=utf-8" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>
    
    <!-- Mapper的位置 -->
    <mappers>
        <mapper resource="sqlMap/User.xml"/>
    </mappers>
</configuration>

建立pojo对象

package com.javaweb.mybatis.model;

import java.io.Serializable;

public class User implements Serializable{

    /**
     * user表的pojo对象
     */
    private static final long serialVersionUID = 1L;
    private String id;
    private String userName;
    private String userAge;
    private String userSex;
    private String userAddress;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getUserAge() {
        return userAge;
    }
    public void setUserAge(String userAge) {
        this.userAge = userAge;
    }
    public String getUserSex() {
        return userSex;
    }
    public void setUserSex(String userSex) {
        this.userSex = userSex;
    }
    public String getUserAddress() {
        return userAddress;
    }
    public void setUserAddress(String userAddress) {
        this.userAddress = userAddress;
    }
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "User [id=" + id + ", username=" + userName + ", sex=" + userSex
                + ", userAge=" + userAge + ", userAddress=" + userAddress + "]";
    }
        
    

}

配置sql映射文件User.xml

<?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">
<!-- 写sql语句 -->
<mapper namespace="test">
</mapper>

(1)根据id查询用户

/*
     * 根据id查询用户
     */
    @Test
    public void testmybatis() throws Exception{
        //加载核心配置文件
        String resource="sqlMapConfig.xml";
        InputStream in=Resources.getResourceAsStream(resource);
        //创建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
        //创建SqlSession
        SqlSession sqlSession=sqlSessionFactory.openSession();
        User user = sqlSession.selectOne("test.findUserById", "1");
        
        System.out.println(user);
    }

User.xml

<mapper namespace="test">
    <!-- 通过id查询用户 -->
    <select id="findUserById" parameterType="String" resultType="com.javaweb.mybatis.model.User">
        select * from mybatis_user where id= #{v}
    </select>
</mapper>

(2)根据用户名模糊查询用户列表

/*
     * 根据用户名模糊查询用户列表
     */
    @Test
    public void testmybatis2() throws Exception{
        //加载核心配置文件
        String resource="sqlMapConfig.xml";
        InputStream in=Resources.getResourceAsStream(resource);
        //创建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
        //创建SqlSession
        SqlSession sqlSession=sqlSessionFactory.openSession();
        List<User> userlist = sqlSession.selectList("test.findUserByUserName", "王");
        
        for(User user2 :userlist){
            System.out.println(user2);
        }
    }

User.xml

<!-- 根据用户名模糊查询用户列表 
    #{}表示占位符          select * from mybatis_user where id= ? 
    ${}表示字符串拼接  select * from mybatis_user where username like
    -->
    <select id="findUserByUserName" parameterType="String" resultType="com.javaweb.mybatis.model.User">
        select * from mybatis_user where username like '%${value}%'
    </select>

(3)添加用户

/*
     * 添加用户
     */
    @Test
    public void testmybati3() throws Exception{
        //加载核心配置文件
        String resource="sqlMapConfig.xml";
        InputStream in=Resources.getResourceAsStream(resource);
        //创建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
        //创建SqlSession
        SqlSession sqlSession=sqlSessionFactory.openSession();
        
        //执行sql语句
        User user =new User();
        user.setId("4");
        user.setUserName("李四");
        user.setUserAge("22");
        user.setUserSex("男");
        user.setUserAddress("芜湖");
        int i = sqlSession.insert("test.addUser",user);
        sqlSession.commit();
    }

User.xml

<!-- 添加用户 -->
    <insert id="addUser" parameterType="com.javaweb.mybatis.model.User">
        insert into mybatis_user (id,userName,userSex,userAge,userAddress)
        values(#{id},#{userName},#{userSex},#{userAge},#{userAddress})
    </insert>

(4)更新用户

/*
     * 更新用户
     */
    @Test
    public void testmybati4() throws Exception{
        //加载核心配置文件
        String resource="sqlMapConfig.xml";
        InputStream in=Resources.getResourceAsStream(resource);
        //创建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
        //创建SqlSession
        SqlSession sqlSession=sqlSessionFactory.openSession();
        
        //执行sql语句
        User user =new User();
        user.setId("2");
        user.setUserName("张三2");
        user.setUserAge("22");
        user.setUserSex("男");
        int i = sqlSession.update("test.updateUserById",user);
        sqlSession.commit();
    }

User.xml

<!-- 更新用户 -->
    <update id="updateUserById" parameterType="com.javaweb.mybatis.model.User">
        update mybatis_user
        set username= #{userName},userAge = #{userAge},userSex =#{userSex}
        where id = #{id}
    </update>

(5)删除用户

/*
     * 删除用户
     */
    @Test
    public void testmybati5() throws Exception{
        //加载核心配置文件
        String resource="sqlMapConfig.xml";
        InputStream in=Resources.getResourceAsStream(resource);
        //创建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
        //创建SqlSession
        SqlSession sqlSession=sqlSessionFactory.openSession();
        
        //执行sql语句
        User user=new User();
        user.setId("4");
        int i = sqlSession.delete("test.deleteUserById",user);
        sqlSession.commit();
    }

User.xml

<!-- 删除用户 -->
    <delete id="deleteUserById" parameterType="String">
        delete from mybatis_user
        where id = #{id}
    </delete>

    

原文地址:https://www.cnblogs.com/FanJava/p/8330104.html