使用XML方法
1.实现Insert操作
1.1 在IUserDao接口中添加方法
1.2 在IUserDao.xml中添加对应的dom
注意此处为insert标签 对应的参数类型(parameterType)为实体类的全限定类名
后面value为#{parameter} 与前面一一对应
<insert id="insertUser" parameterType="com.itheima.domain.User">
insert into user(username,birthday,sex,address)
value (#{username},#{birthday},#{sex},#{address})
</insert>
在1.3之前 有一个小优化
之前的代码:
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂创建SqlSession对象
SqlSession sqlSession = factory.openSession();
//4.使用SqlSession创建Dao接口的代理对象
IUserDao userDao = sqlSession.getMapper(IUserDao.class);
因为可能有很多个操作方法
如果每个方法都要像上面那样把每个都从头创建 无疑是增多了无用的重复代码
因此将重复的构造和释放资源的代码提出
分为init创建 和destroy释放
并且注意在测试类中
要在init上面加上@Before注解 表明要在测试方法之前执行
要再destroy上面加上@After注解 表明在测试方法结束后要执行这个
代码优化之后如下
public class MybatisTest {
InputStream in;
SqlSessionFactory factory;
SqlSession session;
IUserDao userDao;
@Before
public void init() throws IOException {
//1.获取配置文件流
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
factory = new SqlSessionFactoryBuilder().build(in);
//3.用工厂创建一个SqlSession
session = factory.openSession();
//4.用SqlSession创建一个Dao接口的代理
userDao = session.getMapper(IUserDao.class);
}
@After
public void destroy() throws IOException{
session.commit();
session.close();
in.close();
}
@Test
public void testFindAll(){
List<User> users = userDao.findAll();
for (User user:users){
System.out.println(user);
}
//6.释放资源
}
@Test
public void testInsertUser(){
User user = new User();
user.setUsername("老张");
user.setBirthday(new Date());
user.setSex("男");
user.setAddress("金华金东区");
userDao.insertUser(user);
session.commit();
}
}
1.3 编写testInsertUser方法,向数据库插入数据
注意在最后要用session.commit提交事务
这里也进行优化 把commit移动到destroy方法里
@Test
public void testInsertUser(){
User user = new User();
user.setUsername("老张");
user.setBirthday(new Date());
user.setSex("男");
user.setAddress("金华金东区");
userDao.insertUser(user);
}
2.实现update操作和delete操作
2.1 在IUerDao接口中添加update方法和delete方法
由于delete只需要一个id就够了 所以传入为一个integer
2.2 在IUserDao.xml里面加入update和delete的dom
<update id="updateUser" parameterType="com.itheima.domain.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
</update>
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id=#{id}
</delete>
2.3 在MybatisTest类中编写update和delete的Test类
update:
@Test
public void testUpdateUser(){
User user = new User();
user.setId(42);//修改小二王的
user.setUsername("小二");
user.setBirthday(new Date());
user.setSex("女");
user.setAddress("金华义乌");
userDao.updateUser(user);
}
delete
注意这里传入的parameterType为id的类型即:integer
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id=#{id}
</delete>
@Test
public void testDeleteUser(){
userDao.deleteUser(46);
}
3.实现查找某id对应的数据
3.1 在IUserDao接口中添加方法
返回的是用户的信息 所以返回值为User 通过id来查找 则参数为id
3.2 在IUserDao.xml中添加dom
resultTyoe为返回值的实体类 parameterType为传入的参数 对应下面的id
<select id="findUser" resultType="com.itheima.domain.User" parameterType="java.lang.Integer">
select * from user where id=#{id}
</select>
3.3 在MybatisTest.java测试类中编写测试方法
@Test
public void testFindUser(){
User user = userDao.findUser(55);
System.out.println(user);
}
4. 按名字模糊查找
4.1 在IUserDao接口中添加方法
4.2 在IUserDao.xml中添加dom
<select id="findUserByName" resultType="com.itheima.domain.User" parameterType="java.lang.String">
select * from user where username like #{username}
</select>
4.3 在MybatisTest测试类中添加测试方法
@Test
public void testFindUserByName(){
List<User> users = userDao.findUserByName("%老1%");
for (User user: users){
System.out.println(user);
}
}
另 :按模糊查找也可以在dom中将语句写成:
外面为 ‘单引号’
两边为模糊查找的 %%
值为${value} 注意value为固定值!value外是花括号!
<select id="findUserByName" resultType="com.itheima.domain.User" parameterType="java.lang.String">
<!--select * from user where username like #{username}-->
select * from user where username like '%${value}%'
</select>
那么这样 测试类中字符串就不用加%%了 改为:
List<User> users = userDao.findUserByName("老1");
区别和优劣:
如上图 使用 ‘%${value}%’ 这种方法运行
可以看出这是使用字符串拼接的sql语句
如上图 使用 like #{username} 和 findUserByName("%老1%"); 这种方法
使用的是prepareStatement的预处理语句
结论:使用预处理语句更好一些!
4.在insert语句执行后拿到该插入数据的id
4.1
在insert里面插入selectKey标签
1.keyProperty为查询的参数
2.keyColumn为数据库中对应的字段
3.order有AFTER和BEFORE 分别表示是在insert执行后执行该语句还是之前
4.resultType表示返回的这个值的类型 这里为int
select last_insert_id()为sql语句 表示最近插入的id
<insert id="insertUser" parameterType="com.itheima.domain.User">
<selectKey keyProperty="id" keyColumn="id" order="AFTER" resultType="java.lang.Integer">
select last_insert_id()
</selectKey>
insert into user(username,birthday,sex,address)value (#{username},#{birthday},#{sex},#{address})
</insert>