Mybatis 学习笔记



Mybatis 学习笔记

1.项目

项目及资料: https://github.com/A-zhe/Learn/tree/master/mybatis.

2.对原生态jdbc程序中问题总结

2.1 jdbc程序

使用jdbc查询mysql数据库中用户表的记录。

创建java工程,加入jar包:

数据库驱动包(mysql5.1)
在这里插入图片描述

2.2 问题总结

1、数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响 数据库性能。
设想:使用数据库连接池管理数据库连接。

2、将sql语句硬编码到java代码中,如果sql 语句修改,需要重新编译java代码,不利于系统维护。
设想:将sql语句配置在xml配置文件中,即使sql变化,不需要对java代码进行重新编译。

3、向preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护。
设想:将sql语句及占位符号和参数全部配置在xml中。

4、从resutSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,,不利于系统维护。
设想:将查询的结果集,自动映射成java对象。

3.mybatis框架

3.1 mybatis是什么?

mybatis是一个持久层的框架,是apache下的顶级项目。
mybatis托管到goolecode下,再后来托管到github下(https://github.com/mybatis/mybatis-3/releases)。

mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成(半自动化,大部分需要程序员编写sql)满足需要sql语句。

mybatis可以将向 preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。(输出映射)

3.2 mybatis框架

在这里插入图片描述

4.入门程序

4.1 需求

根据用户id(主键)查询用户信息
根据用户名称模糊查询用户信息
添加用户
删除 用户
更新用户

4.2 项目目录

在这里插入图片描述

在这里插入图片描述

4.3 log4j.properties

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

4.4 db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
jdbc.username=root
jdbc.password=0000

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

	<!-- 加载属性文件 -->
	<properties resource="db.properties"></properties>
	
	<!-- 别名定义 -->
	<typeAliases>
		<!-- 针对单个别名定义
		type:类型的路径
		alias:别名
		 -->
		<!-- <typeAlias type="po.User" alias="user"></typeAlias> -->
		<!-- 批量别名定义
		指定包名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大小写都可以)(常用)
		 -->
		<package name="po"/>
	</typeAliases>

	<!-- 和spring整合后 environments配置将废除-->
	<environments default="development">
		<environment id="development">
		<!-- 使用jdbc事务管理,事务由mybatis控制-->
			<transactionManager type="JDBC" />
		<!-- 数据库连接池,由mybatis管理-->
			<dataSource type="POOLED">
				<property name="driver" value="${jdbc.driver}" />
				<property name="url" value="${jdbc.url}" />
				<property name="username" value="${jdbc.username}" />
				<property name="password" value="${jdbc.password}" />
			</dataSource>
		</environment>
	</environments>
	
	<!-- 加载映射文件 -->
	<mappers>
		<mapper resource="sqlmap/User.xml"></mapper>
		<mapper resource="mapper/UserMapper.xml"></mapper>
	</mappers>
</configuration>

4.6 根据用户id(主键)查询用户信息

4.6.1 创建po类
public class User {

	private int id;
	private String username;// 用户姓名
	private String sex;// 性别
	private Date birthday;// 生日
	private String address;// 地址
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address="
				+ address + "]";
	}
}
4.6.2 映射文件

映射文件命名:
User.xml(原始ibatis命名),mapper代理开发映射文件名称叫XXXMapper.xml,比如:UserMapper.xml、ItemsMapper.xml
在映射文件中配置sql语句。

<?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进行分类化管理,理解sql隔离
注意:使用mapper代理方法开发,namespace有特殊重要的作用
 -->

<mapper namespace="test">

	<!-- 在映射文件中配置很多sql语句 -->
	<!-- 需求:通过id查询用户表记录 -->
	<!-- 通过select中执行数据库查询
	id:标识映射文件中的sql,
	将sql语句封装到mappedStatement对象中 ,称为statement的id
	parameterType:指定输入参数类型,这里指int型
	#{}表示一个占位符号
	#{id}:其中的id表示接受输入的参数,参数名称就是id,如果输入参数是简单类型,#{}中的参数名可以任意,可以是value或其他名称
	
	resultType:指定sql输出结果的所映射的java对象模型,select指定resultType表示将单条记录映射成java对象。
	 -->
	<select id="findUserById" parameterType="int" resultType="po.User">
		select * from user where id = #{id}
	</select>

	
	<!-- 根据用户名模糊查询用户信息,可能返回多条数据
	resultType:指定就是单挑记录所映射的java对象类型
	${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中
	使用${}拼接sql,引起sql注入
	${value}:接收输入参数的内容,如果传入类型是简单类型,${}中只能使用value
	 -->
	<select id="findUserByName" parameterType="java.lang.String" resultType="po.User">
		select * from user where username like '%${value}%'
	</select>

	
	<!-- 添加用户
	parameterType:指定输入参数类型是pojo(包括用户信息)
	#{}中指定pojo的属性名,接收到pojo对象的属性值,mybaties通过OGNL获取对象的属性值
	 -->
	<insert id="insertUser" parameterType="po.User">
		
		<!-- 
		将插入数据的主键返回,返回到user对象中
		
		select last_insert_id():得到刚insert进去记录的主键值,只适用于自增主键
		
		keyProperty:将查询到主键值设置parameterType指定的对象的哪个属性
		order:select last_insert_id()执行顺序,相对于insert语句来说它的执行顺序
		resultType:指定select last_insert_id()的结果类型
		
		 -->
		<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})
	
		<!-- 非自增主键返回
		使用mysql的uuid()生成主键
		执行过程:
		首先通过uuid()得到主键,将主键设置到user对象的属性中
		其次在insert执行时,从user对象中取出id属性值
	
		<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
			SELECT uuid()
		</selectKey>
		insert into user(id,username,birthday,sex,address) value(#{id},#{username},#{birthday},#{sex},#{address})
	 	-->
	</insert>


	<!-- 删除用户
	根据id删除用户,需要输入id值
	 -->
	<delete id="deleteUser" parameterType="java.lang.Integer">
		delete from user where id=#{id}
	</delete>


	<!-- 根据id更新用户
	分析:
	需要传入用户的id
	需要传入用户的更新信息
	parameterType指定user对象,包括id和更新信息,注意:id必须存在
	#{id}:从输入user对象中获取id属性值
	 -->
	<update id="updateUser" parameterType="po.User">
		update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
	</update>
</mapper>
4.6.3 测试
private SqlSessionFactory sqlSessionFactory;

	// 此方法在执行testFindUserById之前执行
	@Before
	public void setUp() throws Exception {
		// 创建sqlSessionFactory
		// mybaties配置文件
		String resource = "SqlMapConfig.xml";

		// 得到配置文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);

		// 创建会话工厂,传入mybaties的配置文件信息
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}
	@Test
	public void testFindUserById() throws Exception {
		// 创建UserDao对象
		UserDao userDao = new UserDaoIpml(sqlSessionFactory);

		// 调用UserDao方法
		User user = userDao.findUserById(1);
		System.out.println(user);
	}

其他测试见项目资料。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值