mybatis使用入门及实例

一、基于xml配置文件:

1.在 pom.xml 文件中添加 Mybatis3.4.5 的坐标,如下:

	<dependencies>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.4.5</version>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.10</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.6</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.12</version>
		</dependency>
	</dependencies>

2.编写User实体类

public class User implements Serializable {
		private Integer id;
		private String username;
		private Date birthday;
		private String sex;
		private String address;
		
		//getter  setter  toString
}

3.编写持久层口接口IUserDao

public interface IUserDao {
	/**
	* 查询所有用户
	* @return
	*/
	List<User> findAll();
}

4.编写持久层接口的件映射文件IUserDao.xml

要求:
	创建位置:必须和持久层接口在相同的包中。
	名称:必须以持久层接口名称命名文件名,扩展名是.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="XXX.XXXXX.dao.IUserDao">
	<!-- 配置查询所有操作 -->
	<select id="findAll" resultType="XXX.XXXXX.domain.User">
		select * from user
	</select>
</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>
	<!-- 配置 mybatis 的环境 -->
	<environments default="mysql">
		<!-- 配置 mysql 的环境 -->
		<environment id="mysql">
			<!-- 配置事务的类型 -->
			<transactionManager type="JDBC"></transactionManager>
			<!-- 配置连接数据库的信息:用的是数据源(连接池) -->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql://localhost:3306/ee50"/>
				<property name="username" value="#用户名#"/>
				<property name="password" value="#密码#"/>
			</dataSource>
		</environment>
	</environments>
	<!-- 告知 mybatis 映射配置的位置 -->
	<mappers>
		<mapper resource="XXX/XXXXX/dao/IUserDao.xml"/>
	</mappers>
</configuration>

6.编写测试类

public class MybatisTest {
	public static void main(String[] args)throws Exception {
		//1.读取配置文件
		InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
		//2.创建 SqlSessionFactory 的构建者对象
		SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
		//3.使用构建者创建工厂对象 SqlSessionFactory
		SqlSessionFactory factory = builder.build(in);
		//4.使用 SqlSessionFactory 生产 SqlSession 对象
		SqlSession session = factory.openSession();
		//5.使用 SqlSession 创建 dao 接口的代理对象
		IUserDao userDao = session.getMapper(IUserDao.class);
		//6.使用代理对象执行查询所有方法
		List<User> users = userDao.findAll();
		for(User user : users) {
			System.out.println(user);
		}
		//7.释放资源
		session.close();
		in.close();
	}
}

二、基于注解:

1.在持久层接口中添加注解

public interface IUserDao {
	/**
	* 查询所有用户
	* @return
	*/
	@Select("select * from user")
	List<User> findAll();
}

2.修改SqlMapConfig.xml

<!-- 告知 mybatis 映射配置的位置 -->
<mappers>
	<mapper class="XXX.XXXXX.dao.IUserDao"/>
</mappers>

3.注意:

	在使用基于注解的 Mybatis 配置时,请移除 xml 的映射配置(IUserDao.xml)。

三.基于代理Dao实现CRUD操作

I.使用要求:

	1、持久层接口和持久层接口的映射配置必须在相同的包下
	2、持久层映射配置中 mapper 标签的 namespace 属性取值必须是持久层接口的全限定类名
	3、SQL语句的配置标签<select>,<insert>,<delete>,<update>的 id 属性必须和持久层接口的方法名相同。

II.根据ID查询:

1.在持久层接口加中添加findById

		/**
		* 根据 id 查询
		* @param userId
		* @return
		*/
		User findById(Integer userId);

2.在用户的映射配置文件中配置

		<!-- 根据 id 查询 -->
		<select id="findById" resultType="XXX.XXXXX.domain.User" parameterType="int">
			select * from user where id = #{uid}
		</select>
		△细节:
			resultType  属性:
				用于指定结果集的类型。
			parameterType  属性:			
				用于指定传入参数的类型。
			sql  语句中使用#{} 字符 :
				它代表占位符,相当于原来 jdbc 部分所学的?,都是用于执行语句时替换实际的数据。
				具体的数据是由#{}里面的内容决定的。
			#{} 中内容的写法:
				由于数据类型是基本类型,所以此处可以随意写。

