MyBatis学习笔记

来源:互联网 发布:官方双色球选号软件 编辑:程序博客网 时间:2024/06/05 17:23

1.MyBatis是通过接口调用的方式来对数据库进行操作,这里的接口通常定义为Mapper,在Mapper中,参数通常只有一个,关于多参数的问题,在文末做重点笔记,如StudentMapper,这里面通常只是定义一些数据库的操作,不做具体实现,如StudentMapper:

import java.util.List;import com.java1234.model.Student;public interface StudentMapper {    public int add(Student student);    public int delete(int id);    public int modefiy(Student student);    public Student query(int i);    public List<Student> findAll();}

对应接口的每个方法,在对应接口的Mapper.xml文件中都定义具体的SQL语句的实现,这里尤为注意的是List这类的数据返回我们自定义了一个返回数据型resultMap:

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.java1234.mapper.StudentMapper">    <!-- 自定义一个用于返回List数据类型resultMap -->    <resultMap type="Student" id="StudentResult">        <id property="id" column="id"/>        <result property="name" column="name"/>        <result property="age" column="age"/>    </resultMap>    <!--id即接口中的方法名,parameterType表示的是传入参数的数据类型,前面有配置过Student的全类名的别称,就方便这里的引用  -->    <insert id="add" parameterType="Student"  >        insert into tb_student values(null,#{name},#{age})    </insert>    <delete id="delete" parameterType="Integer"  >        delete from tb_student where id=#{id}    </delete>    <update id="modefiy" parameterType="Student"  >        update tb_student set name=#{name},age=#{age} where id=#{id}    </update>    <select id="query" parameterType="Integer" resultType="Student">        select * from tb_student where id=#{id}    </select>    <select id="findAll" resultMap="StudentResult">        select * from tb_student    </select></mapper> 

2.在对接口的方法做具体实现的时候,可以通过SqlSession的对象对数据库做直接实现:

