持久层使用mybatis

测试类当作持久层

package com.ahu.mybatis;
import com.ahu.dao.Impl.UserDaoImpl;
import com.ahu.dao.UserDao;
import com.ahu.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

public class MybatisCRUD {
    
    
    private SqlSessionFactory sqlSessionFactory;
    @Before
    public void before() throws IOException {
    
    
        //创建sqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //Mybatis提供Resource静态类方法getResourceAsStream(),底层封装的是类加载器
        InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");//自动从源码src目录下读取文件
        sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
    }

    /**
     * 本层看作是业务层
     */
    @Test
    public void testDao(){
    
    
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserDao userDao = new UserDaoImpl(sqlSession);
        List<User> users = userDao.queryUser();
        for (User user : users) {
    
    
            System.out.println(user);
        }
        sqlSession.close();
    }
}

Dao层

  1. UserDao
package com.ahu.dao;

import com.ahu.pojo.User;

import java.util.List;

public interface UserDao {
    
    
    List<User> queryUser();
}
  1. UserDaoImpl
package com.ahu.dao.Impl;

import com.ahu.dao.UserDao;
import com.ahu.pojo.User;
import org.apache.ibatis.session.SqlSession;

import java.util.List;

public class UserDaoImpl implements UserDao {
    
    
    private SqlSession sqlSession;

    public UserDaoImpl(SqlSession sqlSession) {
    
    
        this.sqlSession = sqlSession;
    }

    /**
     * 需要sqlSession对象,但是不应该自己获取,要从业务层获取(事务安全性)
     * @return
     */
    @Override
    public List<User> queryUser() {
    
    
        List<User> users = sqlSession.selectList("queryList");
        return users;
    }
}

其他类和配置文件

  1. pojo
package com.ahu.pojo;

import java.util.Date;

public class User {
    
    

    private int id;
    private String username;
    private String sex;
    private Date birthday;
    private String address;

    public int getId() {
    
    
        return id;
    }

    public void setId(int id) {
    
    
        this.id = id;
    }

    public String getUsername() {
    
    
        return username;
    }

    public void setUsername(String username) {
    
    
        this.username = username;
    }

    public String getSex() {
    
    
        return sex;
    }

    public void setSex(String sex) {
    
    
        this.sex = sex;
    }

    public Date getBirthday() {
    
    
        return birthday;
    }

    public void setBirthday(Date birthday) {
    
    
        this.birthday = birthday;
    }

    public String getAddress() {
    
    
        return address;
    }

    public void setAddress(String address) {
    
    
        this.address = address;
    }

    @Override
    public String toString() {
    
    
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", sex='" + sex + '\'' +
                ", birthday=" + birthday +
                ", address='" + address + '\'' +
                '}';
    }
}

  1. 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">
<!--约束文件,位置在mybatis的jar包-->
<configuration>
    <!--
        environments 运行环境,可以配置多个
        default="development"  默认,值=development  开发环境

        environment 运行环境,配置一个
         id="development"  id唯一性的属性 值=id="development"  开发环境
         id="product"  生产环境
         id="test"     测试环境
    -->

    <environments default="development">
        <environment id="development">
            <!--
                 transactionManager 事务管理配置
                 type="JDBC"  使用的是最原始的JDBC的事务处理机制
                 type="MANAGERED" 不管理事务
            -->
            <transactionManager type="JDBC" />
            <!--
                dataSource 配置数据源,连接池
                type="POOLED" 使用连接池
                MyBatis自带连接池  (type=""UNPOOLED)
            -->
            <dataSource type="POOLED">
<!--                使用自带的数据库连接池-->
                <!--配置的是,数据库连接四大信息-->
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://127.0.0.1:3305/mybatis?characterEncoding=utf8" />
                <property name="username" value="root" />
                <property name="password" value="ahulml005" />
            </dataSource>
        </environment>
