以下操作在MyBatis–01入门案例的基础上修改。
在MyBatisTest中删除public static void main()方法。
PS:添加,更新和删除数据库中的数据需要手动调用commit()。
保存用户
在持久层接口中添加方法
/**
* 保存用户
* @param user
*/
void saveUser(User user);
在映射配置文件中添加配置
<!--保存用户-->
<insert id="saveUser" parameterType="com.cncs.domain.User">
insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address});
</insert>
在测试类中添加测试方法执行前的前置方法和后置方法。
public class MyBatisTest {
private InputStream in;
private SqlSession sqlSession;
private IUserDao userDao;
@Before //在测试方法之前执行
public void init() throws IOException {
//1.读取mybatis核心配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建工厂对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory sessionFactory = builder.build(in);
//3.通过工厂对象构建SqlSession对象
sqlSession = sessionFactory.openSession();
//4.通过SqlSession对象创建代理对象
userDao = sqlSession.getMapper(IUserDao.class);
}
@After //在测试方法之后执行
public void destory() throws IOException {
sqlSession.commit();
//6.释放资源
sqlSession.close();
in.close();
}
}
在测试类中添加测试方法
@Test
public void saveUser() {
User user = new User();
user.setUsername("枯木逢春");
user.setBirthday(new Date());
user.setSex("男");
user.setAddress("海西省三亚市");
System.out.println("保存之前"+user);
userDao.saveUser(user);
System.out.println("保存之后"+user);
//需要手动提交
}
查询新增用户的id
在映射配置文件中保存用户的操作中添加标签selectKey
<!-- 在保存用户后查询id -->
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
通过在测试方法中调用saveUser(user),然后分别打印调用方法之前和之后的user对象,发现保存之后user对象的id有了值。
更新用户
在持久层接口中添加方法
/**
* 更新用户
* @param user
*/
void updateUser(User user);
在映射配置文件中添加配置
<!-- 更新用户-->
<update id="updateUser" parameterType="com.cncs.domain.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id};
</update>
在测试类中添加测试方法
@Test
public void updateUser() {
User user = new User();
user.setUsername("aaa");
user.setBirthday(new Date());
user.setSex("女");
user.setAddress("海西省三亚市");
user.setId(58);
userDao.updateUser(user);
//需要手动提交
}
删除用户
在持久层接口中添加方法
/**
* 删除用户
* @param userId
*/
void deleteUser(int userId);
在映射配置文件中添加配置
<!-- 删除用户-->
<delete id="deleteUser" parameterType="int">
delete from user where id=#{userId};
</delete>
在测试类中添加测试方法
@Test
public void deleteUser() {
userDao.deleteUser(58);
//需要手动提交
}
查询一个
在持久层接口中添加方法
/**
* 查询一个
* @param userId
* @return
*/
User findOne(int userId);
在映射配置文件中添加配置
<!-- 查询一个-->
<select id="findOne" parameterType="int" resultType="com.cncs.domain.User">
select * from user where id=#{userId};
</select>
在测试类中添加测试方法
@Test
public void findOne() {
User one = userDao.findOne(57);
System.out.println(one);
}
根据名称模糊查询
在持久层接口中添加方法
/**
* 根据名字模糊查询
* @param username
* @return
*/
List<User> findByUsername(String username);
在映射配置文件中添加配置
<!-- 根据名字模糊查询-->
<select id="findByUsername" parameterType="string" resultType="com.cncs.domain.User">
select * from user where username like #{name}
</select>
在测试类中添加测试方法
@Test
public void findByUsername() {
List<User> list = userDao.findByUsername("%王%");
for (User user : list) {
System.out.println(user);
}
}
#{}与${}的区别
#{}表示一个占位符号
通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换,#{}可以有效防止 sql 注入。 #{}可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类型值,#{}括号中可以是 value 或其它名称。
${}表示拼接 sql 串
通过${}可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换, 可 以 接 收 简 单 类 型 值 或 p o j o 属 性 值 , 如 果 p a r a m e t e r T y p e 传 输 单 个 简 单 类 型 值 , {}可以接收简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值, 可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,{}括号中只能是 value。
模糊查询的另一种写法
在映射配置文件中修改配置
<!-- 根据名字模糊查询-->
<select id="findByUsername" parameterType="string" resultType="com.cncs.domain.User">
select * from user where username like '%${value}%'
</select>
在测试类中添加测试方法
@Test
public void findByUsername() {
List<User> list = userDao.findByUsername("王");
for (User user : list) {
System.out.println(user);
}
}
使用聚合函数
在持久层接口中添加方法
/**
* 查询总记录条数
* @return
*/
int findCountUser();
在映射配置文件中添加配置
<!-- 查询总记录条数-->
<select id="findCountUser" resultType="int">
select count(*) from user;
</select>
在测试类中添加测试方法
@Test
public void findCountUser() {
int countUser = userDao.findCountUser();
System.out.println(countUser);
}