public class StudentTestWithJunit {    private static Logger logger = Logger.getLogger(StudentTestWithJunit.class);    private SqlSession sqlSession = null;    //这里获取的是一个接口    private StudentMapper studentMapper = null;    @Before    public void setUp() throws Exception {        sqlSession = SqlSessionFactoryUtil.openSession();        studentMapper = sqlSession.getMapper(StudentMapper.class);    }    @After    public void tearDown() throws Exception {        sqlSession.close();    }    //添加    @Test    public void testAdd() {        logger.info("添加学生");        Student student = new Student("赵六", 22);        int result = studentMapper.add(student);        if(result==1){            logger.info("添加成功");        }else{            logger.info("添加失败");        }        sqlSession.commit();    }    //删除    @Test    public void testDelete(){        logger.info("删除学生");        int result = studentMapper.delete(7);        if(result==1){            logger.info("删除成功");        }else{            logger.info("删除失败");        }        sqlSession.commit();    }    //编辑    @Test    public void testModefiy(){        logger.info("编辑学生");        Student s = new Student(3, "test2", 88);        int result = studentMapper.modefiy(s);        if(result==1){            logger.info("编辑成功");        }else{            logger.info("编辑失败");        }        sqlSession.commit();    }    //查询    @Test    public void testList(){        logger.info("查询学生");        Student result = studentMapper.query(60);        if(result!=null){            logger.info("查询成功");            System.out.println(result);        }else{            logger.info("查询失败:未查到对象");        }        sqlSession.commit();    }    //查询所有    @Test    public void testFindAll(){        logger.info("查询所有学生");        List<Student> result = studentMapper.findAll();        for(Student s:result){            System.out.println(s);        }        sqlSession.commit();    }}

3.具体的SqlSession工具类就是封装了一个获取SqlSession的工具类:

public class SqlSessionFactoryUtil {    private static SqlSessionFactory sqlSessionFactory;    //获取SqlSessionFactory    public static SqlSessionFactory getSqlSessionFactory(){        if(sqlSessionFactory==null){            InputStream is = null;            try {                //以流的形式读取配置文件                is = Resources.getResourceAsStream("mybatis-config.xml");                sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }        return sqlSessionFactory;    }    //最终通过Session来操作数据库    public static SqlSession openSession(){        return getSqlSessionFactory().openSession();    }}

4.MyBatis的配置文件

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>    <!--引入数据库的外部配置文件  -->    <properties resource="jdbc.properties" />    <!-- 为com.java1234.model.Student起一个别名:Student,可以用alias随意指定别名,在映射文件中会有用到,如:    <typeAliases>        <typeAlias alias="Student" type="com.java1234.model.Student" />    </typeAliases>;    这种方式只能一个类一个类的配置,如果类很多就用Package标签来起别名,这里的别名都是取的是包下class文件的文件名,不可随意指定        如(推荐使用):        <typeAliases>            <package name="com.java1234.model"/>        </typeAliases>        如果com.java1234.model包下有Student类和User类,那么会自动扫描取别名为:Student和User     -->     <typeAliases>        <package name="com.java1234.model"/>     </typeAliases>    <environments default="development">        <environment id="development">        <!--transactionManager事务管理器  -->            <transactionManager type="JDBC" />            <!-- 配置dataSource,其中POOLED表示使用数据库连接池,UNPOOLED则表示不用数据库连接池(新建连接,用完关闭,只适合小并发),            JNDI表示使用应用服务器JNDI数据源来获取数据库连接 -->            <dataSource type="POOLED">            <!-- 这里使用外部文件配置,也可以直接使用<property name="jdbc.username" value="root" /> -->                <property name="driver" value="${jdbc.driverClass}" />                <property name="url" value="${jdbc.url}" />                <property name="username" value="${jdbc.userName}" />                <property name="password" value="${jdbc.password}" />            </dataSource>        </environment>    </environments>    <!-- 配置映射文件,因为开发中使用的映射文件很多,推荐使用如下方式,可以自动扫描包下的所有映射文件,        如果映射文件不多,则可以使用        <mappers>            <mapper resource="com/java1234/mapper/StudentMapper.xml" />        </mappers>        这样的方式单独配置     -->    <mappers>        <package name="com.java1234.mapper"/>    </mappers></configuration>

注意:关于Mapper中多参数的问题:

1.如果参数是两个或者多个,通常会将多个参数封装在一个Map中,通过key-value的形式传递到Mapper.xml中,比如在StudentMapper中定义了一个通过学生姓名和年龄这两个参数去查询学生:

public Student findStudent(Map<String, Object> map);

Mapper.xml中是正常调用:

<!-- 物理分页 -->    <select id="findUsers2" parameterType="Map" resultMap="UserResult">        select * from t_user        <if test="start!=null and size!=null">            limit #{start},#{size}        </if>    </select>

这里面传入的是一个Map,在xml中通过Map中的key来调用相应的参数,因为在调用该接口的时候必定已经对传入的Map进行过赋值,并且定义了两个key为start和size,下面看调用的流程:

//物理分页,开发中常用    @Test    public void testFindUsers2(){        logger.info("物理分页查询");        Map<String, Object> map = new HashMap<String, Object>();        map.put("start", 0);        map.put("size", 3);        List<User> users = userMapper.findUsers2(map);        for(User user:users){            System.out.println(user);        }    }

2.当然也可以直接传入参数调用,Mapper中定义的方法为:

public List<User> searchUser(String name, Integer age);

这里没用封装name和age这两个属性,而是直接传进去了,那么要特别注意Mapper.xml中的调用方式:

<!-- 多参数查询,不指定参数类型,用内置的param1这样的参数-->     <select id="searchUser" resultMap="UserResult">        <!-- 模糊查询的时候没有用等号 -->        select * from t_user where name like #{param1} and age=#{param2}    </select>

注意!注意!这里不能用#{name} and age=#{age},而是用#{param1} and age=#{param2}!!

调用时正常调用即可:

    @Test    public void testsearchUser(){        logger.info("查询用户");        List<User> users = userMapper.searchUser("%四%", 22);        for(User user:users){            System.out.println(user);        }    }

这里做简单的介绍,java中正常都是将参数名指定为arg0,arg1这样的形式,所以只能用MyBatis中内置的param1、param2这样的形式!

原创粉丝点击