<!--
        <environment id="produce">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatisProduce?characterEncoding=utf8" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>

        <environment id="test">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatisTest?characterEncoding=utf8" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>-->



    </environments>

    <!--
      配置的是映射关系  ORM Java对象和数据表
    -->
    <mappers>
        <!--
               单独的映射关系
               resource资源,映射文件的路径
               UserMapper.xml 配置的是数据表user的SQL语句,每个xml文件对应每一张表,对应一个namespace
               命名空间是唯一的,不同的表的xml应该命名不同
        -->
        <mapper resource="UserMapper.xml" />

        <!--<mapper resource="StudentMapper.xml"/>-->
    </mappers>
</configuration>    
  1. UserMapper.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">
        <!--
            mapper 映射的意思
            namespace 命名空间,属性值要求唯一性
            整个的SQL语句配置文件
        -->
<mapper namespace="test">

    <!--
      配置删除数据,标签delete
    -->
    <delete id="deleteUserById" parameterType="Integer">
        delete from user where id = #{id}
    </delete>



    <!--
      配置更新数据,标签update
    -->
    <update id="updateUserById" parameterType="com.ahu.pojo.User">
        update user set username=#{username},sex=#{sex},birthday=#{birthday},address=#{address} where id=#{id}
    </update>



    <!--
      配置新增数据,标签insert
      新增数据,SQL语句中,一定会有很多参数
      参数封装在pojo对象,配置的时候,标签属性parameterType
      SQL语句中参数的数据类型是数据库表的列名
      pojo对象User,封装了所有的数据

      增删改,结果是行数,int类型,不要配置resultType

      新增操作:insert标签中,子标签 <selectKey> 获取上一次新增主键值
      属性:
      order="after或者before" 获取主键,是在SQL语句之前,还是之后执行
      resultType 获取主键的结果数据类型
      keyProperty 属性,查询后的值放那里 pojo对象的属性中

    -->
    <insert id="saveUser" parameterType="com.ahu.pojo.User">
       <!--
          传递的参数是对象 pojo
          #{pojo对象的属性名!!}
       -->
        insert into user values (null,#{username},#{sex},#{birthday},#{address})

        <selectKey order="AFTER" resultType="Integer" keyProperty="id">
            SELECT LAST_INSERT_ID ()
        </selectKey>
    </insert>
<!--    selectKey自动封装为pojo对象的id值,只有连接有效-->






   <!--
      select 标签,配置的是查询语句
      id 属性,唯一性,在当前文件中唯一  ,属性值 queryList
      框架执行SQL语句: namespace+"."+queryList  确定SQL语句

      resultType: 查询的结果集,是pojo对象
      标签体: 是SQL语句
   -->
   <select id="queryList" resultType="com.ahu.pojo.User">
      select * from user
   </select>

    <!--
       配置,数据表user模糊查询
       用户名模糊查询
       SQL语句参数
       ${参数名} 写参数名字,固定写为value

       #{}  ${} 获取参数的区别

         select * from user where username like #{value}
           select * from user where username like ?    '%王%'
         参数编译为 ?   传递的实际参数 "'%王%'"   替换到?占位符
         框架底层使用的JDBC中的接口 PreparedStatement


        select * from user where username like ${value}
          select * from user where username like '%王%'
        直接拼接了字符串!!

         ${}  适合于特殊场景, SQL语句中的参数是 列名或者表名的时候
         select * from user order by
    -->
    <select id="queryUserByUserName" resultType="com.ahu.pojo.User" parameterType="String">
        select * from user where username like #{value}
    </select>



    <!--
          配置,主键查询的SQL语句 ,标签 select
          id具有唯一性
          查询是有结果集
            标签中属性 resultType:配置结果集的类型
          SQL语句有参数的
            标签中属性 parameterType: SQL语句的参数类型
    -->
    <select id="queryUserById" resultType="com.ahu.pojo.User" parameterType="Integer">
      <!--
        SQL语句
          MyBatis配置SQL语句,参数不能写问号
          取参数  #{参数名}
          参数名,如果只有一个参数,基本类型及其包装类和String,任意
      -->
        select * from user where id = #{id}
    </select>

<!--    <select id="queryUserById" resultType="com.ahu.pojo.User" parameterType="Integer">-->
<!--        select * from user where id = #{id}-->
<!--    </select>-->


</mapper>

猜你喜欢

转载自blog.csdn.net/qq_41904699/article/details/109003605