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

    1.回顾jdbc开发 orm概述

      orm是一种解决持久层对象关系映射的规则,而不是一种具体技术。jdbc/dbutils/springdao,hibernate/springorm,mybaits同属于ORM解决方案之一。

    2.mybaits

      mybatis基于jdbc,兼顾难易度和速度。

    3.mybatis快速入门

      导入lib包

      在src目录下配置mybatis.cfg.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>
        <!--加载类路径下的属性文件-->
        <properties resource="db.properties">
        </properties>
        <!--设置类型别名-->
        <typeAliases>
            <typeAlias type="app04.Student" alias="student"/>
        </typeAliases>
        <!--设置默认连接环境信息-->
        <environments default="oracle_developer">
            <!--连接环境信息,取一个唯一的名字-->
            <environment id="mysql_developer">
                <!--事务管理方式-->
                <transactionManager type="jdbc"></transactionManager>
                <!--使用连接池获取-->
                <dataSource type="pooled">
                    <!--配置与数据库交互的4个必要属性-->
                    <property name="driver" value="${mysql.driver}"/>
                    <property name="url" value="${mysql.url}"/>
                    <property name="username" value="${mysql.username}"/>
                    <property name="password" value="${mysql.password}"/>
                </dataSource>
            </environment>
            <environment id="oracle_developer">
                <!--事务管理方式-->
                <transactionManager type="jdbc"></transactionManager>
                <!--使用连接池获取-->
                <dataSource type="pooled">
                    <!--配置与数据库交互的4个必要属性-->
                    <property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
                    <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/>
                    <property name="username" value="scott"/>
                    <property name="password" value="tiger"/>
                </dataSource>
            </environment>
        </environments>
        <!--加载映射文件-->
        <mappers>
            <mapper resource="app04/StudentMapper.xml"/>
            <mapper resource="app09/StudentMapper.xml"/>
            <mapper resource="app10/StudentMapper.xml"/>
            <mapper resource="app11/StudentMapper.xml"/>
        </mappers>
    </configuration>

      实体类

      配置映射文件StudentMapper.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="studentNamespace">
        <!--映射实体与表-->
        <!--type表示实体的全路径名
            id为实体与表的映射取一个唯一的编号-->
        <resultMap id="studentMap" type="app04.Student">
            <!--id标签映射主键属性,result标签映射非主键属性
                property表示实体的属性名
                column表示表的字段名-->
            <id property="id" column="id"/>
            <result property="name" column="name"/>
            <result property="sal" column="sal"/>
        </resultMap>
        <!--insert属性:要书写insert语句
            id表示为insert语句取一个唯一编号
            parameterType表示要执行的dao中的方法的参数,如果是类的话,必须使用全路径名-->
        <insert id="add1">
            INSERT INTO students(id,name,sal) values(1,"haha",7000)
        </insert>
        <insert id="add2" parameterType="student">
            INSERT INTO students(id,name,sal) values(#{id},#{name},#{sal})
        </insert>
    </mapper>

      获取连接

    public class MybatisUtil {
        private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
        private static SqlSessionFactory sqlSessionFactory;
        //加载位于mybatis.xml配置文件
        static{
            try {
                Reader reader = Resources.getResourceAsReader("mybatis.cfg.xml");
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    
    
        public static SqlSession getSqlSession(){
                    SqlSession sqlSession = threadLocal.get();
            if(sqlSession == null){
                sqlSession = sqlSessionFactory.openSession();
                //将session与当前线程绑定在一起
                threadLocal.set(sqlSession);
            }
            return sqlSession;
        }
        //关闭当前sqlsession,与当前线程分离
        public static void closeSqlSession(){
            SqlSession sqlSession = threadLocal.get();
            if(sqlSession!=null){
                sqlSession.close();
                //分离,目的是为了尽早垃圾回收
                threadLocal.remove();
            }
        }
    
    }

      dao

        public void add1() throws Exception{
            SqlSession sqlSession = null;
            try {
                sqlSession = MybatisUtil.getSqlSession();
                //默认事务开始,读取StudentMapper.xml映射文件中的sql语句
                int i = sqlSession.insert("studentNamespace.add1");
                sqlSession.commit();
                System.out.println("本次操作影响了"+i+"行");
            }catch (Exception e){
                sqlSession.rollback();
                throw e;
            }finally {
                MybatisUtil.closeSqlSession();
            }
        }
        public void add2(Student student) throws Exception{
            SqlSession sqlSession = null;
            try {
                sqlSession = MybatisUtil.getSqlSession();
                //默认事务开始,读取StudentMapper.xml映射文件中的sql语句
                sqlSession.insert("studentNamespace.add2",student);
                sqlSession.commit();
            }catch (Exception e){
                sqlSession.rollback();
                throw e;
            }finally {
                MybatisUtil.closeSqlSession();
            }
        }

    4.mybatis工作流程

    1)通过Reader对象读取src目录下的mybatis.cfg.xml配置文件(该文本的位置和名字可任意)

    2)通过SqlSessionFactoryBuilder对象创建SqlSessionFactory对象

    3)从当前线程中获取SqlSession对象

    4)事务开始,在mybatis中默认

    5)通过SqlSession对象读取StudentMapper.xml映射文件中的操作编号,从而读取sql语句

    6)事务提交,必写

    7)关闭SqlSession对象,并且分开当前线程与SqlSession对象,让GC尽早回收

    5基于MybatisUtil工具类,完成CURD操作

      映射配置文件

    <?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="app09.Student">
        <resultMap id="studentMap" type="app09.Student">
            <id property="id" column="id"/>
            <result property="name" column="name"/>
            <result property="sal" column="sal"/>
        </resultMap>
        <insert id="add" parameterType="app09.Student">
            INSERT  INTO students(id,name, sal) VALUES(#{id},#{name},#{sal})
        </insert>
        <!--如果参数不是实体,只是普通变量,#中的参数名可以随便写-->
        <select id="findById" parameterType="int" resultType="app09.Student">
            SELECT ID,NAME,SAL FROM students WHERE id = #{xxx}
        </select>
    
        <select id="findAll" resultType="app09.Student">
            SELECT ID,NAME,SAL FROM students
        </select>
    
        <update id="update" parameterType="app09.Student">
            UPDATE students SET name=#{name},sal=#{sal} WHERE id=#{id}
        </update>
        <delete id="delete" parameterType="app09.Student">
            DELETE  FROM students WHERE  ID=#{id}
        </delete>
    </mapper>

      dao

        public void add(Student student) throws Exception{
            SqlSession sqlSession = null;
            try {
                sqlSession = MybatisUtil.getSqlSession();
                sqlSession.insert(Student.class.getName()+".add",student);
                sqlSession.commit();
            }catch (Exception e){
                sqlSession.rollback();
                throw e;
            }finally {
                MybatisUtil.closeSqlSession();
            }
        }
        private Student findById(int id) {
            Student student= null;
            SqlSession sqlSession = null;
            try {
                sqlSession = MybatisUtil.getSqlSession();
                student = sqlSession.selectOne(Student.class.getName() + ".findById", id);
                sqlSession.commit();
            }catch (Exception e){
                sqlSession.rollback();
                throw e;
            }finally {
                MybatisUtil.closeSqlSession();
            }
            return student;
    
        }
    
        private List<Student> findAll() {
            List<Student> students = new ArrayList<>();
            SqlSession sqlSession = null;
            try {
                sqlSession = MybatisUtil.getSqlSession();
                students = sqlSession.selectList(Student.class.getName() + ".findAll");
                sqlSession.commit();
            }catch (Exception e){
                sqlSession.rollback();
                throw e;
            }finally {
                MybatisUtil.closeSqlSession();
            }
            return students;
        }
        private void update(Student student) {
            SqlSession sqlSession = null;
            try {
                sqlSession = MybatisUtil.getSqlSession();
                sqlSession.update(Student.class.getName()+".update",student);
                sqlSession.commit();
            }catch (Exception e){
                sqlSession.rollback();
                throw e;
            }finally {
                MybatisUtil.closeSqlSession();
            }
        }
        private void delete(Student student) {
            SqlSession sqlSession = null;
            try {
                sqlSession = MybatisUtil.getSqlSession();
                sqlSession.delete(Student.class.getName()+".delete",student);
                sqlSession.commit();
            }catch (Exception e){
                sqlSession.rollback();
                throw e;
            }finally {
                MybatisUtil.closeSqlSession();
            }
        }

    6.分页查询(mysql,oracle)

      映射配置文件

    mysql

        <select id="findAllWithFy" parameterType="map" resultMap="studentMap">
            SELECT id,name,sal FROM students LIMIT #{start},#{size}
        </select>

    oracle

        <select id="findAllWithFyByOracle" parameterType="map" resultMap="studentMap">
            SELECT ID,NAME,SAL
            FROM (SELECT ROWNUM IDS,ID,NAME,SAL
                FROM STUDENTS
                WHERE ROWNUM &lt; #{end})
            WHERE IDS &gt; #{start}
        </select>

      dao

        public List<Student> findAllWithFy(int start,int size){
            List<Student> students = new ArrayList<>();
            SqlSession sqlSession = null;
            try {
                sqlSession = MybatisUtil.getSqlSession();
                Map<String, Object> map = new LinkedHashMap<>();
                map.put("start",start);
                map.put("size",size);
                students = sqlSession.selectList(Student.class.getName()+".findAllWithFy",map);
                sqlSession.commit();
                return students;
            }catch (Exception e){
                sqlSession.rollback();
                throw e;
            }finally {
                MybatisUtil.closeSqlSession();
            }
        }

    7.动态SQL操作之查询

      映射配置文件

        <select id="findAll" parameterType="map" resultMap="studentMap">
            SELECT ID,NAME,SAL FROM STUDENTS
            <where>
                <if test="pid!=null">
                    and ID = #{pid}
                </if>
                <if test="pname!=null">
                    and NAME = #{pname}
                </if>
                <if test="psal != null">
                    AND SAL &lt; #{psal}
                </if>
            </where>
        </select>

      dao

        public List<Student> findAll(Integer id ,String name,Double sal){
            List<Student> students = new ArrayList<>();
            SqlSession sqlSession = null;
            try {
                sqlSession = MybatisUtil.getSqlSession();
                Map<String, Object> map = new LinkedHashMap<>();
                map.put("pid",id);
                map.put("pname",name);
                map.put("psal",sal);
                students = sqlSession.selectList(Student.class.getName()+".findAll",map);
                sqlSession.commit();
                return students;
            }catch (Exception e){
                sqlSession.rollback();
                throw new RuntimeException(e);
            }finally {
                MybatisUtil.closeSqlSession();
            }
        }

    8.动态SQL操作之更新

      映射配置文件

        <update id="update" parameterType="map">
            UPDATE STUDENTS
            <set>
                <if test="pname!=null">
                    name = #{pname},
                </if>
                <if test="psal != null">
                    sal = #{psal},
                </if>
            </set>
            WHERE id = #{pid}
        </update>

      dao

        public void update(Student student){
            SqlSession sqlSession = null;
            try {
                sqlSession = MybatisUtil.getSqlSession();
                Map<String, Object> map = new LinkedHashMap<>();
                map.put("pid",student.getId());
                map.put("pname",student.getName());
                map.put("psal",student.getSal());
                sqlSession.update(Student.class.getName()+".update",map);
                sqlSession.commit();
            }catch (Exception e){
                sqlSession.rollback();
                throw new RuntimeException(e);
            }finally {
                MybatisUtil.closeSqlSession();
            }
        }

    9.动态SQL操作之删除

      映射配置文件

       <delete id="deleteAll" >
            DELETE FROM  students WHERE ID IN
            <foreach collection="array" open="(" close=")" separator="," item="ids">
                #{ids}
            </foreach>
        </delete>

      dao

       public void deleteAll(int... ids)throws Exception{
            SqlSession sqlSession = null;
            try {
                sqlSession = MybatisUtil.getSqlSession();
                sqlSession.delete(Student.class.getName()+".deleteAll",ids);
                sqlSession.commit();
            }catch (Exception e){
                sqlSession.rollback();
                throw new RuntimeException(e);
            }finally {
                MybatisUtil.closeSqlSession();
            }
        }

    10.动态SQL操作之插入

      映射配置文件

        <!--sql片段-->
        <sql id="key">
            <trim suffixOverrides=",">
                <if test="id != null">
                    id,
                </if>
                <if test="name != null">
                    name,
                </if>
                <if test="sal != null">
                    sal,
                </if>
            </trim>
        </sql>
        <sql id="value">
            <trim suffixOverrides=",">
                <if test="id != null">
                    #{id},
                </if>
                <if test="name != null">
                    #{name},
                </if>
                <if test="sal != null">
                    #{sal},
                </if>
            </trim>
        </sql>
        <insert id="insert" parameterType="app11.Student">
            INSERT INTO students(<include refid="key"/>) values (<include refid="value"/>)
        </insert>

      dao

        public void deleteList(List<Integer> ids)throws Exception{
            SqlSession sqlSession = null;
            try {
                sqlSession = MybatisUtil.getSqlSession();
                sqlSession.delete(Student.class.getName()+".deleteList",ids);
                sqlSession.commit();
            }catch (Exception e){
                sqlSession.rollback();
                throw new RuntimeException(e);
            }finally {
                MybatisUtil.closeSqlSession();
            }
        }
  • 相关阅读:
    Head first javascript(七)
    Python Fundamental for Django
    Head first javascript(六)
    Head first javascript(五)
    Head first javascript(四)
    Head first javascript(三)
    Head first javascript(二)
    Head first javascript(一)
    Sicily 1090. Highways 解题报告
    Python GUI programming(tkinter)
  • 原文地址:https://www.cnblogs.com/juaner767/p/5750700.html
Copyright © 2011-2022 走看看