Mybatis学习

本文介绍了MyBatis的基本配置方法,包括环境配置、类型别名、映射器配置等,并通过具体示例展示了如何使用MyBatis进行增删改查操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,我们来看如何配置mybatis文件.

<?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"/>
 <!-- 方式一 
 <typeAliases >
<typeAlias type="wangcc.entity.User" alias="User"/>
</typeAliases>
-->
<typeAliases>
<package name="wangcc.entity"/>

</typeAliases>
<!-- 方式二

 -->

<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="wangcc/entity/UserMapper.xml"/>
<mapper class="wangcc.mapping.UserMapper"/>
</mappers>
</configuration>


将数据库参数配置的属性文件导入mybatis配置文件中,
当Mappers中的mapper的配置为
mapper的属性为class,意味着该mapper的sql不是写在xml配置文件中,而是以注解的方式直接写在mapper接口上。

package wangcc.mapping;

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 wangcc.entity.User;

public interface UserMapper {
    @Insert("insert into wangcc_user(name,birthday,salary) values(#{name},#{birthday},#{salary})")
    public int add(User user);
    @Update("update wangcc_user set name=#{name},birthday=#{birthday},salary=#{salary} where id=#{id}")
    public int update(User user);
    @Select("select id,name,birthday,salary from wangcc_user where id=#{id}")
    public User get(Integer id);
    @Delete("delete from wangcc_user where id=#{id}")
    public int delete(Integer id);
}

如果配置mapper是以mapper的属性是resource时,代表此时是以配置文件方式配置的

<?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,namespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的
  例如namespace="wangcc.entity.UserMapper"就是wangcc.entity(包名)+userMapper(UserMapper.xml文件去除后缀)
  -->
<mapper namespace="wangcc.entity.UserMapper">
 <!-- 在select标签中编写查询的SQL语句, 设置select标签的id属性为getUser,id属性值必须是唯一的,不能够重复
      使用parameterType属性指明查询时使用的参数类型,resultType属性指明查询返回的结果集类型
     resultType="wangcc.entity.User"就表示将查询结果封装成一个User类的对象返回
     User类就是users表所对应的实体类
    -->
    <!-- 
         根据id查询得到一个user对象
     -->
<select id="getUser" parameterType="Integer"
resultType="User">
select * from wangcc_user where id=#{id}
</select>
<insert id="addUser" parameterType="wangcc.entity.User">
insert into wangcc_user(name,birthday,salary) values(#{name},#{birthday},#{salary})
</insert>
<delete id="delUser"  parameterType="Integer">
delete from wangcc_user where id=#{id}
</delete>
<update id="updateUser" parameterType="wangcc.entity.User">
update wangcc_user set name=#{name},birthday=#{birthday},salary=#{salary} where id=#{id}
</update>

</mapper>

与Hibernate一样,Mybatis也有Session以及SessionFactory,其获取方式与Hibernate相似
下面我们看如何获取

package wangcc.util;

import java.io.IOException;
import java.io.InputStream;
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;

public class MyBatisUtil {
    private final static String config = "config.xml";
    private static SqlSessionFactory sessionFactory=null;
    private static ThreadLocal<SqlSession> threadLocal=new ThreadLocal<SqlSession>();
    static{
          try {
            Reader reader = Resources.getResourceAsReader(config);
            sessionFactory=new SqlSessionFactoryBuilder().build(reader);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }  
//          InputStream in=MyBatisUtil.class.getClassLoader().getResourceAsStream(config);
//          sessionFactory=new SqlSessionFactoryBuilder().build(in);
    }


    public static SqlSession getSession() {
        return sessionFactory.openSession();

    }
    public static SqlSession getCurrentSession()
    {
        SqlSession session=threadLocal.get();
        if(session==null)
        {
            session=getSession();
            threadLocal.set(session);
        }
        return session;
    }
    public static SqlSession getSession(boolean isAutoCommit) {
        return sessionFactory.openSession(isAutoCommit);
    }

}

这里使用了ThreadLocal,使得Session是线程安全的。

package wangcc.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DateUtil {
    public  static final String Date_DEFAULT_FORMAT="yyyy-MM-dd";
    public static final String DATE_FORMAT_ROUND_MINUTE = "yyyy-MM-dd HH:mm";
    public static final String DATE_FORMAT_ROUND_MINUTE_SECOND = "yyyy-MM-dd HH:mm:ss";
    public static final String DATE_DEFAULT_FORMAT_SLASH = "yyyy-MM-dd";
    public static final String DATE_FORMAT_yyyyMMdd = "yyyyMMdd";
    public static final String DATE_FORMAT_ROUND_MINUTE_SLASH = "yyyy-MM-dd HH:mm";
    public static Date toDate(String sDate,String format) throws ParseException{
        SimpleDateFormat sdf=new SimpleDateFormat(format);
        Date date=sdf.parse(sDate);
        return date;
        }
    public static int getYear(java.util.Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.YEAR);
    }

    /**
     * get the last two numbers of the year
     * 
     * @param date
     *            the date
     * @return the short format year
     */
    public static String getShortYear(java.util.Date date) {
        String year = getYear(date) + "";
        int length = year.length();
        return year.substring(length - 2, length);
    }
    public static void main(String []args)
    {
        Date date=new Date();
        System.out.println(getShortYear(date));
    }
}

