Mybatis-入门程序(二)

接着上一篇文章《Mybatis入门(一)》我们继续来讲解一下《Mybatis的入门程序(二)》,废话不多说进入正题

【需求】

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

2、根据用户名称模糊查询用户信息

3、添加用户

4、删除 用户

5、更新用户

【环境】

java环境:jdk1.7.0_72

eclipseindigo

mysql5.1

mybatis运行环境(jar包):

从https://github.com/mybatis/mybatis-3/releases下载,3.2.7版本,解压之后有下图的文件



log4j.properties

# Global logging configuration
#在开发环境下日志级别要设置成DEBUG,生产环境设置成info或error
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

【工程结构】


     SQLMap是存储mapper.xml文件

SqlMapConfig.xml (全局配置文件)】

配置mybatis的运行环境,数据源、事务等。


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

1、创建po类


2、映射文件

映射文件命名:

User.xml(原始ibatis命名),mapper代理开发映射文件名称叫XXXMapper.xml,比如:UserMapper.xmlItemsMapper.xml

在映射文件中配置sql语句。


3、在SqlMapConfig.xml加载映射文件

sqlMapConfig.xml中加载User.xml:


4、程序编写

// 根据id查询用户信息,得到一条记录结果
	@Test
	public void findUserByIdTest() throws IOException {

		// mybatis配置文件
		String resource = "SqlMapConfig.xml";
		// 得到配置文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);

		// 创建会话工厂,传入mybatis的配置文件信息
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
				.build(inputStream);

		// 通过工厂得到SqlSession
		SqlSession sqlSession = sqlSessionFactory.openSession();

		// 通过SqlSession操作数据库
		// 第一个参数:映射文件中statement的id,等于=namespace+"."+statement的id
		// 第二个参数:指定和映射文件中所匹配的parameterType类型的参数
		// sqlSession.selectOne结果 是与映射文件中所匹配的resultType类型的对象
		// selectOne查询出一条记录
		User user = sqlSession.selectOne("test.findUserById", 1);

		System.out.println(user);

		// 释放资源
		sqlSession.close();

	}

【根据用户名称模糊查询用户信息】

1、映射文件

使用User.xml,添加根据用户名称模糊查询用户信息的sql语句。

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

2、程序代码

// 根据用户名称模糊查询用户列表
	@Test
	public void findUserByNameTest() throws IOException {
		// mybatis配置文件
		String resource = "SqlMapConfig.xml";
		// 得到配置文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);

		// 创建会话工厂,传入mybatis的配置文件信息
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
				.build(inputStream);

		// 通过工厂得到SqlSession
		SqlSession sqlSession = sqlSessionFactory.openSession();
		// list中的user和映射文件中resultType所指定的类型一致
		List<User> list = sqlSession.selectOne("test.findUserByName", "小明");
		System.out.println(list);
		sqlSession.close();

	}

【添加用户】

1、映射文件

User.xml中配置添加用户的Statement


2、程序代码

// 添加用户信息
	@Test
	public void insertUserTest() throws IOException {
		// mybatis配置文件
		String resource = "SqlMapConfig.xml";
		// 得到配置文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);

		// 创建会话工厂,传入mybatis的配置文件信息
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
				.build(inputStream);

		// 通过工厂得到SqlSession
		SqlSession sqlSession = sqlSessionFactory.openSession();
		// 插入用户对象
		User user = new User();
		user.setUsername("王小军");
		user.setBirthday(new Date());
		user.setSex("1");
		user.setAddress("河南郑州");

		sqlSession.insert("test.insertUser", user);

		// 提交事务
		sqlSession.commit();
		System.out.println(user.getId());// 获取用户信息主键
		// 关闭会话
		sqlSession.close();

	}

3、自增主键返回

mysql自增主键,执行insert提交之前自动生成一个自增主键。

通过mysql函数获取到刚插入记录的自增主键:LAST_INSERT_ID() ,insert之后调用此函数。

 修改insertUser定义:

 

4、非自增主键返回(使用uuid())

  1. 使用mysqluuid()函数生成主键,需要修改表中id字段类型为string,长度设置成35位。 
  2. 执行思路:先通过uuid()查询到主键,将主键输入 到sql语句中。执行uuid()语句顺序相对于insert语句之前执行。


通过oracle的序列生成主键:

<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
			SELECT 序列名.nextval()
</selectKey>
	insert into user(id,username,birthday,sex,address) value(#{id},#{username},#{birthday},#{sex},#{address})

【删除用户】

1、映射文件

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

2、代码

// 根据id删除 用户信息
	@Test
	public void deleteUserTest() throws IOException {
		// mybatis配置文件
		String resource = "SqlMapConfig.xml";
		// 得到配置文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);

		// 创建会话工厂,传入mybatis的配置文件信息
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
				.build(inputStream);

		// 通过工厂得到SqlSession
		SqlSession sqlSession = sqlSessionFactory.openSession();

		// 传入id删除 用户
		sqlSession.delete("test.deleteUser", 39);

		// 提交事务
		sqlSession.commit();

		// 关闭会话
		sqlSession.close();

	}

【更新用户】

1、映射文件

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

2、代码

	// 更新用户信息
	@Test
	public void updateUserTest() throws IOException {
		// mybatis配置文件
		String resource = "SqlMapConfig.xml";
		// 得到配置文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);

		// 创建会话工厂,传入mybatis的配置文件信息
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
				.build(inputStream);

		// 通过工厂得到SqlSession
		SqlSession sqlSession = sqlSessionFactory.openSession();
		// 更新用户信息
		
		User user = new User();
		//必须设置id
		user.setId(41);
		user.setUsername("王大军");
		user.setBirthday(new Date());
		user.setSex("2");
		user.setAddress("河南郑州");

		sqlSession.update("test.updateUser", user);
		
		// 提交事务
		sqlSession.commit();

		// 关闭会话
		sqlSession.close();

	}

【总结】

1、parameterType

在映射文件中通过parameterType指定输入 参数的类型。

2、resultType

在映射文件中通过resultType指定输出结果的类型。

3、  #{}和${}

(1)#{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。

(2)如果接收简单类型,#{}中可以写成value或其它名称。

(3)#{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。

(4)${}表示一个拼接符号,会引用sql注入,所以不建议使用${}

(5)${}接收输入参数,类型可以是简单类型,pojo、hashmap。

(6)如果接收简单类型,${}中只能写成value。

(7)${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。

4、 selectOneselectList

 (1)selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象)。

 (2)selectList表示查询出一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne。

 如果使用selectOne报错:

org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 4


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值