原始Dao的简单开发实例

1.原始dao
2.Mapper接口开发
SqlSession使用范围
SqlSession中封裝了对数据库的操作,如查询,插入,更新,删除
通过SQLSessionFactory创建SQLSession,而SQLSession使通过SQLSessionFactoryBuilder进行创建
1.SqlSessionFactoryBuild 作为一个工具类 只用new一次就行 创建会话工厂SQLSessionFactory
2.SqlSessionFactory 创建SQLSession,使用单例模式管理SQLSessionFactory(工厂一旦创建,使用一个实例)
3.SqlSession操作数据库方法 线程不安全 不能共享使用(最佳适用场合在方法体内,定义成局部变量使用)
执行过程如下
1.加载数据源等配置信息
	Environment environment = configuration.getEnvironment();
2.创建数据库链接
3.创建事务对象
4.创建Executor,SQLSession所有操作都是通过都是通过Executor完成
原始dao的开发 (程序员需要写dao接口和dao实现)

eg

1.dao层接口方法
public interface UserDao {
	//根据id查找用户	
	public User findUserById(int id) throws Exception;
	
	public List<User> findUserByName(String name) throws Exception;

	public void insertUser(User user) throws Exception;
	
	public void deleteUser(int id) throws Exception;

}
2.接口实现类
public class UserDaoImpl implements UserDao {
	
	private SqlSessionFactory sqlSessionFactory;
	
	//通过构造方法,从外部传入SqlSessionFactory对象
	public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
		this.sqlSessionFactory = sqlSessionFactory;
	}//创建构造

	@Override
	public User findUserById(int id) throws Exception {
		// TODO Auto-generated method stub
		
		//得到sqlSession
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		User user =  sqlSession.selectOne("test.findUserById",id);
		
		sqlSession.close();//关闭资源
		
		return user;
	}

	@Override
	public List<User> findUserByName(String name) throws Exception {
		// TODO Auto-generated method stub
		
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		List<User> list = sqlSession.selectList("test.findUserByName", name);
		
		sqlSession.close();
		
		return null;
	}

	@Override
	public void insertUser(User user) throws Exception {
		// TODO Auto-generated method stub
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		sqlSession.insert("test.insertUser", user);
		
		sqlSession.commit();//提交事务
		
		sqlSession.close();
		
	}

	@Override
	public void deleteUser(int id) throws Exception {
		// TODO Auto-generated method stub
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		sqlSession.insert("test.deleteUser", id);
		
		sqlSession.commit();//提交事务
		
		sqlSession.close();
	}

}
3.映射文件信息Users.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="test"><!-- 命名空间namespace -->
	<!-- 映射文件信息
		id:映射sql的一个表示
		parameterType 输入参数的类型 int
		#{}表示一个占位符,简单类型里面的参数名任意
		
		resultType sql输出结果映射的对象类型
	 -->
	<select id="findUserById" parameterType="int" resultType="cn.mybatis.po.User">
		select * from user where id=#{value}
	</select>
	
	<!-- 模糊检索 -->
	<!-- ${} 拼接sql串 但是有可能引起sql注入
		${value} 接收输入参数的内容 如果是简单类型 ${} 只能用value
	 -->
	<select id="findUserByName" parameterType="java.lang.String" resultType="cn.mybatis.po.User">
		select * from user where username like '%${value}%'
	</select>
	<!-- 模糊检索使用#{}方式 -->
	<select id="findUserByName1" parameterType="java.lang.String" resultType="cn.mybatis.po.User">
		select * from user where username like "%"#{value}"%"
	</select>
	
	<!-- 添加用户
		parameterType输入参数类型 pojo
		#{}中指定的属性名
	 -->
	<insert id="insertUser" parameterType="cn.mybatis.po.User">
		<!-- 
			主键自增
			将插入数据的主键 返回到user对象里 
			keyProperty将查询到的主键值设置到parameterType指定的那个属性中(这里是id中)
			order: select last_insert_id()执行顺序 相对与insert之后-->
		<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
			select last_insert_id()
		</selectKey>
		insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
	</insert>
	
	<insert id="insertUserByUuid" parameterType="cn.mybatis.po.User2">
		<!--
			插入自动生成主键 
			将插入数据的主键 返回到user对象里 
			keyProperty将查询到的主键值设置到parameterType指定的那个属性中
			order: select last_insert_id()执行顺序 相对与insert之前-->
		<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
			select uuid()
		</selectKey>
		insert into user_copy(id,username,birthday,sex,address) values(#{id},#{username},#{birthday},#{sex},#{address})
	</insert>
	
	<!-- 使用oracle 用序列当主键 
	<insert id="insertUser" parameterType="cn.mybatis.po.User">
		<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.Integer">
			select 序列名nextval()
		</selectKey>
		insert into user(id,username,birthday,sex,address) values(#{id},#{username},#{birthday},#{sex},#{address})
	</insert>-->
	
	<!-- 删除用户 -->
	<delete id="deleteUser" parameterType="java.lang.Integer">
		delete from user where id = #{id}
	</delete>
	
	<!-- 修改 -->
	<update id="updateUser" parameterType="cn.mybatis.po.User">
		update user set username = #{username},birthday = #{birthday},sex = #{sex},address = #{address}
		where id = #{id}
	</update>
</mapper>
5.全局配置文件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>
<!-- 配置数据源 和事务信息 -->
	<environments default="development">
		<environment id="development">
		<!-- 事务管理器 使用jdbc事务 -->
			<transactionManager type="JDBC"></transactionManager>
		<!-- 连接数据池 -->
			<dataSource type="POOLED">
			<!-- 属性 -->
				<property name="driver" value="com.mysql.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql://localhost:3306/mybatis0202?characterEncoding=utf-8"/>
				<property name="username" value="root"/>
				<property name="password" value="zzj6660534"/>
			</dataSource>
		</environment>
	</environments>
	
	<mappers>
		<!-- 加载映射文件 -->
		<mapper resource="sqlmap/Users.xml"/>
	</mappers>
</configuration>
5.测试类
public class UserDaoImplTest {
	
	private SqlSessionFactory sqlSessionFactory;
	
	@Before//每次执行Test之前都会执行before
	public void setUp() throws Exception{
		
		//配置文件
		String resource = "SqlMapConfig.xml";
		//得到文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);
		//创建会话工厂
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		
	}
	
	@Test
	public void testFindById() throws Exception{
		//创建实例对象
		UserDao userDao = new UserDaoImpl(sqlSessionFactory);
		//调用UserDao方法
		User user = userDao.findUserById(1);
		
		System.out.println(user);
	}
	
	@Test
	public void testInsertUser() throws Exception{
		//创建实例对象
		UserDao userDao = new UserDaoImpl(sqlSessionFactory);
		
		User user = new User();
		user.setUsername("tom");
		user.setSex("1");
		user.setBirthday(new Date());
		user.setAddress("天津");
		//调用UserDao方法
		userDao.insertUser(user);
		
		System.out.println(user);
	}

	@Test
	public void testDeleteUser() throws Exception{
		//创建实例对象
		UserDao userDao = new UserDaoImpl(sqlSessionFactory);
		
		userDao.deleteUser(32);
	}
}
原始DAO开发问题
1.存在大量模板方法,设想能否将这些代码提取出来
2.调用sqlsession方法时将1statement的id硬编码了
3.调用SQLSession方法时传入的变量,由于sqlsession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值