Mybatis基础学习(二)—开发Dao方式

一、原始Dao开发方式

UserDao.java

public interface UserDao{

	public User findUserByID(Serializable id);

	public List<User> findUsersByName(String name);
}

UserDaoImpl.java

public class UserDaoImpl implements UserDao{

	//SqlSessionFactory是单例存在,不应该在具体实例中创建,需要外部依赖注入
	private SqlSessionFactory sqlSessionFactory;

	public UserDaoImpl(SqlSessionFactory sqlSessionFactory){
		this.sqlSessionFactory = sqlSessionFactory;
	}

	@Override
	public User findUserByID(Serializable id){

		SqlSession sqlSession = sqlSessionFactory.openSession();
		User user = sqlSession.selectOne("test.findUserById",id);
		sqlSession.close();
		return user;
	}

	@Override
	public List<User> findUsersByName(String name){

		SqlSession sqlSession = sqlSessionFactory.openSession();
		List<User> list = sqlSession.selectList("test.findUserByName",name);
		sqlSession.close();
		return list;
	}

}

Test.java

public class UserDaoTest{

	private SqlSessionFactory sqlSessionFactory;
	private UserDao userDao;

	{
		String resource = "SqlMapConfig.xml";
		InputStream is;
		try{
			is = Resources.getResourceAsStream(resource);
			SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
			sqlSessionFactory = builder.build(is);
			userDao = new UserDaoImpl(sqlSessionFactory);
		}catch(IOException e){
			e.printStackTrace();
		}

	}

	@Test
	public void testFindUserByID(){

		User user = userDao.findUserByID(27);
		System.out.println(user);
	}

	@Test
	public void testFindUsersByName(){

		List<User> list = userDao.findUsersByName("小明");
		for(User user : list){
			System.out.println(user);
		}
	}

}

原始dao开发存在一些问题:

(1)存在一定量的模板代码

     比如: 通过SqlSessionFactory创建SqlSession;调用SqlSession的方法操作数据库;关闭Sqlsession。

(2)存在一些硬编码

     调用SqlSession的方法操作数据库时,需要指定statement的id,这里存在了硬编码。

 

二、Mapper代理开发方式

     Mapper代理的开发方式,程序员只需要编写mapper接口(相当于dao接口)即可。Mybatis会自动的为mapper接口生成动态代理实现类。不过要实现mapper代理的开发方式,需要遵循一些开发规范。

(1)mapper接口的全限定名要和mapper映射文件的namespace的值相同。

(2)mapper接口的方法名称要和mapper映射文件中的statement的id相同。

(3)mapper接口的方法参数只能有一个,且类型要和mapper映射文件中statement的parameterType的值保持一致。

(4)mapper接口的返回值类型要和mapper映射文件中statement的resultType值或resultMap中的type值保持一致。

 

Mapper.java

public interface UserMapper{

	public User findUserById(int id);

	public void saveUser(User user);
}

 

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:此时用mapper代理方式,它的值必须等于对应mapper接口的全限定名  -->
<mapper namespace="com.kiwi.mapper.UserMapper">

    <!-- 根据ID查询一个用户 -->
    <select id="findUserById" parameterType="int" resultType="com.kiwi.domain.User">
        SELECT * FROM USER WHERE id = #{id}
    </select>

    <!-- 根据名字模糊查询 -->
    <select id="findUserByName" parameterType="java.lang.String" resultType="com.kiwi.domain.User">
        SELECT * FROM USER WHERE username LIKE ‘%${value}%‘
    </select>

    <!-- 添加一个用户,并返回插入的ID -->
    <insert id="saveUser" parameterType="com.kiwi.domain.User">
        <selectKey keyProperty="id" resultType="int" order="AFTER">
             SELECT LAST_INSERT_ID()
        </selectKey>
        INSERT INTO USER (username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
    </insert>

    <!-- 删除一个用户 -->
    <delete id="deleteUser" parameterType="int">
        DELETE FROM USER WHERE id = #{id}
    </delete>

    <!-- 修改一个用户 -->
    <update id="updateUser" parameterType="com.kiwi.domain.User">
        UPDATE USER SET username = #{username},address = #{address} WHERE id = #{id}
    </update>

</mapper>

 

SqlMapConfig.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>

    <!-- 配置mybatis的环境信息,与spring整合之后,该部分将由spring管理 -->
    <environments default="development">
        <environment id="development">
            <!-- 配置JDBC事务控制,由mybatis进行管理 -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 配置数据源,采用dbcp连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf8" />
                <property name="username" value="root" />
                <property name="password" value="123456" />
            </dataSource>
        </environment>
    </environments>

    <!-- 加载Mapper -->
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>

</configuration>

 

Test.java

	private SqlSessionFactory sqlSessionFactory;

	@Before
	public void setUp() throws Exception{
		InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}

	@Test
	public void testFindUserById(){

		SqlSession sqlSession = sqlSessionFactory.openSession();

		UserMapper mapper = sqlSession.getMapper(UserMapper.class);
		User user = mapper.findUserById(26);
		System.out.println(user);

		sqlSession.close();
	}

	@Test
	public void testSaveUser(){

		SqlSession sqlSession = sqlSessionFactory.openSession();

		UserMapper mapper = sqlSession.getMapper(UserMapper.class);
		User user = new User("WWW","1",new Date(),"北京市海淀区");
		mapper.saveUser(user);
		System.out.println(user);

		sqlSession.commit();
		sqlSession.close();
	}

}

 

