Mybatis XML和接口注解 两种方式CURD

来源:互联网 发布:中国商学院排名知乎 编辑:程序博客网 时间:2024/06/08 07:24

mybatis CURD


1、XML的方式

过程与上一篇mybatis入门示例一致,将users表的SQL映射配置文件(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"><!--CURD 映射配置--><mapper namespace="userMapper">    <insert id="insertUser" parameterType="com.mybatis.hello.User">        insert into users(name, age) values(#{name}, #{age});    </insert>    <delete id="deleteUser" parameterType="int">        delete from users where id=#{id}    </delete>    <update id="updateUser" parameterType="com.mybatis.hello.User">        update users set name=#{name},age=#{age} where id=#{id}    </update>    <select id="selectUser" parameterType="int" resultType="com.mybatis.hello.User">        select * from users where id=#{id}    </select>    <select id="selectAllUsers" resultType="com.mybatis.hello.User">        select * from users    </select></mapper>

同时可修改注释部分,自由测试

package com.mybatis.hello;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 java.io.IOException;import java.io.Reader;import java.util.List;/** * Created by yanghui10 on 2016/8/3. */public class MybatisTest {    public static void main(String[] args) throws IOException {        String resource = "conf.xml";        //加载mybatis 的配置文件(它也加载关联的映射文件)        //        InputStream is=MybatisTest.class.getClassLoader().getResourceAsStream(resource);        Reader reader = Resources.getResourceAsReader(resource);        //构建sqlSession 的工厂        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);        //创建能执行映射文件中sql 的sqlSession        SqlSession session = sessionFactory.openSession();        //映射sql 的标识字符串//        String statement = "userMapper"+".selectUser";        String statement = "userMapper"+".selectAllUsers";        //执行查询返回一个唯一user 对象的sql//        User user = session.selectOne(statement, 1);//         int a=session.insert(statement,new User("sad",19));//         session.insert(statement,new User("asd",15));//         session.insert(statement,new User("d",19));//         session.insert(statement,new User("fffd",14));//         session.commit();         List<User> users=session.selectList(statement);//        User user = session.selectOne(statement, 1);         System.out.println(users);    }}

注意:看到session.commit()没?

涉及insert、update、delete的DML,要手动的commit呢,注意close(这里没写session.close())方法是不会监测有木有commit,幻想close方法去commit会让你死的很惨滴。


2、接口注解的方式

相对应的,将XML方式的users表的SQL映射配置文件(userMapper.xml)去掉,创建如下sql映射的接口

package com.mybatis.hello;import org.apache.ibatis.annotations.Delete;import org.apache.ibatis.annotations.Insert;import org.apache.ibatis.annotations.Select;import org.apache.ibatis.annotations.Update;import java.util.List;/** * Created by yanghui10 on 2016/8/3. */public interface UserMapper {    @Insert("insert into users(name, age) values(#{name}, #{age})")    public int insertUser(User user);    @Delete("delete from users where id=#{id}")    public int deleteUserById(int id);    @Update("update users set name=#{name},age=#{age} where id=#{id}")    public int updateUser(User user);    @Select("select * from users where id=#{id}")    public User getUserById(int id);    @Select("select * from users")    public List<User> getAllUser();

同样的,在conf.xml中改为注册接口:

<mappers>    <!--接口的方式  注册接口-->    <mapper class="com.mybatis.hello.UserMapper"/>    <!--XML的方式 注册映射配置文件-->    <!--<mapper resource="userMapper"/>--></mappers>

测试代码中调用部分改为如下

//        String statement = "userMapper"+".selectAllUsers";//        List<User> users=session.selectList(statement);        UserMapper userMapper=session.getMapper(UserMapper.class);        List<User> users=userMapper.getAllUser();        System.out.println(users);


优化:可以定义一个工具类,只在加载时创建一次SqlSessionFactory对象(或者其它单例模式),因为此对象只需要一次

如下,直接由静态方法返回新的sqlSession即可

package com.mybatis.common;import com.mybatis.hello.MybatisTest;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 java.io.InputStream;import java.io.Reader;/** * * 用mybatis实现的dao层,具体核对对象是SqlSession。 *由于dao层依赖于SqlSession。而SqlSession的创建过程需要SqlSessionFactory对象, *此对象对于多次的CRUD操作只需要一个对象,所以这里引用另一个自定义的MyBatisUtils工具类。 * * Created by yanghui10 on 2016/8/3. */public class MybatisUtil {    private  static SqlSessionFactory sqlSessionFactory;    static {        String resource = "conf.xml";        //加载mybatis 的配置文件(它也加载关联的映射文件)        InputStream is = MybatisTest.class.getClassLoader().getResourceAsStream(resource);        //构建sqlSession 的工厂        sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);    }    /**     *  返回一个SqlSession对象(每次返回一个新的SqlSession对象)     * 若涉及多个表的操作,涉及事务的,要做到操作失败时回滚,那么建议自定义一个TransactionUtils的工具类     *  用ThreadLocal类来保存SqlSession类,这样跨多个dao操作时,确保获取的都是同一SqlSession对象。     *  然后在service层中捕获异常,再catch上用session的回滚。     */    public static SqlSession openSesison(){        return  sqlSessionFactory.openSession();//使用参数 true 则为自动提交    }}


mybatis的使用确实非常简单方便,MyBatis 是支持普通SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC 代码和参数的手工设置以及对结果集的检索封装。MyBatis 可以使用简单的XML 或注解用于配置和原始映射,将接口和Java 的POJO(Plain Old Java Objects,普通的Java 对象)映射成数据库中的记录。


不过要形成Spring+SpringMVC+Mybatis+Velocity以及各种服务框架和MQ等的大型架构,以及项目中每一层(dao、domain、service等)的准确划分,任然是需要探索的难点。

1 0
原创粉丝点击