MyBatis笔记

MyBatis

1、 概念
持久层框架,apache项目
通过mybatis映射方式,自动灵活的生成满足需要的sql语句。
可将我们向prepareStatement输入参数,mybatis可以将餐宿自动输入到映射中,将我们查询出的结果集灵活的映射到java对象中。

全局配置文件:sqlMapConfig.xml
会话工厂:SqlSessionFactory
会话:sqlSession
执行器:Executor
底层封装对象:mappedstatement
在这里插入图片描述

2、 mybatis入门案例

  1. 创建项目,导入jar包
  2. 创建表user表
  3. 添加日志文件配置log4j.properties以及mybatis全局配置文件SqlMapConfig.xml
  4. 创建entity、dao、daoimpl

entity:

	public class User {
		private int id;
		private String name;
		private int age;
		private String nickname;

	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getNickname() {
		return nickname;
	}
	public void setNickname(String nickname) {
		this.nickname = nickname;
	}
	@Override
	public String toString() {
		return "User [age=" + age + ", id=" + id + ", name=" + name
			+ ", nickname=" + nickname + "]";
	}

}

dao:

	public interface UserDao {
	//根据id查找用户
	public User findUserById(int id) throws Exception;
	//查询所有用户
	public List<User> findAllUsers() throws Exception;
	//增加用户
	public void inserUser(String name,int age,String nickname) throws Exception;

	//根据id删除用户
	public void deleteUser(int id) throws Exception;
	//修改用户昵称
	public void updateNickname(int id,String nickname) throws Exception;
	//查询姓x的用户的个数
	public int selectCount(String name) throws Exception;
}

daoimpl:

	public class UserDaoImpl implements UserDao {

	//根据id查找用户
	public User findUserById(int id) throws Exception {
	//1、得到配置文件流
	InputStream  inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
	//2、创建会话工厂
	SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
	//3、通过工厂得到会话
	SqlSession session = factory.openSession();
	
	//4、执行sql
	//第一参数是namespace的id.select标签的id
	//第二个参数就是传入参数,类型必须与parameterType指定的类型一致
	User user = session.selectOne("user.findUserById", id);
	
	//5、释放资源
	session.close();
	return user;
	}

	//查询所有用户
	public List<User> findAllUsers() throws Exception {
	//1、得到配置文件流
	InputStream  inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
	//2、创建会话工厂
	SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
	//3、通过工厂得到会话
	SqlSession session = factory.openSession();
	
	//4、执行sql
	List<User> users = session.selectList("user.findAllUser");
	
	//5、释放资源
	session.close();
	return users;
	}

	//添加用户
	public void inserUser(String name, int age, String nickname)
		throws Exception {
	//1、得到配置文件流
	InputStream  inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
	//2、创建会话工厂
	SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
	//3、通过工厂得到会话
	SqlSession session = factory.openSession();
	
	//4、执行sql
	User user = new User();
	user.setName(name);
	user.setAge(age);
	user.setNickname(nickname);
	session.insert("user.insertUser", user);
	//增删改,要提交
	session.commit();
	
	//5、释放资源
	session.close();
	
	}

	//根据id删除用户
	public void deleteUser(int id) throws Exception {
	//1、得到配置文件流
	InputStream  inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
	//2、创建会话工厂
	SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
	//3、通过工厂得到会话
	SqlSession session = factory.openSession();
	
	//4、执行sql
	session.delete("user.deleteUser",id);
	//增删改,要提交
	session.commit();
	
	//5、释放资源
	session.close();
	
	}

	public void updateNickname(int id, String nickname) throws Exception {
	//1、得到配置文件流
	InputStream  inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
	//2、创建会话工厂
	SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
	//3、通过工厂得到会话
	SqlSession session = factory.openSession();
	
	//4、执行sql
	User user = new User();
	user.setId(id);
	user.setNickname(nickname);
	session.update("user.updateNickname", user);
	//增删改,要提交
	session.commit();
	
	//5、释放资源
	session.close();
	
	}

	//查询姓x的用户的个数
	public int selectCount(String name) throws Exception {
	//1、得到配置文件流
	InputStream  inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
	//2、创建会话工厂
	SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
	//3、通过工厂得到会话
	SqlSession session = factory.openSession();
	
	//4、执行sql
	int count = session.selectOne("user.selectCount", name);
	
	//5、释放资源
	session.close();
	return count;
		}
	}

Mapper:

<!-- mapper标签需要指定namespace属性,项目中属性值唯一 -->
<mapper namespace="user">
<!-- 根据id查找用户 -->
<!-- id:代表当前文件中查询的id,id在当前文件中唯一;
	 parameterType:用于指定输入参数的类型,可不写;
	 resultType:用于指定返回参数的类型,可不写 -->
<select id="findUserById" parameterType="int" resultType="com.mybatis.entity.User">
select * from user where id = #{id}
</select>

<!-- 查询所有用户 -->
<select id="findAllUser" resultType="com.mybatis.entity.User">
select * from user
</select>

<!-- 添加用户 -->
<insert id="insertUser" parameterType="com.mybatis.entity.User">
insert into user(name,age,nickname) values(#{name},#{age},#{nickname})
</insert>

<!-- 删除用户 -->
<delete id="deleteUser" parameterType="int">
delete from user where id=#{id}
</delete>

<!-- 配置用户昵称 -->
<update id="updateNickname" parameterType="com.mybatis.entity.User">
update user set nickname=#{nickname} where id=#{id}
</update>

<!-- /查询姓x的用户的个数 -->
<select id="selectCount" parameterType="String" resultType="int">
<!-- 解析时候,name传入李,#会自动加上单引号'李'
name' and pwd='123
                      $  李   update set name=''-->

select count(id) from user where name like #{name}"%"
</select>
</mapper>

#占位符,可以接受输入参数,类型可以是简单类型、hashmap、pojo类
$可以接受输入参数,类型可以是简单类型、hashmap、pojo类
${}表示拼接符号,可能引起sql注入,不建议使用

3、 主键的返回

  1. 自增的主键返回
    先插入数据,再获取插入的自增id

    <!-- 添加用户 -->
    <insert id="insertUser" parameterType="com.mybatis.entity.User">
    <!-- 将插入的主键返回,返回到输入参数的对象中 -->
    <!-- keyProperty:将查询到的主键值设置到parameterType指定的对象的那个属性
         order:是相对于insert语句来说它的执行顺序
         resultType:用于指定返回参数的类型 -->
    <selectKey keyProperty="id" order="AFTER" resultType="int">
    <!-- 获取刚刚插入的记录的主键 -->
    select LAST_INSERT_ID()
    </selectKey>
    insert into user(name,age,nickname) values(#{name},#{age},#{nickname})
    </insert>
    
  2. 非自增主键的返回(mysql自动生成uuid)
    先获取uuid主键,再将主键输入到sql语句中

    <!-- 添加用户 -->
    <insert id="insertPerson" parameterType="com.mybatis.entity.Person">
    <!-- keyProperty:将查询到的主键值设置到parameterType指定的对象的那个属性
         order:是相对于insert语句来说它的执行顺序
         resultType:用于指定返回参数的类型 -->
    <selectKey keyProperty="id" order="BEFORE" resultType="String">
    <!-- 获取uuid -->
    SELECT REPLACE(UUID(),'-','')
    </selectKey>
    insert into person(id,name,age,nickname) values(#{id},#{name},#{age},#{nickname})
    </insert>
    

4、 Mapper代理接口(动态代理,有接口的情况,mybatis自动是生成实现类)
只需要写Mapper接口,相当于dao接口
1) 需要编写mapper.xml, Mapper接接口,Mapper接口需要遵循一些开发规范,Mybatis自动生成Mapper接口实现类的代理对象
2)4个开发规范
a)mapper.xml中namespace要等于接口的地址(全路径,包.类名)
b)mapper接口中的方法名要与mapper.xml文件中statement的id名称相同
c)mapper接口中方法的输入参数类型要与mapper.xml文件中statement的输入类型相同
d) mapper接口中方法的返回值类型要与mapper.xml文件中语句标签的返回值类型相同

/**
 * User的Mapper接口
 * @author Administrator
 *
 */
public interface UserMapper {

//根据id查找用户
public User findUserById(int id) throws Exception;

//添加用户
public void insertUser(User user);

查询所有用户
public List<User> findAllUser();

//根据id删除用户
public void deleteUser(int id);

//修改用户昵称
public void updateNickname(User user);

//查询姓x的用户的个数
public int selectCount(String name);

}


<!-- mapper标签需要指定namespace属性,项目中属性值唯一 -->
<mapper namespace="com.mybatis.mapper.inter.UserMapper">
<!-- 根据id查找用户 -->
<!-- id:代表当前文件中查询的id,id在当前文件中唯一;
	 parameterType:用于指定输入参数的类型,可不写;
	 resultType:用于指定返回参数的类型,可不写 -->