三、全局配置

1.properties

 

2.typeAliases

     类别名,只能对PO类进行类型别名的定义。


别名


映射的类型


_byte


byte


_long


long


_short


short


_int


int


_integer


int


_double


double


_float


float


_boolean


boolean


string


String


byte


Byte


long


Long


short


Short


int


Integer


integer


Integer


double


Double


float


Float


boolean


Boolean


date


Date


decimal


BigDecimal


bigdecimal


BigDecimal

 

时间: 07-01

Mybatis基础学习(二)—开发Dao方式的相关文章

SpringMVC基础学习(二)&mdash;开发Handler

一.Handler开发         Handler的开发方式在springmvc中有多种,下面我们主要讲解三种实现方式:实现Controller接口.实现HttpRequestHandler接口.使用注解.   1.实现HttoRequestHandler接口 ItemsController1.java /* * Handler开发方式1: 实现HttpRequestHandler接口 */ public class ItemsController1 implements HttpReque

mybatis基础学习二

操作users表的CRUD XML实现方式 定义sql映射xml文件 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"> <m

零基础学习IOS开发(二)- 使用cocos2d-x3.0 执行Hello world

关于开发框架,依据网上检索来的信息,感觉cocos2d-x的ios游戏开发框架非常不错,并且有非常强的可移植性,因此打算尝试一下. 截止写下此文章,最新的cocos2d-x的版本号为v3.0稳定版(几天前刚刚公布),下载地址为:http://www.cocos2d-x.org/filedown/cocos2d-x-3.0-cn 安装方式例如以下: 1.解压程序压缩包(所在路径不能有中文哦,由于是python,你懂的...) 2.sudo python setup.py 安装cocos2d-x,依

puppet基础学习(二)

puppet基础学习(二) 六.ResourceOrdering(资源定序) 使用变化参数before , require , notify , subscribe catalog是对一个给定的系统的所有资源及关系的编译,在编译catalog时,除非我们指定资源的执行顺序,不然puppet是以其自己的顺序管理,大多数时候puppet指定适当的方式,例如puppet管理用户gigabyte应该存在和文件夹/home/gigabyte/bin应该存在并属于用户gigabyte时,puppet会自动指

【零基础学习iOS开发】【01-前言】01-开篇

本文目录 一.什么是iOS 二.主流手机操作系统 三.什么是iOS开发 四.学习iOS开发的目的 五.学习iOS开发的前提 从今天开始,我就开始更新[零基础学习iOS开发]这个专题.不管你是否涉足过IT领域,也不管你是理科生还是文科生,只要你对iOS开发感兴趣,都可以来阅读此专题.我尽量以通俗易懂的语言,让每个人都能够看懂.若遇到不明白的地方或者对此文有异议,望及时评论. 回到顶部 一.什么是iOS 要想学习iOS开发,首先要搞清楚什么是iOS.iOS其实是一款操作系统,就像平时我们在电脑上用的

mybatis基础(二)

上接mybatis基础(二) 开发规范: 1.在mapper.xml中namespace等于mapper接口地址 2.mapper.java接口中的方法名和mapper.xml中statement的id一致 3.mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致. 4.mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致. 9.properties

【零基础学习iOS开发】【转载】

原文地址:http://www.cnblogs.com/mjios/archive/2013/04/24/3039357.html 本文目录 一.什么是iOS 二.主流手机操作系统 三.什么是iOS开发 四.学习iOS开发的目的 五.学习iOS开发的前提 从今天开始,我就开始更新[零基础学习iOS开发]这个专题.不管你是否涉足过IT领域,也不管你是理科生还是文科生,只要你对iOS开发感兴趣,都可以来阅读此专题.我尽量以通俗易懂的语言,让每个人都能够看懂.若遇到不明白的地方或者对此文有异议,望及时

李洪强iOS开发之【零基础学习iOS开发】【01-前言】01-开篇

从今天开始,我就开始更新[零基础学习iOS开发]这个专题.不管你是否涉足过IT领域,也不管你是理科生还是文科生,只要你对iOS开发感兴趣,都可以来阅读此专题.我尽量以通俗易懂的语言,让每个人都能够看懂.若遇到不明白的地方或者对此文有异议,望及时评论. 一.什么是iOS 要想学习iOS开发,首先要搞清楚什么是iOS.iOS其实是一款操作系统,就像平时我们在电脑上用的XP.Win7,都是操作系统. 那什么是操作系统呢?操作系统其实是一种软件,是直接运行在硬件(电脑.手机等)上的最基本的系统软件,任何

[原]零基础学习SDL开发之移植SDL2.0到Android

在[原]SDL开发教程我们知道了如何在pc下使用SDL进行开发,在android上面是否一样可以使用呢?答案是肯定的. 下面我们进行移植SDL到Android,这里都是基于SDL最新版进行移植的,在Eclipse中编译. 开发环境:Ubuntu 14.04 64位,Eclipse + CDT + ADT,NDK 一.到官网下载http://www.libsdl.org/hg.php 下载2.0的源码也可以通过hg来clone最新的源码 hg clone http://hg.libsdl.org/