一、UserDao.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">
<!--namespace确定该方法是在哪个dao接口-->
<mapper namespace="mybatis.dao.UserDao">
<!--查询所有用户-->
<!--id 表示方法名称,resultType 表示要封装到哪里去-->
<select id="findAll" resultType="mybatis.domain.User">
select * from user
</select>
<!--保存用户-->
<insert id="saveUser" parameterType="mybatis.domain.User">
insert into user(username,birthday,sex,address)
values (#{username},#{birthday},#{sex},#{address})
</insert>
<!--根据id查询-->
<select id="findById" parameterType="int" resultType="mybatis.domain.User">
select * from where id = #{uid};
</select>
<!--更新用户-->
<update id="updateUser" parameterType="mybatis.domain.User">
update user set username=#{username},address=#{address},sex=#{sex},
birthday=#{birthday} where id = #{id}
</update>
<!--删除用户-->
<delete id="deleteUser" parameterType="int">
delete from user where id = #{uid}
</delete>
<!--根据名称模糊查询-->
<select id="findByName" parameterType="string" resultType="mybatis.domain.User">
select * from user where username like #{name};
</select>
<!--获取用户的总记录条数-->
<select id="findTotal" resultType="int">
select count(id) from user;
</select>
</mapper>
注意:
<!-- 保存用户-->
<insert id="saveUser" parameterType="mybatis.domain.User">
insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
</insert>
parameterType 属性:代表参数的类型,因为我们要传入的是一个类的对象,所以类型就写类的全名称。
sql 语句中使用#{}
字符:它代表占位符, 相当于原来 jdbc 部分所学的?
,都是用于执行语句时替换实际的数据,具体的数据是由#{}
里面的内容决定的。
#{}
中内容的写法:由于我们保存方法的参数是 一个 User 对象,此处要写 User 对象中的属性名称。
<!--根据id查询-->
<select id="findById" parameterType="int" resultType="mybatis.domain.User">
select * from where id = #{uid}
</select>
resultType属性:用于指定结果集的类型
parameterType属性:用于指定传入参数的类型
由于这里就一个参数,所以可以任意选取参数名,如果多个的话,就需要有一个对应关系
二、MybatisTest.java
/**
* 测试 mybatis 的环境
*/
public class MybatisTest {
private InputStream in;
private SqlSession sqlSession;
private UserDao userDao;
@Before//用于在测试方法执行之前执行
public void init() throws IOException {
//1.读取配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂生产SqlSession对象
sqlSession = factory.openSession();
//4.使用SqlSession创建Dao接口的代理对象
userDao = sqlSession.getMapper(UserDao.class);
}
@After//用于在测试方法执行之后执行
public void destroy() throws IOException {
//实现增删改查时需要控制事务的提交
sqlSession.commit();
//6.释放资源
sqlSession.close();
in.close();
}
/**
* 测试查询所有
*/
@Test
public void testFindAll() {
//5.使用代理对象执行方法
List<User> users = userDao.findAll();
for (User user :
users) {
System.out.println(user);
}
}
/**
* 测试保存操作
*/
@Test
public void testSave() {
User user = new User();
user.setUsername("Save");
user.setAddress("Java");
user.setSex("男");
user.setBirthday(new Date());
//5.执行保存方法
userDao.saveUser(user);
System.out.println("保存之后的user:" + user);
}
/**
* 根据id查询
*/
@Test
public void testFindOne() {
//5.使用代理对象执行方法
User user = userDao.findById(48);
System.out.println(user);
}
/**
* 用户更新
*/
@Test
public void testUpdate() {
User user = new User();
user.setId(49);
user.setUsername("Update");
user.setAddress("Java");
user.setSex("男");
user.setBirthday(new Date());
//5.使用代理对象执行方法
userDao.updateUser(user);
}
/**
* 删除操作
*/
@Test
public void testDelete() {
//5.使用代理对象执行方法
userDao.deleteUser(46);
}
/**
* 模糊查询
*/
@Test
public void testFindByName() {
//5.使用代理对象执行方法
List<User> users = userDao.findByName("%王%");
for (User user : users) {
System.out.println(user);
}
}
/**
* 查询总记录条数
*/
@Test
public void testFindTotal() {
//5.使用代理对象执行方法
int count = userDao.findTotal();
System.out.println(count);
}
}
注意模糊查询,需要传递参数时加上 %
List<User> users = userDao.findByName("%王%");
三、#{}
与${}
的区别
如果不在传递参数时加%,需要在xml文件中修改:
List<User> users = userDao.findByName("王");
<!-- 根据名称模糊查询 -->
<select id="findByName" parameterType="string" resultType="mybatis.domain.User">
select * from user where username like '%${value}%'
</select>
不过这里的${value}
是写死的,不能修改名字
#{}
表示一个占位符号
通过#{}
可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换,#{}
可以有效防止 sql 注入。 #{}
可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类型值, #{}
括号中可以是 value 或其它名称。
${}
表示拼接 sql 串
通过${}
可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换, ${}
可以接收简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值, ${}
括号中只能是 value。
需要手动加单引号