3.在测试类添加测试

		public class MybastisCRUDTest {
		private InputStream in ;
		private SqlSessionFactory factory;
		private SqlSession session;
		private IUserDao userDao;
		@Test
		public void testFindOne() { 
			//6.执行操作
			User user = userDao.findById(41);
			System.out.println(user);
		}
		@Before//在测试方法执行之前执行
		public void init()throws Exception {
			//1.读取配置文件
			in = Resources.getResourceAsStream("SqlMapConfig.xml");
			//2.创建构建者对象
			SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
			//3.创建 SqlSession 工厂对象
			factory = builder.build(in);
			//4.创建 SqlSession 对象
			session = factory.openSession();
			//5.创建 Dao 的代理对象
			userDao = session.getMapper(IUserDao.class);
		}
		@After//在测试方法执行完成之后执行
		public void destroy() throws Exception{
			session.commit();
			//7.释放资源
			session.close();
			in.close();
		}
	}

III.保存操作:

1.在持久层接口中添加新增方法

		/**
		* 保存用户
		* @param user
		* @return 影响数据库记录的行数
		*/
		int saveUser(User user);

2.在用户的映射配置文件中配置

		<!-- 保存用户-->
		<insert id="saveUser" parameterType="XXX.XXXXX.domain.User">
			insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
		</insert>
	△细节:
		ognl 表达式:
			它是 apache 提供的一种表达式语言,全称是:
				Object Graphic Navigation Language 对象图导航语言
			它是按照一定的语法格式来获取数据的。
			语法格式就是使用 #{对象.对象}的方式				
				#{user.username}它会先去找 user 对象,然后在 user 对象中找到 username 属性,并调用getUsername()方法把值取出来。
				但是我们在 parameterType 属性上指定了实体类名称,所以可以省略 user.而直接写 username。

3.添加测试类中的测试方法

		@Test
		public void testSave(){
			User user = new User();
			user.setUsername("modify User property");
			user.setAddress("北京市顺义区");
			user.setSex("男");
			user.setBirthday(new Date());
			System.out.println("保存操作之前:"+user);
			//5.执行保存方法
			userDao.saveUser(user);
			System.out.println("保存操作之后:"+user);
		}

△注意:

		打开 Mysql 数据库发现并没有添加任何记录,原因是什么?
		这一点和 jdbc 是一样的,我们在实现增删改时一定要去控制事务的提交,那么在 mybatis 中如何控制事务提交呢?
		可以使用:session.commit();来实现事务提交。加入事务提交后的代码如下:
		@After//在测试方法执行完成之后执行
		public void destroy() throws Exception{
			session.commit();
			//7.释放资源
			session.close();
			in.close();
		}

4.问题扩展:新增用户id的返回值

		新增用户后,同时还要返回当前新增用户的 id 值,因为 id 是由数据库的自动增长来实现的,所以就相
		当于我们要在新增后将自动增长 auto_increment 的值返回。
		<insert id="saveUser" parameterType="USER">
			<!--  配置保存时获取插入的 id -->
			<selectKey keyColumn="id" keyProperty="id" resultType="int">
				select last_insert_id();
			</selectKey>
			insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
		</insert>

IV.#{} 与${} 的区别

	#{} 表示一个占位符号
		通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换,#{}可以有效防止 sql 注入。 
		#{}可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类型值,#{}括号中可以是 value 或其它名称。
	${} 表示拼接sql串
		通过${}可以将 parameterType 传入的内容拼接在 sql中且不进行 jdbc 类型转换, ${}可以接收
		简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,${}括号中只能是 value。

四.Mybatis 与 JDBC 编程的比较

	1.数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
		解决:
			在 SqlMapConfig.xml 中配置数据链接池,使用连接池管理数据库链接。
	2.Sql 语句写在代码中造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java 代码。
		解决:
			将 Sql 语句配置在 XXXXmapper.xml 文件中与 java 代码分离。
	3.向sql语句传参数麻烦,因为sql语句的where 条件不一定,可能多也可能少,占位符需要和参数对应。
		解决:
			Mybatis自动将 java 对象映射至 sql 语句,通过 statement 中的 parameterType 定义输入参数的类型。
	4.对结果集解析麻烦,sql 变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成 pojo对象解析比较方便。
		解决:
			Mybatis自动将 sql执行结果映射至 java 对象,通过 statement 中的 resultType 定义输出结果的类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值