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 定义输出结果的类型。
Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随与我联系,我会及为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随与我联系,我会及解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值