首先,我们来看如何配置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.