<select id="findUserById" parameterType="int" resultType="com.mybatis.entity.User">
select * from user where id = #{id}
</select>

<!-- 查询所有用户 -->
<select id="findAllUser" resultType="com.mybatis.entity.User">
select * from user
</select>

<!-- 添加用户 -->
<insert id="insertUser" parameterType="com.mybatis.entity.User">
	<!-- 将插入的主键返回,返回到输入参数的对象中 -->
	<!-- keyProperty:将查询到的主键值设置到parameterType指定的对象的那个属性
	     order:是相对于insert语句来说它的执行顺序
	     resultType:用于指定返回参数的类型 -->
	<selectKey keyProperty="id" order="AFTER" resultType="int">
	<!-- 获取刚刚插入的记录的主键 -->
	select LAST_INSERT_ID()
	</selectKey>
insert into user(name,age,nickname) values(#{name},#{age},#{nickname})
</insert>

<!-- 删除用户 -->
<delete id="deleteUser" parameterType="int">
delete from user where id=#{id}
</delete>

<!-- 配置用户昵称 -->
<update id="updateNickname" parameterType="com.mybatis.entity.User">
update user set nickname=#{nickname} where id=#{id}
</update>

<!-- /查询姓x的用户的个数 -->
<select id="selectCount" parameterType="java.lang.String" resultType="int">
<!-- 解析时候,name传入李,#会自动加上单引号'李'
name' and pwd='123
                      $  李   update set name=''-->

select count(id) from user where name like #{name}"%"
</select>
//SqlSessionFactory单例对象,一旦创建,不再销毁,一直使用这个实例
private SqlSessionFactory factory;

@Before//初始化方法,每个测试方法之前都要执行一次
public void before() throws Exception{
	//1、得到配置文件流
	InputStream  inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
	//2、创建会话工厂
	factory = new SqlSessionFactoryBuilder().build(inputStream);
}

/*
 * SqlSession最佳应用场合,是在方法体内,定义成一个局部变量,让每个对象都有自己的独立区域,多线程影响	不到
 */
@org.junit.Test
public void testFindById() throws Exception{
	//3、通过工厂得到会话
	SqlSession session = factory.openSession();
	
	//获取到Mapper接口
	UserMapper mapper = session.getMapper(UserMapper.class);
	User user = mapper.findUserById(6);
	System.out.println(user);
	
	//5、释放资源
	session.close();
}

@org.junit.Test
public void testInsertUser() throws Exception{
	//3、通过工厂得到会话
	SqlSession session = factory.openSession();
	
	//获取到Mapper接口
	UserMapper mapper = session.getMapper(UserMapper.class);
	User user = new User();
	user.setName("礼拜");
	user.setAge(20);
	user.setNickname("jjfiejfe");
	mapper.insertUser(user);
	System.out.println(user);
	
	session.commit();
	
	//5、释放资源
	session.close();
}

@org.junit.Test
public void testFindAllUser() throws Exception{
	//3、通过工厂得到会话
	SqlSession session = factory.openSession();
	
	//获取到Mapper接口
	UserMapper mapper = session.getMapper(UserMapper.class);
	List<User> list = mapper.findAllUser();
	for (User user : list) {
		System.out.println(user);
	}
	
	//5、释放资源
	session.close();
}

@org.junit.Test
public void testDeleteUser() throws Exception{
	//3、通过工厂得到会话
	SqlSession session = factory.openSession();
	
	//获取到Mapper接口
	UserMapper mapper = session.getMapper(UserMapper.class);
	mapper.deleteUser(14);
	
	session.commit();
	
	//5、释放资源
	session.close();
}


@org.junit.Test
public void testUpdateNickname() throws Exception{
	//3、通过工厂得到会话
	SqlSession session = factory.openSession();
	
	//获取到Mapper接口
	UserMapper mapper = session.getMapper(UserMapper.class);
	User user = new User();
	user.setId(15);
	user.setNickname("jack");
	mapper.updateNickname(user);
	System.out.println(user);
	
	session.commit();
	
	//5、释放资源
	session.close();
}

@org.junit.Test
public void testUserCount() throws Exception{
	//3、通过工厂得到会话
	SqlSession session = factory.openSession();
	
	//获取到Mapper接口
	UserMapper mapper = session.getMapper(UserMapper.class);
	int count = mapper.selectCount("王");
	System.out.println(count);
	
	//5、释放资源
	session.close();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值