
1 mybatis框架介绍
1.1回顾jdbc操作数据库的过程
1.2 mybatis开发步骤
A.提供一个SqlMapperConfig.xml(src目录下),该文件主要配置数据库连接,事务,二级缓存。
B.提供一个XxxMapper.xml(DeptMapper.xml),放入和DeptDao同一个包中。
Sql语句
Sql语句占位符的值
Sql语句执行后需要返回的结果类型
C.使用mybatis提供的API操作数据库。
Mybatis完成对jdbc的封装,将操作数据过程需要的参数,封装到xml文件中,做到了可变的参数和不可变的代码的之间的解耦合,提高数据库开的效率。
2 Mybatis对数据的CRUD
2.1新建项目加入jar包
2.2建立Mybatis的主配置文件
必须放入src目录(classpath)
MyBatis.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>
<properties resource="db.properties"></properties>
<environments default="deptEnv">
<environment id="deptEnv">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/guangsoft/mapper/DeptMapper.xml" />
</mappers>
</configuration>
db.properties
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/test
username = root
password =root
2.3建立部门的实体类
package org.guangsoft.entity; public class Dept
{
private Integer did;
private String dname;
public Integer getDid()
{
return did;
}
public void setDid(Integer did)
{
this.did = did;
}
public String getDname()
{
return dname;
}
public void setDname(String dname)
{
this.dname = dname;
} }
2.4建立DeptMapper接口
package org.guangsoft.mapper; import java.util.List; import org.guangsoft.entity.Dept; public interface DeptMapper
{
public void saveDept(Dept dept);
public void deleteDept(Integer did);
public void updateDept(Dept dept);
public Dept getDeptById(Integer did);
public List<Dept> getAllDepts();
public Integer getDeptCount();
}
2.5建立DeptMapperImpl实现类
使用Mybatis的API完成数据库添加
package org.guangsoft.mapper.impl; import java.util.List; import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.guangsoft.entity.Dept;
import org.guangsoft.mapper.DeptMapper; public class DeptMapperImpl implements DeptMapper
{ @Override
public void saveDept(Dept dept)
{
//创建sqlSessionFactory对象
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
SqlSessionFactory ssf = ssfb.build(DeptMapperImpl.class.
getClassLoader().getResourceAsStream("MyBatis.xml"));
//产生SqlSesion兑现
SqlSession sqlSession = ssf.openSession();
//进行数据的crud操作
sqlSession.insert("dept.saveDept",dept);
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
} @Override
public void deleteDept(Integer did)
{
//创建sqlSessionFactory对象
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
SqlSessionFactory ssf = ssfb.build(DeptMapperImpl.class.
getClassLoader().getResourceAsStream("MyBatis.xml"));
//产生SqlSesion兑现
SqlSession sqlSession = ssf.openSession();
//进行数据的crud操作
int rows = sqlSession.delete("dept.deleteDept",did);
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
} @Override
public void updateDept(Dept dept)
{
//创建sqlSessionFactory对象
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
SqlSessionFactory ssf = ssfb.build(DeptMapperImpl.class.
getClassLoader().getResourceAsStream("MyBatis.xml"));
//产生SqlSesion兑现
SqlSession sqlSession = ssf.openSession();
//进行数据的crud操作
int rows = sqlSession.update("dept.updateDept",dept);
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
} @Override
public Dept getDeptById(Integer did)
{
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
SqlSessionFactory ssf = ssfb.build(DeptMapperImpl.class.getClassLoader().getResourceAsStream("MyBatis.xml"));
//获取数据库会话
SqlSession session = ssf.openSession();
//进行数据库查询操作
Dept dept = session.selectOne("dept.getDeptById",did);
//释放资源
session.close();
return dept;
} @Override
public List<Dept> getAllDepts()
{
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
SqlSessionFactory ssf = ssfb.build(DeptMapperImpl.class.getClassLoader().getResourceAsStream("MyBatis.xml"));
//获取数据库会话
SqlSession session = ssf.openSession();
//进行数据库查询操作
List<Dept> deptList = session.selectList("dept.getAllDepts");
//释放资源
session.close();
return deptList;
} @Override
public Integer getDeptCount()
{
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
SqlSessionFactory ssf = ssfb.build(DeptMapperImpl.class.getClassLoader().getResourceAsStream("MyBatis.xml"));
//获取数据库会话
SqlSession session = ssf.openSession();
//进行数据库查询操作
int count = session.selectOne("dept.getDeptCount");
//释放资源
session.close();
return count;
} }
2.6建立映DeptMapper.xml射文件
和Mapper接口放入同一个包,而且和Mapper接口的名字一样。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dept">
<insert id="saveDept" parameterType="org.guangsoft.entity.Dept">
insert into dept(did,dname) values (null,#{dname})
<selectKey keyColumn="did" keyProperty="did" resultType="java.lang.Integer">
<!-- 获得增加的记录的id -->
select last_insert_id()
</selectKey>
</insert>
<delete id="deleteDept" parameterType="java.lang.Integer">
delete from dept where did = #{did};
</delete>
<update id="updateDept" parameterType="org.guangsoft.entity.Dept">
update dept set dname = #{dname} where did=#{did}
</update>
<select id="getDeptById" parameterType="java.lang.Integer"
resultType="org.guangsoft.entity.Dept">
select * from dept where did = #{did}
</select>
<select id="getAllDepts" resultType="org.guangsoft.entity.Dept">
select * from dept
</select>
<select id="getDeptCount" resultType="java.lang.Integer">
select count(*) from dept
</select>
</mapper>
2.7建立数据库表
新建数据库,新建表:
/*
Navicat MySQL Data Transfer Source Server : MySQL
Source Server Version : 50715
Source Host : localhost:3306
Source Database : test Target Server Type : MYSQL
Target Server Version : 50715
File Encoding : 65001 Date: 2016-12-13 20:23:19
*/ SET FOREIGN_KEY_CHECKS=0; -- ----------------------------
-- Table structure for dept
-- ----------------------------
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (
`did` int(11) NOT NULL AUTO_INCREMENT,
`dname` varchar(255) DEFAULT NULL,
PRIMARY KEY (`did`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
2.8建立测试类
package org.guangsoft.test; import java.util.List; import org.guangsoft.entity.Dept;
import org.guangsoft.mapper.DeptMapper;
import org.guangsoft.mapper.impl.DeptMapperImpl;
import org.junit.Test; public class TestDeptMapper
{
DeptMapper deptMapper = new DeptMapperImpl(); @Test
public void testSaveDept()
{
Dept dept = new Dept();
dept.setDname("sssssdfs");
deptMapper.saveDept(dept);
System.out.println(dept.getDid());
} @Test
public void testDeleteDept()
{
deptMapper.deleteDept(3);
} @Test
public void testUpdateDept()
{
Dept dept = new Dept();
dept.setDid(2);
dept.setDname("update");
deptMapper.updateDept(dept);
} @Test
public void testGetDeptById()
{
Dept dept = deptMapper.getDeptById(2);
System.out.println(dept.getDname());
} @Test
public void testGetAllDepts()
{
List<Dept> deptList = deptMapper.getAllDepts();
for(Dept dept : deptList)
{
System.out.println(dept.getDname());
}
} @Test
public void testGetDeptCount()
{
Integer count = deptMapper.getDeptCount();
System.out.println(count);
}
}
2.9添加日志文件
在src目录下建立,log4j.properties
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
总结:mybatis框架通过加载配置文件产生一个statement对象,而该对象的引用是通过namespace.id
3 数据选择的Mapper.xml配置参数
3.1 通过添加部门信息学习xml文件中的占位符
3.1.1#{xxx}占位符
相当于jdbc中sql语句预编译.(产生PreparedStatement对象),解决了sql注入的问题,提高安全性。
如果传入的参数为javabean对象占位符#{xxx},
xxx为javabean对象属性对应的get方法
如果为复合的javabean(A.B),
xxx为javabean对象属性链(b.x),相应属性都对应get方法
如果传入的参数为简单类(String,Integer)
xxx为任意值,保持和传入参数名称一样
3.1.2${xxx}占位符
相当于jdbc中的sql语句通过拼接产生(产生Statement对象),存在sql注入的问题
如果传入的参数为javabean对象占位符#{xxx},
xxx为javabean对象属性对应的get方法
如果为复合的javabean(A.B),
xxx为javabean对象属性链(b.x),相应属性都对应get方法
如果传入的参数为简单类(String,Integer)
xxx只能写value