log4j.properties
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
# File output...
# log4j.appender.stdout=org.apache.log4j.FileAppender
# log4j.appender.stdout.File=log.txt
# log4j.appender.stdout.Append=true
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss} [%p] [%t] - %m%n
mybatis.cfg.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>
<!-- 配置当前数据库环境(信息),default用来指定当前默认的数据库环境 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理器控制事务 -->
<transactionManager type="JDBC" />
<!-- 配置数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis_db" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<!-- 加载sql映射文件 -->
<mappers>
<mapper resource="com/sxt/mapper/EmployeeMapper.xml" />
</mappers>
</configuration>
dao
package com.sxt.dao;
import java.util.List;
import com.sxt.domain.Employee;
public interface EmployeeDao {
//插入
int insert(Employee emp);
//修改
int update(Employee emp);
//删除
int delete(int eid);
//查询单个记录
Employee queryById(int eid);
//全查询
List<Employee> queryAll();
//查询指定性别,且工资大于等于指定参数的员工信息
//List<Employee> queryByCondition(String sex,int salary);
}
dao.impl
package com.sxt.dao.impl;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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 org.apache.log4j.Logger;
import com.sxt.dao.EmployeeDao;
import com.sxt.domain.Employee;
import com.sxt.util.MyBatisUtil;
public class EmployeeDaoImpl implements EmployeeDao {
// 日志器
Logger logger = Logger.getLogger(EmployeeDaoImpl.class);
@Override
public int insert(Employee emp) {
// TODO Auto-generated method stub
// 返回值
int i = 0;
String resource = "mybatis.cfg.xml";
InputStream inputStream = null;
SqlSession session = null;
try {
// 加载主配置文件
inputStream = Resources.getResourceAsStream(resource);
// 创建sqlSessionFactory对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder()
.build(inputStream);
// 获取SqlSession对象,相当于Connection
session = factory.openSession();
// 调用insert()方法,去执行sql映射文件中的sql标签(statement对象)
// 参数1:sql标签即statement的唯一标识,用namespace.sql标签的id
// 参数2:执行sql命令时的输入参数
i = session.insert("com.sxt.mapper.EmpMapper.addEmp", emp);
// 输出日志
logger.info("i=" + i);
// 提交事务
session.commit();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
// 回滚事务
session.rollback();
} finally {
// 关闭sqlSession对象
session.close();
}
return i;
}
@Override
public int update(Employee emp) {
// TODO Auto-generated method stub
// 获取sqlSession对象
SqlSession sqlSession = MyBatisUtil.getSqlSession();
int i = sqlSession.update("com.sxt.mapper.EmpMapper.updateEmp", emp);
// 输出日志
logger.info("i=" + i);
// 提交事务
sqlSession.commit();
// 关闭sqlSession对象
sqlSession.close();
return i;
}
@Override
public int delete(int eid) {
// 获取sqlSession对象
SqlSession sqlSession = MyBatisUtil.getSqlSession();
int i = sqlSession.delete("com.sxt.mapper.EmpMapper.deleteEmp", eid);
// 输出日志
logger.info("i=" + i);
// 提交事务
sqlSession.commit();
// 关闭sqlSession对象
sqlSession.close();
return i;
}
@Override
public Employee queryById(int eid) {
// TODO Auto-generated method stub
// 获取sqlSession对象
SqlSession sqlSession = MyBatisUtil.getSqlSession();
Employee emp = sqlSession.selectOne(
"com.sxt.mapper.EmpMapper.queryEmpById", eid);
// 关闭sqlSession对象
sqlSession.close();
return emp;
}
@Override
public List<Employee> queryAll() {
// TODO Auto-generated method stub
// 获取sqlSession对象
SqlSession sqlSession = MyBatisUtil.getSqlSession();
List<Employee> empList = sqlSession
.selectList("com.sxt.mapper.EmpMapper.queryAll");
// 关闭sqlSession对象
sqlSession.close();
return empList;
}
}
domain
package com.sxt.domain;
/**
* 员工实体类
* @author lujun
*
*/
public class Employee {
private Integer eid;
private String ename;
private String sex;
private Integer salary;
public Integer getEid() {
return eid;
}
public void setEid(Integer eid) {
this.eid = eid;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getSalary() {
return salary;
}
public void setSalary(Integer salary) {
this.salary = salary;
}
@Override
public String toString() {
return "Employee [eid=" + eid + ", ename=" + ename + ", sex=" + sex
+ ", salary=" + salary + "]";
}
}
mapper
<?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="com.sxt.mapper.EmpMapper">
<!--
namespace:sql映射文件的命名空间(唯一),区分不同的sql映射文件
光标停在标签上,content-Model:描述可以有哪些子标签,以及先后顺序,a,b:a在b前面 a|b:a和b没有先后顺序
*:子标签出现0或任意个 +:1个或多个
id:标签的唯一标识,如果是DML/DQL标签,id表示Statement唯一标识
-->
<!-- DML操作标签 insert、update,delete
parameterType:sql命令要绑定的参数类型,必须是全限定名,参数是javaBean对象不能省略parameterType
参数是简单类型(非javaBan对象)时,可以省略parameterType
resultType:sql命令返回的结果类型 ,DML操作可以省略resultType;查询操作不能省略resultType;
如果返回的是对象,则resultType是类的全限定名;如果返回对象的集合,则resultType是集合中元素的类型(全限定名)
useGeneratedKeys:是否使用自动增长的主键
#{xx}:占位符,用于接收传进来的值,如果参数是对象,则xx就是对象中的属性名,mybatis会调用该xx属性对应的getXxx().
如果参数是简单类型的且只有1个参数,则xx可以任意写(符合java命名规范即可)
-->
<insert id="addEmp" parameterType="com.sxt.domain.Employee" useGeneratedKeys="true">
<!-- insert into t_employee(ename,sex,salary) values(#{ename},#{sex},#{salary}) -->
insert into t_employee(ename,sex,salary) values('${ename}','${sex}',${salary})
</insert>
<update id="updateEmp" parameterType="com.sxt.domain.Employee">
update t_employee set ename=#{ename},sex=#{sex},salary=#{salary} where eid=#{eid}
</update>
<delete id="deleteEmp" parameterType="int">
delete from t_employee where eid=#{sid}
</delete>
<select id="queryEmpById" resultType="com.sxt.domain.Employee">
<!-- select * from t_employee where eid=#{sid} -->
select * from t_employee where eid=${value}
</select>
<select id="queryAll" resultType="com.sxt.domain.Employee">
select * from t_employee
</select>
<!-- <select id="queryByCondition" resultType="com.sxt.domain.Employee">
select * from t_employee where sex=#{param1} and salary>=#{salary}
</select> -->
</mapper>
test
package com.sxt.test;
import java.util.List;
import org.junit.Test;
import com.sxt.dao.EmployeeDao;
import com.sxt.dao.impl.EmployeeDaoImpl;
import com.sxt.domain.Employee;
public class MyBatisCrudTest {
@Test
public void test1() {
// 调用Dao中的insert方法
EmployeeDao empDao = new EmployeeDaoImpl();
Employee emp = new Employee();
emp.setEname("周芷若");
emp.setSalary(8000);
emp.setSex("女");
empDao.insert(emp);
}
@Test
public void test2() {
// 调用Dao中的insert方法
EmployeeDao empDao = new EmployeeDaoImpl();
Employee emp = new Employee();
emp.setEid(5);
emp.setEname("杨逍");
emp.setSalary(7500);
emp.setSex("男");
empDao.update(emp);
}
@Test
public void test3() {
// 调用Dao中的delete方法
EmployeeDao empDao = new EmployeeDaoImpl();
Employee emp = new Employee();
empDao.delete(2);
}
@Test
public void test4() {
// 调用Dao中的queryById方法
EmployeeDao empDao = new EmployeeDaoImpl();
Employee emp = empDao.queryById(5);
System.out.println(emp);
}
@Test
public void test5() {
// 调用Dao中的queryAll方法
EmployeeDao empDao = new EmployeeDaoImpl();
List<Employee> emplist = empDao.queryAll();
for (Employee emp : emplist) {
System.out.println(emp);
}
}
/*// 测试传入多个简单参数的查询
@Test
public void test6() {
// 调用Dao中的delete方法
EmployeeDao empDao = new EmployeeDaoImpl();
List<Employee> emplist = empDao.queryByCondition("男", 7500);
for (Employee emp : emplist) {
System.out.println(emp);
}
}*/
}
util
package com.sxt.util;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
* mybatis工具类
*
* @author lujun
*
*/
public class MyBatisUtil {
private static SqlSessionFactory sqlSessionFactory;
static {
String resource = "mybatis.cfg.xml";
InputStream inputStream = null;
// 加载主配置文件
try {
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static SqlSession getSqlSession() {
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}
}