- 浏览: 675438 次
- 性别:
- 来自: 安徽
文章分类
- 全部博客 (252)
- Html/Div+CSS (12)
- Js/Jquery (34)
- Flex (2)
- Ajax (3)
- Java (35)
- C# (15)
- Spring (16)
- Hibernate (13)
- Struts2 (12)
- Struts1 (7)
- DWR (1)
- iBatis/myBatis (9)
- Tag(JSTL、EL) (1)
- Android (44)
- SQL (7)
- SEO (7)
- Exception (3)
- Tool (10)
- Other (3)
- WebService (9)
- Apache (7)
- Ext (0)
- Utils (12)
- thinking in programme (2)
- Hadoop (0)
- ActiveMQ (0)
- HTML5/CSS3 (0)
- WPF (1)
- NodeJs (1)
- 设计模式 (0)
- 程序人生 (1)
- 随笔 (1)
- Linux (1)
- Load Balance (0)
最新评论
-
drinkjava2:
太复杂了而且不通用,利用ThreadLocal可完美解决这一问 ...
JDBC的多条件动态查询 -
u013107014:
multipartRequest.getFiles(" ...
多文件上传 by MultipartFile and Multiple -
liyys:
可惜没讲你mysql数据库的表的设计
iBatis入门 -
Mapple_leave:
效果还是挺不错的,谢谢了。
中文简体与繁体的转换 -
arcpad:
JS禁用浏览器退格键
在前面简单学习了iBatis ,因为项目中使用了MyBatis ,所以给了一个机会能够实战中总结总结MyBatis 。
首先我门简单了解一下什么是MyBatis 。 MyBatis 是支持普通SQL 查询,存储过程和高级映射的优秀持久层框架,MyBatis 消除了几乎所有的JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的XML 或注解用于配置和原始映射,将接口和Java 的POJOs 映射成数据库中的记录。
从事Java 开发在接触常用的J2EE 框架时,都应该知道这些框架都需要提供一个全局配置文件,用于指定程序正常运行所需要的设置和参数信息。而针对常用的持久层框架而言(Hibernate 、JPA 、MyBatis|iBatis 等),则通常需要配置两类文件:一类用于指定数据源、事务属性以及其他一些参数配置信息(通常是一个独立的文件,全局配置文件);另一类则用于指定数据库表与程序实体之间的映射信息(可能不止一个哦,映射文件)。
首先我们以一个CURD 的操作来进行说明
每一个MyBatis 的应用程序都是以一个SqlSessionFactory 对象的实例为核心,SqlSessionFactory 对 象 的 实 例 可 以 通 过 SqlSessionFactoryBuilder 对 象 来 获 得 。 SqlSessionFactoryBuilder 对象可以从 XML 配置文件, 或从 Configuration 类的习惯准备的实例中构建 SqlSessionFactory 对象(通过Java 类的方式大家可以查阅一下官方的文档)。这里我们建议使用XML 的形式。
这里我们可以写一个工具类,专门是为了获取SqlSessionFactory 对象,MyBatisUtil.java
package com.iflytek.util; import java.io.IOException; import java.io.Reader; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; /** * @author xdwang * * @ceate 2012-12-10 下午6:30:53 * * @description MyBatis帮助类,获取SqlSessionFactory * */ public class MyBatisUtil { private static SqlSessionFactory factory; private MyBatisUtil() { } static { Reader reader = null; try { reader = Resources.getResourceAsReader("com/iflytek/resources/mybatis-config.xml"); // InputStream inputStream = // Resources.getResourceAsStream("com/iflytek/resources/mybatis-config.xml"); // factory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { throw new RuntimeException(e.getMessage()); } factory = new SqlSessionFactoryBuilder().build(reader); } /** * @descrption 获取SqlSessionFactory对象 * @author xdwang * @create 2012-12-10下午6:32:24 * @return 返回SqlSessionFactory对象 */ public static SqlSessionFactory getSqlSessionFactory() { return factory; } }
上面指定的资源
mybatis-config.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"> <!-- version: $Id$ --> <configuration> <!-- 引用JDBC属性的配置文件 --> <properties resource="database.properties" /> <settings> <!-- 允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值),数据表的PK生成策略将被覆盖 --> <setting name="useGeneratedKeys" value="true" /> <setting name="defaultExecutorType" value="REUSE" /> </settings> <environments default="development"> <environment id="development"> <!-- 使用JDBC的事务管理 --> <transactionManager type="JDBC" /> <!-- POOLED :JDBC连接对象的数据源连接池的实现,不直接支持第三方数据库连接池 --> <dataSource type="POOLED"> <property name="driver" value="${database.driver}" /> <property name="url" value="${database.url}" /> <property name="username" value="${database.username}" /> <property name="password" value="${database.password}" /> </dataSource> </environment> </environments> <!-- ORM映射文件 --> <mappers> <!-- 注解的方式 --> <mapper class="com.iflytek.dao.mapper.BlogMapper" /> <!-- XML的方式 --> <mapper resource="com/iflytek/dao/xml/StudentMapper.xml" /> <!-- 这里对于注解,还可以通过<package name="com.iflytek.dao.mapper"/> --> </mappers> </configuration>
这里先简单列举重要的节点,后面再详细描述
database.properties
database.driver=com.mysql.jdbc.Driver database.url=jdbc:mysql://localhost:3306/ibatis database.username=root database.password=123
下面我们有了SqlSessionFactory对象,可以通过SqlSessionFactory构造SqlSession,再通过SqlSession获取不同实体对应的Mapper接口,最后通过Mapper接口中定义的方法进行相关的数据操作。
对于Mapper接口的定义,有两种方式,一是通过XML的方式,二是通过注解的方式。
一、XML方式(这里的Model、Mapper、XML是通过generator自动生成的)
Student.java
package com.iflytek.dao.model; import java.text.MessageFormat; import java.util.Date; public class Student { private Integer id; private String name; private Date birth; private Float score; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name == null ? null : name.trim(); } public Date getBirth() { return birth; } public void setBirth(Date birth) { this.birth = birth; } public Float getScore() { return score; } public void setScore(Float score) { this.score = score; } @Override public String toString() { return MessageFormat.format("id:{0},姓名:{1},出生日期:{2},分数:{3}", id, name, birth, score); } }
StudentExample.java
package com.iflytek.dao.model; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; public class StudentExample { protected String orderByClause; protected boolean distinct; protected List<Criteria> oredCriteria; public StudentExample() { oredCriteria = new ArrayList<Criteria>(); } public void setOrderByClause(String orderByClause) { this.orderByClause = orderByClause; } public String getOrderByClause() { return orderByClause; } public void setDistinct(boolean distinct) { this.distinct = distinct; } public boolean isDistinct() { return distinct; } public List<Criteria> getOredCriteria() { return oredCriteria; } public void or(Criteria criteria) { oredCriteria.add(criteria); } public Criteria or() { Criteria criteria = createCriteriaInternal(); oredCriteria.add(criteria); return criteria; } public Criteria createCriteria() { Criteria criteria = createCriteriaInternal(); if (oredCriteria.size() == 0) { oredCriteria.add(criteria); } return criteria; } protected Criteria createCriteriaInternal() { Criteria criteria = new Criteria(); return criteria; } public void clear() { oredCriteria.clear(); orderByClause = null; distinct = false; } protected abstract static class GeneratedCriteria { protected List<Criterion> criteria; protected GeneratedCriteria() { super(); criteria = new ArrayList<Criterion>(); } public boolean isValid() { return criteria.size() > 0; } public List<Criterion> getAllCriteria() { return criteria; } public List<Criterion> getCriteria() { return criteria; } protected void addCriterion(String condition) { if (condition == null) { throw new RuntimeException("Value for condition cannot be null"); } criteria.add(new Criterion(condition)); } protected void addCriterion(String condition, Object value, String property) { if (value == null) { throw new RuntimeException("Value for " + property + " cannot be null"); } criteria.add(new Criterion(condition, value)); } protected void addCriterion(String condition, Object value1, Object value2, String property) { if (value1 == null || value2 == null) { throw new RuntimeException("Between values for " + property + " cannot be null"); } criteria.add(new Criterion(condition, value1, value2)); } protected void addCriterionForJDBCDate(String condition, Date value, String property) { if (value == null) { throw new RuntimeException("Value for " + property + " cannot be null"); } addCriterion(condition, new java.sql.Date(value.getTime()), property); } protected void addCriterionForJDBCDate(String condition, List<Date> values, String property) { if (values == null || values.size() == 0) { throw new RuntimeException("Value list for " + property + " cannot be null or empty"); } List<java.sql.Date> dateList = new ArrayList<java.sql.Date>(); Iterator<Date> iter = values.iterator(); while (iter.hasNext()) { dateList.add(new java.sql.Date(iter.next().getTime())); } addCriterion(condition, dateList, property); } protected void addCriterionForJDBCDate(String condition, Date value1, Date value2, String property) { if (value1 == null || value2 == null) { throw new RuntimeException("Between values for " + property + " cannot be null"); } addCriterion(condition, new java.sql.Date(value1.getTime()), new java.sql.Date(value2.getTime()), property); } public Criteria andIdIsNull() { addCriterion("id is null"); return (Criteria) this; } public Criteria andIdIsNotNull() { addCriterion("id is not null"); return (Criteria) this; } public Criteria andIdEqualTo(Integer value) { addCriterion("id =", value, "id"); return (Criteria) this; } public Criteria andIdNotEqualTo(Integer value) { addCriterion("id <>", value, "id"); return (Criteria) this; } public Criteria andIdGreaterThan(Integer value) { addCriterion("id >", value, "id"); return (Criteria) this; } public Criteria andIdGreaterThanOrEqualTo(Integer value) { addCriterion("id >=", value, "id"); return (Criteria) this; } public Criteria andIdLessThan(Integer value) { addCriterion("id <", value, "id"); return (Criteria) this; } public Criteria andIdLessThanOrEqualTo(Integer value) { addCriterion("id <=", value, "id"); return (Criteria) this; } public Criteria andIdIn(List<Integer> values) { addCriterion("id in", values, "id"); return (Criteria) this; } public Criteria andIdNotIn(List<Integer> values) { addCriterion("id not in", values, "id"); return (Criteria) this; } public Criteria andIdBetween(Integer value1, Integer value2) { addCriterion("id between", value1, value2, "id"); return (Criteria) this; } public Criteria andIdNotBetween(Integer value1, Integer value2) { addCriterion("id not between", value1, value2, "id"); return (Criteria) this; } public Criteria andNameIsNull() { addCriterion("name is null"); return (Criteria) this; } public Criteria andNameIsNotNull() { addCriterion("name is not null"); return (Criteria) this; } public Criteria andNameEqualTo(String value) { addCriterion("name =", value, "name"); return (Criteria) this; } public Criteria andNameNotEqualTo(String value) { addCriterion("name <>", value, "name"); return (Criteria) this; } public Criteria andNameGreaterThan(String value) { addCriterion("name >", value, "name"); return (Criteria) this; } public Criteria andNameGreaterThanOrEqualTo(String value) { addCriterion("name >=", value, "name"); return (Criteria) this; } public Criteria andNameLessThan(String value) { addCriterion("name <", value, "name"); return (Criteria) this; } public Criteria andNameLessThanOrEqualTo(String value) { addCriterion("name <=", value, "name"); return (Criteria) this; } public Criteria andNameLike(String value) { addCriterion("name like", value, "name"); return (Criteria) this; } public Criteria andNameNotLike(String value) { addCriterion("name not like", value, "name"); return (Criteria) this; } public Criteria andNameIn(List<String> values) { addCriterion("name in", values, "name"); return (Criteria) this; } public Criteria andNameNotIn(List<String> values) { addCriterion("name not in", values, "name"); return (Criteria) this; } public Criteria andNameBetween(String value1, String value2) { addCriterion("name between", value1, value2, "name"); return (Criteria) this; } public Criteria andNameNotBetween(String value1, String value2) { addCriterion("name not between", value1, value2, "name"); return (Criteria) this; } public Criteria andBirthIsNull() { addCriterion("birth is null"); return (Criteria) this; } public Criteria andBirthIsNotNull() { addCriterion("birth is not null"); return (Criteria) this; } public Criteria andBirthEqualTo(Date value) { addCriterionForJDBCDate("birth =", value, "birth"); return (Criteria) this; } public Criteria andBirthNotEqualTo(Date value) { addCriterionForJDBCDate("birth <>", value, "birth"); return (Criteria) this; } public Criteria andBirthGreaterThan(Date value) { addCriterionForJDBCDate("birth >", value, "birth"); return (Criteria) this; } public Criteria andBirthGreaterThanOrEqualTo(Date value) { addCriterionForJDBCDate("birth >=", value, "birth"); return (Criteria) this; } public Criteria andBirthLessThan(Date value) { addCriterionForJDBCDate("birth <", value, "birth"); return (Criteria) this; } public Criteria andBirthLessThanOrEqualTo(Date value) { addCriterionForJDBCDate("birth <=", value, "birth"); return (Criteria) this; } public Criteria andBirthIn(List<Date> values) { addCriterionForJDBCDate("birth in", values, "birth"); return (Criteria) this; } public Criteria andBirthNotIn(List<Date> values) { addCriterionForJDBCDate("birth not in", values, "birth"); return (Criteria) this; } public Criteria andBirthBetween(Date value1, Date value2) { addCriterionForJDBCDate("birth between", value1, value2, "birth"); return (Criteria) this; } public Criteria andBirthNotBetween(Date value1, Date value2) { addCriterionForJDBCDate("birth not between", value1, value2, "birth"); return (Criteria) this; } public Criteria andScoreIsNull() { addCriterion("score is null"); return (Criteria) this; } public Criteria andScoreIsNotNull() { addCriterion("score is not null"); return (Criteria) this; } public Criteria andScoreEqualTo(Float value) { addCriterion("score =", value, "score"); return (Criteria) this; } public Criteria andScoreNotEqualTo(Float value) { addCriterion("score <>", value, "score"); return (Criteria) this; } public Criteria andScoreGreaterThan(Float value) { addCriterion("score >", value, "score"); return (Criteria) this; } public Criteria andScoreGreaterThanOrEqualTo(Float value) { addCriterion("score >=", value, "score"); return (Criteria) this; } public Criteria andScoreLessThan(Float value) { addCriterion("score <", value, "score"); return (Criteria) this; } public Criteria andScoreLessThanOrEqualTo(Float value) { addCriterion("score <=", value, "score"); return (Criteria) this; } public Criteria andScoreIn(List<Float> values) { addCriterion("score in", values, "score"); return (Criteria) this; } public Criteria andScoreNotIn(List<Float> values) { addCriterion("score not in", values, "score"); return (Criteria) this; } public Criteria andScoreBetween(Float value1, Float value2) { addCriterion("score between", value1, value2, "score"); return (Criteria) this; } public Criteria andScoreNotBetween(Float value1, Float value2) { addCriterion("score not between", value1, value2, "score"); return (Criteria) this; } } public static class Criteria extends GeneratedCriteria { protected Criteria() { super(); } } public static class Criterion { private String condition; private Object value; private Object secondValue; private boolean noValue; private boolean singleValue; private boolean betweenValue; private boolean listValue; private String typeHandler; public String getCondition() { return condition; } public Object getValue() { return value; } public Object getSecondValue() { return secondValue; } public boolean isNoValue() { return noValue; } public boolean isSingleValue() { return singleValue; } public boolean isBetweenValue() { return betweenValue; } public boolean isListValue() { return listValue; } public String getTypeHandler() { return typeHandler; } protected Criterion(String condition) { super(); this.condition = condition; this.typeHandler = null; this.noValue = true; } protected Criterion(String condition, Object value, String typeHandler) { super(); this.condition = condition; this.value = value; this.typeHandler = typeHandler; if (value instanceof List<?>) { this.listValue = true; } else { this.singleValue = true; } } protected Criterion(String condition, Object value) { this(condition, value, null); } protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { super(); this.condition = condition; this.value = value; this.secondValue = secondValue; this.typeHandler = typeHandler; this.betweenValue = true; } protected Criterion(String condition, Object value, Object secondValue) { this(condition, value, secondValue, null); } } }
StudentMapper.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" > <mapper namespace="com.iflytek.dao.mapper.StudentMapper" > <resultMap id="BaseResultMap" type="com.iflytek.dao.model.Student" > <id column="id" property="id" jdbcType="INTEGER" /> <result column="name" property="name" jdbcType="VARCHAR" /> <result column="birth" property="birth" jdbcType="DATE" /> <result column="score" property="score" jdbcType="REAL" /> </resultMap> <sql id="Example_Where_Clause" > <where > <foreach collection="oredCriteria" item="criteria" separator="or" > <if test="criteria.valid" > <trim prefix="(" suffix=")" prefixOverrides="and" > <foreach collection="criteria.criteria" item="criterion" > <choose > <when test="criterion.noValue" > and ${criterion.condition} </when> <when test="criterion.singleValue" > and ${criterion.condition} #{criterion.value} </when> <when test="criterion.betweenValue" > and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} </when> <when test="criterion.listValue" > and ${criterion.condition} <foreach collection="criterion.value" item="listItem" open="(" close=")" separator="," > #{listItem} </foreach> </when> </choose> </foreach> </trim> </if> </foreach> </where> </sql> <sql id="Update_By_Example_Where_Clause" > <where > <foreach collection="example.oredCriteria" item="criteria" separator="or" > <if test="criteria.valid" > <trim prefix="(" suffix=")" prefixOverrides="and" > <foreach collection="criteria.criteria" item="criterion" > <choose > <when test="criterion.noValue" > and ${criterion.condition} </when> <when test="criterion.singleValue" > and ${criterion.condition} #{criterion.value} </when> <when test="criterion.betweenValue" > and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} </when> <when test="criterion.listValue" > and ${criterion.condition} <foreach collection="criterion.value" item="listItem" open="(" close=")" separator="," > #{listItem} </foreach> </when> </choose> </foreach> </trim> </if> </foreach> </where> </sql> <sql id="Base_Column_List" > id, name, birth, score </sql> <select id="selectByExample" resultMap="BaseResultMap" parameterType="com.iflytek.dao.model.StudentExample" > select <if test="distinct" > distinct </if> <include refid="Base_Column_List" /> from tbl_student <if test="_parameter != null" > <include refid="Example_Where_Clause" /> </if> <if test="orderByClause != null" > order by ${orderByClause} </if> </select> <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" > select <include refid="Base_Column_List" /> from tbl_student where id = #{id,jdbcType=INTEGER} </select> <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" > delete from tbl_student where id = #{id,jdbcType=INTEGER} </delete> <delete id="deleteByExample" parameterType="com.iflytek.dao.model.StudentExample" > delete from tbl_student <if test="_parameter != null" > <include refid="Example_Where_Clause" /> </if> </delete> <insert id="insert" parameterType="com.iflytek.dao.model.Student" > <selectKey resultType="java.lang.Integer" keyProperty="id" order="AFTER" > SELECT LAST_INSERT_ID() </selectKey> insert into tbl_student (name, birth, score) values (#{name,jdbcType=VARCHAR}, #{birth,jdbcType=DATE}, #{score,jdbcType=REAL}) </insert> <insert id="insertSelective" parameterType="com.iflytek.dao.model.Student" > <selectKey resultType="java.lang.Integer" keyProperty="id" order="AFTER" > SELECT LAST_INSERT_ID() </selectKey> insert into tbl_student <trim prefix="(" suffix=")" suffixOverrides="," > <if test="name != null" > name, </if> <if test="birth != null" > birth, </if> <if test="score != null" > score, </if> </trim> <trim prefix="values (" suffix=")" suffixOverrides="," > <if test="name != null" > #{name,jdbcType=VARCHAR}, </if> <if test="birth != null" > #{birth,jdbcType=DATE}, </if> <if test="score != null" > #{score,jdbcType=REAL}, </if> </trim> </insert> <select id="countByExample" parameterType="com.iflytek.dao.model.StudentExample" resultType="java.lang.Integer" > select count(*) from tbl_student <if test="_parameter != null" > <include refid="Example_Where_Clause" /> </if> </select> <update id="updateByExampleSelective" parameterType="map" > update tbl_student <set > <if test="record.id != null" > id = #{record.id,jdbcType=INTEGER}, </if> <if test="record.name != null" > name = #{record.name,jdbcType=VARCHAR}, </if> <if test="record.birth != null" > birth = #{record.birth,jdbcType=DATE}, </if> <if test="record.score != null" > score = #{record.score,jdbcType=REAL}, </if> </set> <if test="_parameter != null" > <include refid="Update_By_Example_Where_Clause" /> </if> </update> <update id="updateByExample" parameterType="map" > update tbl_student set id = #{record.id,jdbcType=INTEGER}, name = #{record.name,jdbcType=VARCHAR}, birth = #{record.birth,jdbcType=DATE}, score = #{record.score,jdbcType=REAL} <if test="_parameter != null" > <include refid="Update_By_Example_Where_Clause" /> </if> </update> <update id="updateByPrimaryKeySelective" parameterType="com.iflytek.dao.model.Student" > update tbl_student <set > <if test="name != null" > name = #{name,jdbcType=VARCHAR}, </if> <if test="birth != null" > birth = #{birth,jdbcType=DATE}, </if> <if test="score != null" > score = #{score,jdbcType=REAL}, </if> </set> where id = #{id,jdbcType=INTEGER} </update> <update id="updateByPrimaryKey" parameterType="com.iflytek.dao.model.Student" > update tbl_student set name = #{name,jdbcType=VARCHAR}, birth = #{birth,jdbcType=DATE}, score = #{score,jdbcType=REAL} where id = #{id,jdbcType=INTEGER} </update> </mapper>
StudentMapper.java
package com.iflytek.dao.mapper; import com.iflytek.dao.model.Student; import com.iflytek.dao.model.StudentExample; import java.util.List; import org.apache.ibatis.annotations.Param; public interface StudentMapper { int countByExample(StudentExample example); int deleteByExample(StudentExample example); int deleteByPrimaryKey(Integer id); int insert(Student record); int insertSelective(Student record); List<Student> selectByExample(StudentExample example); Student selectByPrimaryKey(Integer id); int updateByExampleSelective(@Param("record") Student record, @Param("example") StudentExample example); int updateByExample(@Param("record") Student record, @Param("example") StudentExample example); int updateByPrimaryKeySelective(Student record); int updateByPrimaryKey(Student record); }
StudentService.java
package com.iflytek.service; import java.util.List; import org.apache.ibatis.session.SqlSession; import com.iflytek.dao.mapper.StudentMapper; import com.iflytek.dao.model.Student; import com.iflytek.dao.model.StudentExample; import com.iflytek.util.MyBatisUtil; /** * * @author xdwang * * @ceate 2012-12-10 下午6:33:26 * * @description 业务逻辑层,Mapper和XML是通过generator自动生成的 * */ public class StudentService { /** * @descrption 添加 * @author xdwang * @create 2012-12-10下午6:42:48 * @param student * 学生实体 * @return 是否成功 */ public boolean insertStudent(Student student) { boolean flag = false; SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class); int result = studentMapper.insert(student); if (result > 0) { flag = true; } sqlSession.commit(); } finally { sqlSession.close(); } return flag; } /** * @descrption 根据学生id获取学生实体信息 * @author xdwang * @create 2012-12-10下午6:46:09 * @param studentId * 学生id * @return 学生实体信息 */ public Student getStudentById(int studentId) { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { StudentMapper StudentMapper = sqlSession.getMapper(StudentMapper.class); return StudentMapper.selectByPrimaryKey(studentId); } finally { sqlSession.close(); } } /** * @descrption 获取所有学生信息集合 * @author xdwang * @create 2012-12-10下午6:46:55 * @return 学生集合 */ public List<Student> getAllStudents() { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { StudentMapper StudentMapper = sqlSession.getMapper(StudentMapper.class); return StudentMapper.selectByExample(new StudentExample()); } finally { sqlSession.close(); } } /** * @descrption 更新学生信息 * @author xdwang * @create 2012-12-10下午6:47:13 * @param Student * 学生实体信息 * @return 更新成功与否 */ public boolean updateStudent(Student Student) { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); boolean flag = false; try { StudentMapper StudentMapper = sqlSession.getMapper(StudentMapper.class); int result = StudentMapper.updateByPrimaryKey(Student); if (result > 0) { flag = true; } sqlSession.commit(); } finally { sqlSession.close(); } return flag; } /** * @descrption 根据学生id删除学生信息 * @author xdwang * @create 2012-12-10下午6:49:05 * @param studentId * 学生id * @return 删除成功与否 */ public boolean deleteStudent(int studentId) { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); boolean flag = false; try { StudentMapper StudentMapper = sqlSession.getMapper(StudentMapper.class); int result = StudentMapper.deleteByPrimaryKey(studentId); if (result > 0) { flag = true; } sqlSession.commit(); } finally { sqlSession.close(); } return flag; } }
StudentServiceTest.java
package com.iflytek.test; import java.util.Date; import java.util.List; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import com.iflytek.dao.model.Student; import com.iflytek.service.StudentService; /** * @author xdwang * * @ceate 2012-12-10 下午7:02:08 * * @description 测试业务逻辑 * */ public class StudentServiceTest { private static StudentService studentService; @BeforeClass public static void setup() { studentService = new StudentService(); } @AfterClass public static void teardown() { studentService = null; } @Test public void testInsertStudent() { Student student = new Student(); student.setName("xwang"); student.setBirth(new Date()); student.setScore((float) 99.5); System.out.println(studentService.insertStudent(student)); } @Test public void testGetStudentById() { Student student = studentService.getStudentById(1); Assert.assertNotNull(student); System.out.println(student); } @Test public void testGetAllStudents() { List<Student> students = studentService.getAllStudents(); Assert.assertNotNull(students); for (Student student : students) { System.out.println(student); } } @Test public void testUpdateStudent() { Student student = studentService.getStudentById(1); student.setName("xdwang03"); System.out.println(studentService.deleteStudent(1)); } @Test public void testDeleteStudent() { System.out.println(studentService.deleteStudent(1)); } }
二、注解
Blog.java
package com.iflytek.dao.model; import java.text.MessageFormat; import java.util.Date; /** * @author xdwang * * @ceate 2012-12-10 下午7:29:08 * * @description 博客实体类,手动创建 * */ public class Blog { private Integer blogId; private String blogName; private Date createdOn; public Integer getBlogId() { return blogId; } public void setBlogId(Integer blogId) { this.blogId = blogId; } public String getBlogName() { return blogName; } public void setBlogName(String blogName) { this.blogName = blogName; } public Date getCreatedOn() { return createdOn; } public void setCreatedOn(Date createdOn) { this.createdOn = createdOn; } @Override public String toString() { return MessageFormat.format("Blog [blogId={0}, blogName={1}, createdOn={2}]", blogId, blogName, createdOn); } }
BlogMapper.java
package com.iflytek.dao.mapper; import java.util.List; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Options; import org.apache.ibatis.annotations.Result; import org.apache.ibatis.annotations.Results; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; import com.iflytek.dao.model.Blog; /** * @author xdwang * * @ceate 2012-12-10 下午7:30:44 * * @description 数据访问层接口,手动添加,基于注解的模式 */ public interface BlogMapper { @Insert("INSERT INTO BLOG(BLOG_NAME, CREATED_ON) VALUES(#{blogName}, #{createdOn})") @Options(useGeneratedKeys = true, keyProperty = "blogId") public void insertBlog(Blog blog); @Select("SELECT BLOG_ID AS blogId, BLOG_NAME as blogName, CREATED_ON as createdOn FROM BLOG WHERE BLOG_ID=#{blogId}") public Blog getBlogById(Integer blogId); @Select("SELECT * FROM BLOG ") @Results({ @Result(id = true, property = "blogId", column = "BLOG_ID"), @Result(property = "blogName", column = "BLOG_NAME"), @Result(property = "createdOn", column = "CREATED_ON") }) public List<Blog> getAllBlogs(); @Update("UPDATE BLOG SET BLOG_NAME=#{blogName}, CREATED_ON=#{createdOn} WHERE BLOG_ID=#{blogId}") public void updateBlog(Blog blog); @Delete("DELETE FROM BLOG WHERE BLOG_ID=#{blogId}") public void deleteBlog(Integer blogId); }
BlogService.java
package com.iflytek.service; import java.util.List; import org.apache.ibatis.session.SqlSession; import com.iflytek.dao.mapper.BlogMapper; import com.iflytek.dao.model.Blog; import com.iflytek.util.MyBatisUtil; /** * @author xdwang * * @ceate 2012-12-10 下午7:39:34 * * @description 博客业务逻辑层,调用注解的接口实现 * */ public class BlogService { public void insertBlog(Blog blog) { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); //使用注解的时候一定要将XXXMapper注册一下,跟XML配置namespace一样 //MyBatisUtil.getSqlSessionFactory().getConfiguration().addMapper(BlogMapper.class); try { BlogMapper blogMapper = sqlSession.getMapper(BlogMapper.class); blogMapper.insertBlog(blog); sqlSession.commit(); } finally { sqlSession.close(); } } public Blog getBlogById(Integer blogId) { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { BlogMapper blogMapper = sqlSession.getMapper(BlogMapper.class); return blogMapper.getBlogById(blogId); } finally { sqlSession.close(); } } public List<Blog> getAllBlogs() { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { BlogMapper blogMapper = sqlSession.getMapper(BlogMapper.class); return blogMapper.getAllBlogs(); } finally { sqlSession.close(); } } public void updateBlog(Blog blog) { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { BlogMapper blogMapper = sqlSession.getMapper(BlogMapper.class); blogMapper.updateBlog(blog); sqlSession.commit(); } finally { sqlSession.close(); } } public void deleteBlog(Integer blogId) { SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(); try { BlogMapper blogMapper = sqlSession.getMapper(BlogMapper.class); blogMapper.deleteBlog(blogId); sqlSession.commit(); } finally { sqlSession.close(); } } }
BlogServiceTest.java
package com.iflytek.test; import java.util.Date; import java.util.List; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import com.iflytek.dao.model.Blog; import com.iflytek.service.BlogService; /** * @author xdwang * * @ceate 2012-12-10 下午7:42:41 * * @description 基于注解的CRUD 测试 * */ public class BlogServiceTest { private static BlogService blogService; @BeforeClass public static void setUp() throws Exception { blogService = new BlogService(); } @AfterClass public static void tearDown() throws Exception { blogService = null; } @Test public void testInsertBlog() { Blog blog = new Blog(); blog.setBlogName("test_blog_" + System.currentTimeMillis()); blog.setCreatedOn(new Date()); blogService.insertBlog(blog); Assert.assertTrue(blog.getBlogId() != 0); Blog createdBlog = blogService.getBlogById(blog.getBlogId()); Assert.assertNotNull(createdBlog); Assert.assertEquals(blog.getBlogName(), createdBlog.getBlogName()); } @Test public void testGetBlogById() { Blog blog = blogService.getBlogById(1); Assert.assertNotNull(blog); System.out.println(blog); } @Test public void testGetAllBlogs() { List<Blog> blogs = blogService.getAllBlogs(); Assert.assertNotNull(blogs); for (Blog blog : blogs) { System.out.println(blog); } } @Test public void testUpdateBlog() { long timestamp = System.currentTimeMillis(); Blog blog = blogService.getBlogById(2); blog.setBlogName("TestBlogName" + timestamp); blogService.updateBlog(blog); Blog updatedBlog = blogService.getBlogById(2); Assert.assertEquals(blog.getBlogName(), updatedBlog.getBlogName()); } @Test public void testDeleteBlog() { Blog blog = blogService.getBlogById(4); blogService.deleteBlog(blog.getBlogId()); Blog deletedBlog = blogService.getBlogById(4); Assert.assertNull(deletedBlog); } }
对于简单语句来说,使用注解代码会更加清晰,然后Java 注解对于复杂语句来说就会混乱, 应该限制使用。 因此, 如果你不得不做复杂的事情, 那么最好使用 XML 来映射语句。
几个重要的范围和生命周期
1 、 SqlSessionFactoryBuilder
这个类可以被实例化使用和丢弃。一旦你创建了SqlSessionFactory 后, 这个类就不需要存在了。 因此 SqlSessionFactoryBuilder 实例的最佳范围是方法范围 ( 也就是本地方法变量) 。你可以重用 SqlSessionFactoryBuilder 来创建多个SqlSessionFactory 实例, 但是最好的方式是不需要保持它一直存在来保证所有 XML 解析资源, 因为还有更重要的事情要做。
2 、 SqlSessionFactory
一旦被创建 ,SqlSessionFactory 应该在你的应用执行期间都存在。没有理由来处理或重新创建它。使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次。这样的 操作将被视为是非常糟糕的。因此 SqlSessionFactory 的最佳范围是应用范围。有很多方法可以做到 , 最简单的就是使用单例模式或者静态单例模式。
3 、 SqlSession
每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不能被共享, 也是线程 不安全的。因此最佳的范围是请求或方法范围。绝对不能将 SqlSession 实例的引用放在一个类的静态字段甚至是实例字段中。也绝不能将SqlSession 实例的引用放在任何类型的管理范围中, 比如Serlvet 架构中的 HttpSession 。 如果你现在正用任意的Web 框架, 要考虑 SqlSession 放在一个和 HTTP 请求对象相似的范围内。换句话说, 基于收到的HTTP 请求, 你可以打开了一个 SqlSession, 然后返回响应, 就可以关闭它了。关闭 Session 很重要, 你应该确保使用 finally 块来关闭它。下面的示例就是一个确保 SqlSession 关闭的基本模式:
SqlSession session = sqlSessionFactory.openSession(); try { // do work } finally { session.close(); }
在你的代码中一贯地使用这种模式, 将会保证所有数据库资源都正确地关闭 ( 假设你没 有通过你自己的连接关闭, 这会给 MyBatis 造成一种迹象表明你要自己管理连接资源) 。
4 、Mapper 实例
映射器是你创建绑定映射语句的接口。映射器接口的实例可以从 SqlSession 中获得。那 么从技术上来说, 当被请求时, 任意映射器实例的最宽范围和 SqlSession 是相同的。然而, 映射器实例的最佳范围是方法范围。也就是说, 它们应该在使用它们的方法中被请求, 然后 就抛弃掉。它们不需要明确地关闭, 那么在请求对象中保留它们也就不是什么问题了, 这和 SqlSession 相似。你也许会发现, 在这个水平上管理太多的资源的话会失控。保持简单, 将 映射器放在方法范围内。
发表评论
-
MyBatis 批量操作、添加日志显示、MyBatis与iBatis区别
2012-12-24 08:38 2729MyBatis 中的批量 ... -
MyBatis 通用分页
2012-12-20 08:33 18487分页分为真分页和假分页,而 MyBatis 本身没 ... -
MyBatis动态SQL
2012-12-18 19:02 3109MyBatis 另一个强大 ... -
MyBatis Mapper XML 文件 01
2012-12-18 08:34 3358前面说了 MyBati ... -
MyBatis Mapper XML 文件 02
2012-12-19 08:33 2026高级结果映射 下面我们来看看官方文档上 ... -
MyBatis XML 映射配置文件
2012-12-14 08:41 3257在前面说了MyBatis 入门 ,了解了开发的基本 ... -
Generator自动生成mybatis配置和类信息(MBG )
2012-12-12 08:27 7312我们在进行 MyBatis 开发时,可以使用 My ... -
iBatis入门
2012-01-01 08:58 33425iBatis 简介: iBatis 是apa ...
相关推荐
这篇“MyBatis入门到精通”的学习资料是针对初学者设计的,旨在帮助新手快速掌握MyBatis的基本用法和高级特性。 1. **MyBatis简介** MyBatis是由Clinton Begin创建的开源项目,它是一个基于Java的持久层框架,消除...
Mybatis入门
mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例mybatis入门案例...
MyBatis入门 MyBatis是一个优秀的持久层框架,使用XML将SQL与程序解耦,便于维护。MyBatis学习简单,执行高效,是JDBC的延伸。MyBatis提供了数据库增删改查的便捷操作,极大提高了开发效率、统一的编码规则、利于...
【标题】"mybatis入门程序"是一个针对初学者的教程,旨在引导他们进入SSM(Spring、SpringMVC和MyBatis)框架的学习。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射,极大地简化了Java开发...
【MyBatis 入门教程】 MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使你更好地将注意力集中在你的...
### MyBatis 入门知识点概述 #### 一、MyBatis 概念与特点 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis...
综上所述,"mybatis入门实例" 包含了 MyBatis 的核心概念和基本使用方法,通过对单表的 CRUD 操作,帮助初学者快速理解和掌握 MyBatis 的工作原理和实践技巧。在这个实例中,你可以看到从配置到实际操作的全过程,...
这个入门例子是针对初次接触 MyBatis 的学习者设计的,旨在通过简单的步骤和清晰的配置,帮助他们快速理解 MyBatis 的基本工作原理和核心特性。数据库环境选择了 Oracle,Oracle 是一款功能强大且广泛使用的商业级...
在这个"Mybatis入门JavaSE案例"中,我们将深入理解Mybatis的基本配置、DAO层的注解方式以及XML配置方式。 首先,让我们来了解Mybatis的配置过程。Mybatis的配置文件(mybatis-config.xml)是整个框架的入口,它包含...
这个"MyBatis入门程序"是为初学者设计的,旨在帮助他们快速理解并开始使用MyBatis。在这个程序中,我们将探讨几个关键知识点,包括MyBatis的基本架构、配置、映射文件以及如何连接MySQL数据库。 1. **MyBatis基本...
【标题】"第一个mybatis程序 mybatis入门" 涉及到的是MyBatis框架的基础使用,这是一个轻量级的Java持久层框架,它简化了与数据库交互的过程,提供了强大的映射功能。以下是对MyBatis入门的详细解析: 1. **MyBatis...
本入门程序旨在帮助初学者掌握Mybatis的基本使用,包括如何进行数据库的增删改查操作。下面我们将深入探讨这个主题。 首先,我们来了解Mybatis的核心概念: 1. **SqlSessionFactory**: 这是Mybatis的主要入口点,...
【标题】"mybatis入门项目代码"涉及到的是MyBatis框架的基础使用教程,这是一个轻量级的持久层框架,用于简化Java开发中的数据库操作。MyBatis允许开发者编写SQL语句,将数据库查询与应用程序逻辑紧密地结合起来,...
在本入门示例项目中,我们将深入理解MyBatis的基本使用方法,包括数据库交互、映射文件配置、配置文件加载、Junit测试以及日志记录。 1. 数据库SQL语句:MyBatis的核心功能之一就是将Java对象与数据库中的SQL语句...
在"mybatis入门实战之一"中,我们将深入探讨MyBatis的基础知识,包括它的安装配置、基本用法以及如何进行简单的增删改查操作。这个实战教程特别适合初学者,因为它涵盖了开发过程中常用的工具如log日志记录和Maven...
4. Mybatis的基础知识:Mybatis入门需要掌握一些基础的知识,包括配置文件的编写、Java接口的定义、SQL语句的编写等。其中,配置文件主要包括数据库连接信息、SQL语句等。 5. Mybatis与Hibernate的比较:Hibernate...
MyBatis是一款强大的Java持久层框架,它实现了SQL与Java代码的解耦,极大地提高了开发效率。本资源包是专为初学者至进阶者设计的一套完整的MyBatis学习资料,旨在帮助开发者全面理解并掌握MyBatis的核心概念和技术。...
### Mybatis框架入门知识点详解 #### 一、框架与Mybatis概述 1. **框架定义**: - **广义定义**:框架是一种系统性的、可重用的设计方案,表现为一组抽象组件及其交互方法。 - **狭义定义**:框架是可由应用...
本资源集合是针对MyBatis入门学习者设计的,涵盖了MyBatis的基本概念、核心功能以及实际应用。 首先,我们需要了解MyBatis的基本概念。MyBatis是一个基于Java的持久层框架,它提供了灵活的SQL映射机制,将SQL语句与...