美文网首页JavaWeb
MyBatis 一对一配置、CURD操作

MyBatis 一对一配置、CURD操作

作者: ThingLin | 来源:发表于2017-02-25 20:29 被阅读387次

    <a href="http://www.mybatis.org/mybatis-3/zh/index.html">MyBatis SQL Mapper Framework for Java</a>
      <a href="http://ibatis.apache.org/">iBatis</a>

    MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

    MyBatis与Hibernate同属于ORM解决方案之一,都是为了简化持久层的操作,它们都封装了JDBC。在效率上MyBatis高于Hibernate低于JDBC,MyBatis使用还是很简单的。

    Demo<a href="http://download.csdn.net/detail/linjiqian/9764321"> http://download.csdn.net/detail/linjiqian/9764321</a>

    引入MyBatis库

    Paste_Image.png

    MyBatis与Hibernate都是要配置实体和表的映射关系的配置文件,MyBatis的sql一般写在配置文件中,并且具有一定的动态性。

    一个一对一的例子,建立学生表与班级表。,默认有三个班级。

    
    -- create Database mybatisdb;
    
    DROP TABLE student;
    DROP TABLE classes;
    
    -- 班级表
    CREATE TABLE classes(
        cls_id INT(5) PRIMARY KEY,
        cls_name VARCHAR(10)    
    );
    
    -- 学生表
    CREATE TABLE student(
        stu_id INT(5) PRIMARY KEY,
        stu_name VARCHAR(10),   
        cls_id INT(5),
        CONSTRAINT scid_fk FOREIGN KEY(cls_id) REFERENCES classes(cls_id)
    );
    
    
    -- 插入三个班级
    INSERT INTO classes(cls_id,cls_NAME) VALUE(1,'乾坤大挪移');
    INSERT INTO classes(cls_id,cls_NAME) VALUE(2,'降龙十八掌');
    INSERT INTO classes(cls_id,cls_NAME) VALUE(3,'龟派气功');
    
    

    Demo项目结构(idea开发):

    Paste_Image.png

    班级实体:Classes.java

    
    package cn.thinglin.demo.entity;
    
    /**
     * Created by mac on 2017/2/25.
     */
    public class Classes {
    
        private int id;
        private String name;
    
        public Classes(){}
    
        public Classes(int id, String name) {
            this.id = id;
            this.name = name;
        }
    
        public int getId() {
            return id;
        }
    
        public Classes setId(int id) {
            this.id = id;
            return this;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    
    
    

    班级实体配置:ClassesMapper.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="classesNamespace">
        
        <resultMap type="cn.thinglin.demo.entity.Classes" id="classesMap">
            <id property="id" column="cls_id"/>
            <result property="name" column="cls_name"/>
        </resultMap>
    
    </mapper>
    
    

    学生实体:Student.java

    
    package cn.thinglin.demo.entity;
    
    /**
     * Created by mac on 2017/2/25.
     */
    public class Student {
    
        private int id;
        private String name;
        private Classes classesId;
    
        public Student(){}
    
        public Student(int id, String name, Classes classesId) {
            this.id = id;
            this.name = name;
            this.classesId = classesId;
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Classes getClassesId() {
            return classesId;
        }
    
        public void setClassesId(Classes classesId) {
            this.classesId = classesId;
        }
    }
    
    
    

    学生实体配置: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">
    
        <!-- 配置实体与表的映射 -->
        <resultMap type="cn.thinglin.demo.entity.Student" id="studentMap">
            <id property="id" column="stu_id"/>
            <result property="name" column="stu_name"/>
            <association property="classesId" resultMap="classesNamespace.classesMap"/> <!-- 1对1映射 -->
        </resultMap>
    
        <select id="findById" parameterType="string" resultMap="studentMap">
            select s.stu_id,s.stu_name,c.cls_name,c.cls_id
            from student s inner join classes c
            on s.cls_id = c.cls_id
            and s.stu_id = #{id}
        </select>
    
        <!-- 一般findAll查询所有不需要条件,这里是为说明可以设置这样的条件 -->
        <select id="findAll" parameterType="map" resultMap="studentMap">
            select * from student
            <!-- where开始设置条件 如果传进来的id不为null就设置条件表字段的id=传进来的id,这里可以动态设置条件也就是mybatis强大的动态sql -->
            <where>
                <if test="id!=null">
                    and stu_id = #{id}
                </if>
                <if test="name!=null">
                    and stu_name = #{name}
                </if>
                <if test="classesId!=null">
                    and cls_id = #{classesId}
                </if>
            </where>
            <if test="index!=null">
                limit #{index},#{size}
            </if>
        </select>
    
        <!-- 判断数据实体的值,null?不增加这个字段:增加这个字段,所以if条件中写实体属性key,if结果写字段名 -->
        <sql id="key">
            <!-- trim suffixOverrides 去掉最后一个,号 -->
            <trim suffixOverrides=",">
                <if test="id!=null">
                    stu_id,
                </if>
                <if test="name!=null">
                    stu_name,
                </if>
                <if test="classesId!=null">
                    cls_id,
                </if>
            </trim>
        </sql>
    
        <!-- 判断数据是否为空,不为空填上实体数据做为value -->
        <sql id="value">
            <trim suffixOverrides=",">
                <if test="id!=null">
                    #{id},
                </if>
                <if test="name!=null">
                    #{name},
                </if>
                <if test="classesId!=null">
                    #{classesId.id}, <!-- 取的映射对象的id值 -->
                </if>
            </trim>
        </sql>
    
        <!-- <include refid="key"/>和<include refid="value"/>表示引用上面定义的sql片段 -->
        <insert id="add" parameterType="cn.thinglin.demo.entity.Student">
            insert into student(<include refid="key"/>) values(<include refid="value"/>)
        </insert>
    
        <!-- 更新 -->
        <update id="update" parameterType="cn.thinglin.demo.entity.Student">
            update student set stu_name = #{name},cls_id = #{classesId.id} where stu_id = #{id}
        </update>
    
        <!-- 删除 -->
        <delete id="delete" parameterType="cn.thinglin.demo.entity.Student">
            delete from student where stu_id = #{id}
        </delete>
        
    </mapper>
    
    

    MyBatis 总配置文件:mybatis.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"/>
    
        <!-- 设置一个默认的连接环境信息 -->
        <environments default="mysql_developer">
    
            <!-- 连接环境信息 先后设置了mysql_developer与oracle_developer,在environments的default属性指向要使用的那个 -->
            <environment id="mysql_developer">
                <!-- mybatis使用jdbc事务管理方式 -->
                <transactionManager type="jdbc"/>
                <!-- mybatis使用连接池方式来获取连接 -->
                <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">
                <!-- mybatis使用jdbc事务管理方式 -->
                <transactionManager type="jdbc"/>
                <!-- mybatis使用连接池方式来获取连接 -->
                <dataSource type="pooled">
                    <!-- 配置与数据库交互的4个必要属性 -->
                    <property name="driver" value="${oracle.driver}"/>
                    <property name="url" value="${oracle.url}"/>
                    <property name="username" value="${oracle.username}"/>
                    <property name="password" value="${oracle.password}"/>
                </dataSource>
            </environment>
        </environments>
        
        <!-- 加载实体映射文件-->
        <mappers>
            <mapper resource="cn/thinglin/demo/entity/StudentMapper.xml"/>
            <mapper resource="cn/thinglin/demo/entity/ClassesMapper.xml"/>
        </mappers>
    
    </configuration>
    
    

    MyBatis工具类:MyBatisUtil.java

    
    package cn.thinglin.demo.util;
    
    import java.io.IOException;
    import java.io.Reader;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    /**
     * Created by mac on 2017/2/25.
     */
    public class MyBatisUtil {
        private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
        private static SqlSessionFactory sqlSessionFactory;
    
        private MyBatisUtil(){}
    
        /**
         * 加载mybatis.xml配置文件
         */
        static{
            try {
                Reader reader = Resources.getResourceAsReader("mybatis.xml");
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
            } catch (IOException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
    
        /**
         * 获取SqlSession
         */
        public static SqlSession getSqlSession(){
            //从当前线程中获取SqlSession对象
            SqlSession sqlSession = threadLocal.get();
            //如果SqlSession对象为空
            if(sqlSession == null){
                //在SqlSessionFactory非空的情况下,获取SqlSession对象
                sqlSession = sqlSessionFactory.openSession();
                //将SqlSession对象与当前线程绑定在一起
                threadLocal.set(sqlSession);
            }
            //返回SqlSession对象
            return sqlSession;
        }
    
        /**
         * 关闭SqlSession与当前线程分开
         */
        public static void closeSqlSession(){
            //从当前线程中获取SqlSession对象
            SqlSession sqlSession = threadLocal.get();
            //如果SqlSession对象非空
            if(sqlSession != null){
                //关闭SqlSession对象
                sqlSession.close();
                //分开当前线程与SqlSession对象的关系,希望尽早回收内存
                threadLocal.remove();
            }
        }
    }
    
    
    

    持久层:StudentDao.java

    
    package cn.thinglin.demo.dao;
    
    import cn.thinglin.demo.entity.Student;
    import cn.thinglin.demo.util.MyBatisUtil;
    import org.apache.ibatis.session.SqlSession;
    
    import java.util.Map;
    import java.util.LinkedHashMap;
    import java.util.List;
    
    /**
     * Created by mac on 2017/2/25.
     */
    public class StudentDao {
    
        /**
         * 根据id查找
         * @param id
         * @return
         * @throws Exception
         */
        public Student findById(int id) throws Exception{
            SqlSession sqlSession = null;
            try{
                sqlSession = MyBatisUtil.getSqlSession();
                return sqlSession.selectOne("studentNamespace.findById",id);
            }catch(Exception e){
                e.printStackTrace();
                throw e;
            }finally{
                MyBatisUtil.closeSqlSession();
            }
        }
    
        /**
         * 添加一个
         * @param student
         * @throws Exception
         */
        public void add(Student student) throws Exception{
            SqlSession sqlSession = null;
            try{
                sqlSession = MyBatisUtil.getSqlSession();
                sqlSession.insert("studentNamespace.add",student);
                sqlSession.commit();
            }catch(Exception e){
                e.printStackTrace();
                sqlSession.rollback();
                throw e;
            }finally{
                MyBatisUtil.closeSqlSession();
            }
        }
    
        /**
         * 查询所有符合条件的,并分页
         */
        public List<Student> findAll(Integer id,String name,Integer classesId,Integer index,Integer size){
            try{
                SqlSession sqlSession = MyBatisUtil.getSqlSession();
    
                Map<String,Object> map = new LinkedHashMap<String,Object>();
                map.put("id",id);
                map.put("name",name);
                map.put("classesId",classesId);
                map.put("index",index);
                map.put("size",size);
    
                return sqlSession.selectList("studentNamespace.findAll",map);
            }catch(Exception e){
                e.printStackTrace();
                throw e;
            }finally{
                MyBatisUtil.closeSqlSession();
            }
        }
    
        /**
         * 更新
         * @param stu
         */
        public void updateById(Student stu){
            SqlSession sqlSession = null;
            try{
                sqlSession = MyBatisUtil.getSqlSession();
                sqlSession.update("studentNamespace.update",stu);
                sqlSession.commit();
            }catch(Exception e){
                e.printStackTrace();
                sqlSession.rollback();
                throw e;
            }finally{
                MyBatisUtil.closeSqlSession();
            }
        }
    
        /**
         *删除
         * @param stu
         */
        public void deleteById(Student stu){
            SqlSession sqlSession = null;
            try{
                sqlSession = MyBatisUtil.getSqlSession();
                sqlSession.delete("studentNamespace.delete",stu);
                sqlSession.commit();
            }catch(Exception e){
                e.printStackTrace();
                sqlSession.rollback();
                throw e;
            }finally{
                MyBatisUtil.closeSqlSession();
            }
        }
    }
    
    

    测试:Test.java

    
    package cn.thinglin.demo.test;
    
    import cn.thinglin.demo.dao.StudentDao;
    import cn.thinglin.demo.entity.Classes;
    import cn.thinglin.demo.entity.Student;
    
    /**
     * Created by mac on 2017/2/25.
     */
    public class Test {
    
        public static void main(String[] args) {
            StudentDao dao = new StudentDao();
            try {
                //插入数据,三条cls_id =1 的
                dao.add(new Student(1, "大侠", new Classes(1, null)));
                dao.add(new Student(2, "大光头", new Classes(1, null)));
                dao.add(new Student(3, "过大年", new Classes(1, null)));
                dao.add(new Student(4, "活着", new Classes(2, null)));
                dao.add(new Student(5, "余华", new Classes(2, null)));
    
                System.out.println("分页查询:");
                System.out.println(dao.findAll(null,null,null,0,4).size()+"条数据");
    
                System.out.println("根据id查询:");
                Student student = dao.findById(2);
                System.out.println(student.getId()+" : "+student.getName() +" : " +student.getClassesId().getName() +" :cls_id = "+student.getClassesId().getId());
                //更新这条数据的cls_id
                student.setClassesId(student.getClassesId().setId(3));
                System.out.println(""+student.getId()+" :: "+student.getClassesId().getId() );
                dao.updateById(student);
    
                System.out.println("查询所有cls_id=1的:");
                System.out.println(dao.findAll(null,null,1,null,null).size()+"条数据");
    
                //删除
                dao.deleteById(student);
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    
    demo_mybatis.gif

    </br>
    </br>
    </br>
    </br>
    </br>

    相关文章

      网友评论

        本文标题:MyBatis 一对一配置、CURD操作

        本文链接:https://www.haomeiwen.com/subject/cemgwttx.html