属性作用:
1、resultType属性:用于指定结果集的类型。
2、parameterType属性:用于指定传入参数的类型。3、sql语句中使用#{}字符:它代表占位符,相当于原来jdbc部分所学的?,都是用于执行语句时替换实际的数据。具体的数据是由#{}里面的内容决定的。
4、#{}中内容的写法: 由于数据类型是基本类型,所以此处可以随意写。5、在实现增删改时一定要去控制事务的提交,在mybatis中实现事务提交的方法:session.commit();
注意事项:
动态代理dao开发规则
1、namespace必需是接口的全路径名
2、接口的方法名必需与映射文件的sql id一致
3、接口的输入参数必需与映射文件的parameterType类型一致
4、接口的返回类型必须与映射文件的resultType类型一致
持久层接口IUserDao.java
public interface IUserDao {
/**
* 查询所有用户
*/
List<User> findAll();
/**
* 根据id查询
*/
User findById(Integer userId);
/**
* 保存用户
*/
void saveUser(User user);
/**
* 用户更新
*/
void updateUser(User user);
/**
* 删除用户
*/
void deleteUser(Integer userId);
/**
* 用户模糊查询
*/
List<User> findByName(String username);
/**
* 使用聚合函数查询总记录条数
*/
int findTotal();
}
持久层映射配置IUserDao.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="com.review.dao.IUserDao">
<!--查询所有用户-->
<select id="findAll" resultType="com.review.domain.User">
select *from user
</select>
<!--根据id查询-->
<select id="findById" resultType="com.review.domain.User" parameterType="int">
select *from user where id=#{uid}
</select>
<!--保存用户-->
<insert id="saveUser" parameterType="com.review.domain.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>
<!--用户更新-->
<update id="updateUser" parameterType="com.review.domain.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex}, address=#{address} where id=#{id}
</update>
<!--删除用户-->
<update id="deleteUser" parameterType="com.review.domain.User">
delete from user where id=#{uid}
</update>
<!--用户模糊查询-->
<select id="findByName" parameterType="String" resultType="com.review.domain.User">
select * from user where username like #{username}
</select>
<!--用聚合函数查询总记录条数-->
<select id="findTotal" resultType="int">
select count(*) from user
</select>
</mapper>
测试类MybatisTest.java
public class MybatisTest {
private InputStream in;
private SqlSessionFactoryBuilder builder;
private SqlSessionFactory factory;
private SqlSession session;
private IUserDao userDao;
@Test
public void testFindAll() throws Exception {
List<User> users = userDao.findAll();
for(User user:users){
System.out.println(user);
}
}
@Test
public void testFindOne() throws Exception {
User user = userDao.findById(48);
System.out.println(user);
}
@Test
public void testSave() throws Exception {
User user = new User();
user.setUsername("周杰伦");
user.setAddress("台湾省台北市");
user.setSex("男");
user.setBirthday(new Date());
userDao.saveUser(user);
System.out.println(user);
}
@Test
public void testUpdateUser() throws Exception {
User user = userDao.findById(43);
user.setUsername("小三王");
userDao.updateUser(user);
System.out.println(user);
}
@Test
public void testDeleteUser() throws Exception {
userDao.deleteUser(56);
}
@Test
public void testFindByName() throws Exception {
List<User> users = userDao.findByName("%王%");
for (User user : users) {
System.out.println(user);
}
}
@Test
public void testFindTotal() throws Exception {
int res = userDao.findTotal();
System.out.println(res);
}
@Before
public void init() throws Exception {
in = Resources.getResourceAsStream("SqlMapConfig.xml");
builder = new SqlSessionFactoryBuilder();
factory = builder.build(in);
session = factory.openSession();
userDao = session.getMapper(IUserDao.class);
}
@After
public void destory() throws Exception {
session.commit();
//7.释放资源
session.close();
in.close();
}
}
在Mybatis01—Mybatis开发这一篇博文的注意事项里面说过:实体类中的属性名称必须和数据库表的列名保持一致,否则无法实现封装,那么当不一致时如何解决这个问题呢?
解决方案:在select标签中使用resultMap属性指定引用即可(resultMap标签可以建立查询的列名和实体类的属性名称不一致时建立对应关系。从而实现封装。)
数据库表列名:
实体类属性名:
在IUserDao.xml内进行如下操作即可解决以上所述问题:
id标签:用于指定主键字段
result标签:用于指定非主键字段
column属性:用于指定数据库列名
property属性:用于指定实体类属性名称