Mybatis开发dao的方法
SqlSessionFactoryBuilder:通过SqlSessionFactoryBuilder
创建会话工厂SqlSessionFactory
,将SqlSessionFactoryBuilder
当成一个工具类使用即可,不需要使用单例管SqlSessionFactoryBuilder
。
在需要创建SqlSessionFactory
时候,只需要new
一次SqlSessionFactoryBuilder
即可。
SqlSessionFactory:通过SqlSessionFactory
创建SqlSession
,使用单例模式管理SqlSessionFactory
(工厂一旦创建,使用一个实例)。将来Mybatis
和spring
整合后,使用单例模式管理SqlSessionFactory
。
SqlSession:SqlSession是一个面向用户(程序员)的接口。
SqlSession中提供了很多操作数据库的方法:如selectOne(返回单个对象)、selectList(返回单个或多个对象);SqlSession是线程不安全的,在SqlSesion实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性;SqlSession最佳应用场合在方法体内,定义成局部变量使用。
原始dao开发方法(程序员需要写dao接口和dao实现类)。
1、dao接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作量。
2、调用sqlsession方法时将statement的id硬编码了。
3、调用sqlsession方法时传入的变量,由于sqlsession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发。
mapper代理方法(程序员只需要mapper接口(相当 于dao接口))
1. 在mapper.xml中namespace等于mapper接口地址
UserMapper.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">
<!-- namespace命名空间,作用就是对sql进行分类化管理
注意:使用mapper代理方法开发,namespace有特殊重要作用,等于mapper接口地址
-->
<mapper namespace="com.eurasia.mapper.UserMapper">
<!--在映射文件中配置很多sql语句-->
<!--需求:通过id查询用户表的记录-->
<!--通过select执行数据库查询
id:标识映射文件中的sql,将sql语句封装到mappedstatement,
所以将id称为statement的id
#{}表示一个占位符,parameterType指定输入参数的类型
#{id}:其中id表示接收输入的参数,名称叫id,如果输入参数是简单类型,#{}中参数名可以任意
resultType:指定sql输出结果所映射的java对象类型
-->
<select id="findUserById" parameterType="int" resultType="com.eurasia.pojo.User">
SELECT * FROM USER WHERE id = #{id};
</select>
<!--根据名称模糊查询用户信息,可能返回多条
resultType指定单条记录映射的java对象类型
'${}':表示拼接sql串,将接收到的参数内容不加任何修饰拼接在sql中
使用${}易引起sql注入
-->
<select id="findUserByName" parameterType="java.lang.String" resultType="com.eurasia.pojo.User">
SELECT * FROM USER WHERE username LIKE '%${value}%';
</select>
<!--添加用户
parameterType:指定输入参数类型时pojo
#{}中指定pojo的属性名,接收到pojo对象的属性值,Mybatis通过ognl获取对象的属性值
-->
<insert id="insertUser" parameterType="com.eurasia.pojo.User">
/*
*将插入数据的主键返回到User对象中
*SELECT LAST_INSERT_ID():得到刚insert进去记录的主键值,只适用于自增主键值
*keyProperty:将查询到的主键值设置到parameterType指定对象的那个属性
*order: SELECT LAST_INSERT_ID()执行顺序相当于insert语句来说,在insert后才能拿到主键值
*/
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO user(username,birthday,sex,address) VALUE(#{username},#{birthday},#{sex},#{address})
</insert>
<!--删除用户-->
<delete id="deleteUser" parameterType="java.lang.Integer">
DELETE FROM USER WHERE id=#{id};
</delete>
<!--更新用户-->
<update id="updateUser" parameterType="com.eurasia.pojo.User">
UPDATE USER SET username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} WHERE id=#{id}
</update>
</mapper>
2. UserMapper.java
package com.eurasia.mapper;
import com.eurasia.pojo.User;
import java.util.List;
/**
* Created by yvettee on 2017/11/23.
*/
//相当于UserDao
public interface UserMapper {
//根据id查询用户信息
/* mapper.java接口中方法名和mapper.xml中statement的id一致
* mapper.java接口中方法输入参数类型和mapper.xml中statement的parameterType一致
* mapper.java接口中方法返回值类型和mapper.xml中statement的resultType一致
* 只有遵循了这些规范,Mybatis才可以自动生成mapper接口实现类代理对象
*/
public User findUserById(int id) throws Exception;
//根据username查询用户信息
public List<User> findUserByName(String name) throws Exception;
//添加用户信息
public void insertUser(User user) throws Exception;
//删除用户信息
public void deleteUser(int id) throws Exception;
}
3. 在SqlMapConfig.xml中加载mapper.xml
SqlMapConfig.xml中添加红色区域代码4. 测试
package com.eurasia.test;
import com.eurasia.dao.UserDao;
import com.eurasia.dao.impl.UserDaoImpl;
import com.eurasia.mapper.UserMapper;
import com.eurasia.pojo.User;
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.junit.Before;
import org.junit.Test;
import java.io.InputStream;
import java.util.List;
/**
* Created by yvettee on 2017/11/23.
*/
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception {
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindUserById() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//创建UserMapper的对象,Mybatis自动生成mapper代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//调用UserMapper的方法
User user = userMapper.findUserById(38);
sqlSession.close();
System.out.println(user);
}
@Test
public void testFindUserByName() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//创建UserMapper的对象,Mybatis自动生成mapper代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//调用UserDao的方法
List<User> list = userMapper.findUserByName("小明");
sqlSession.close();
System.out.println(list);
}
}
User类和数据库文件在上篇文章中已给出。