``
下面看一下测试类

package wangcc.test;

import java.text.ParseException;
import java.util.Date;
import java.util.GregorianCalendar;

import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import wangcc.entity.User;
import wangcc.util.DateUtil;
import wangcc.util.MyBatisUtil;

public class CRUDXmlMapperTest {
@Test
public void testAdd() {
SqlSession session=null;

    int retResult=0;
    try {
         session = MyBatisUtil.getSession();
            String statement = "wangcc.entity.UserMapper.addUser";
            User user = new User();
            user.setName("durant1");
        user.setBirthday(DateUtil.toDate("1983-02-17", DateUtil.Date_DEFAULT_FORMAT));
        user.setSalary(24000);
        retResult = session.insert(statement, user);
        session.commit();
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }finally{
        session.close();
    }

    // 手动提交事务
    // sqlSession.commit();
    // 使用SqlSession执行完SQL之后需要关闭SqlSession

    System.out.println(retResult);
}
@Test
public void delete(){
    SqlSession session=null;
    int retResult=0;
    try {
        session=MyBatisUtil.getSession();
        String statement="wangcc.entity.UserMapper.delUser";
        retResult=session.delete(statement, 5);
        session.commit();
    } catch (Exception e) {
        // TODO: handle exception
    }finally{
        session.close();
    }
    System.out.println(retResult);

}
@Test
public void query(){
    SqlSession session=null;

    try {
        session=MyBatisUtil.getSession();
        String statement="wangcc.entity.UserMapper.getUser";
        User user=session.selectOne(statement,5);
        System.out.println(user);
        session.commit();
    } catch (Exception e) {
        // TODO: handle exception
    }finally{
        session.close();
    }
}
@Test
public void update(){
    SqlSession session=null;
    int RetResult=0;
    try {
        session=MyBatisUtil.getSession();
        String statement="wangcc.entity.UserMapper.updateUser";
        User user=new User();
        user.setId(7);
        user.setName("paul");
        user.setBirthday(DateUtil.toDate("1987-12-03", DateUtil.Date_DEFAULT_FORMAT));
        user.setSalary(25000);
        RetResult=session.update(statement,user);
        session.commit();
    } catch (Exception e) {
        // TODO: handle exception
    }finally{
        session.close();
    }
    System.out.println(RetResult);
}

}

这个测试类代码对应这xml配置文件方式配置的sql.
通过statement,以及session.insert,delete,select方法结合,完成对数据库sql的调用。
另一种调用sql的方法是session结合Mapper接口

package wangcc.test;

import java.text.ParseException;

import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import wangcc.entity.User;
import wangcc.mapping.UserMapper;
import wangcc.util.DateUtil;
import wangcc.util.MyBatisUtil;

public class CURDByAnnotationMapperTest {
@Test
public void testAdd() {
SqlSession session=null;

    int retResult=0;
    try {
         session = MyBatisUtil.getSession();
         UserMapper mapper=session.getMapper(UserMapper.class);
            User user = new User();
            user.setName("cong");
        user.setBirthday(DateUtil.toDate("1983-02-17", DateUtil.Date_DEFAULT_FORMAT));
        user.setSalary(24000);
        retResult = mapper.add(user);
        session.commit();
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }finally{
        session.close();
    }

    // 手动提交事务
    // sqlSession.commit();
    // 使用SqlSession执行完SQL之后需要关闭SqlSession

    System.out.println(retResult);
}
@Test
public void delete(){
    SqlSession session=null;
    int retResult=0;
    try {
        session=MyBatisUtil.getSession();
        UserMapper mapper=session.getMapper(UserMapper.class);
        retResult=mapper.delete(21);
        session.commit();
    } catch (Exception e) {
        // TODO: handle exception
    }finally{
        session.close();
    }
    System.out.println(retResult);

}
@Test
public void query(){
    SqlSession session=null;

    try {
        session=MyBatisUtil.getSession();
        UserMapper mapper=session.getMapper(UserMapper.class);
        User user=mapper.get(23);
        System.out.println(user);
        session.commit();
    } catch (Exception e) {
        // TODO: handle exception
    }finally{
        session.close();
    }
}
@Test
public void update(){
    SqlSession session=null;
    int RetResult=0;
    try {
        session=MyBatisUtil.getSession();
        UserMapper  mapper=session.getMapper(UserMapper.class);

        User user=new User();
        user.setId(23);
        user.setName("paul");
        user.setBirthday(DateUtil.toDate("1987-12-03", DateUtil.Date_DEFAULT_FORMAT));
        user.setSalary(25000);
        RetResult=mapper.update(user);
        session.commit();
    } catch (Exception e) {
        // TODO: handle exception
    }finally{
        session.close();
    }
    System.out.println(RetResult);
}

}

“`
先获取Sqlsession,然后通过session的getmapper方法获取mapper接口,然后通过mapper接口定义的类实现对sql的调用。这种方式并不一定要求sql必须以注解的方式直接写在接口里,也可以用xml文件配置sql.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值