使用MyBatis进行CRUD操作
1.准备工作
-
创建工程
-
导入jar包(maven坐标)
-
创建一个实体(实体类和数据库的表对应)
-
创建接口,编写一个方法(接口UserDao.java)
-
编写配置文件(resources资源下,sqlMapConfig.xml)
-
编写映射文件(resources资源下,创建的包结果和接口的结构对应,UserDao.xml)
-
测试类(使用mybatis的api),操作查询所有
-
2. 使用Junit重写UserDao.java
/**
* 测试mybatis的crud操作
*/
public class MybatisTest {
private InputStream in;
private SqlSession sqlSession;
private UserDao userDao;
@Before//用于在测试方法执行之前执行
public void init()throws Exception{
//1.读取配置文件,生成字节输入流
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.获取SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//3.获取SqlSession对象
sqlSession = factory.openSession();
//4.获取dao的代理对象
userDao = sqlSession.getMapper(UserDao.class);
}
@After//用于在测试方法执行之后执行
public void destroy()throws Exception{
//提交事务
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);
}
/*
保存,删除,修改等操作
*/
}
3.进行CURD时的注意事项
3.1 事务处理
在进行增删改时需要进行事务处理,而mybatis内部会自动开启和回滚事务,
所以需要我们使用sqlSession.commit()来提交事务.
3.2 获取自增长的数据库id
新增用户后,同时还要返回当前新增用户的id值,因为id是由数据库的自动增长来实现的,所以就相当于我们要在新增后将自动增长auto_increment的值返回。
配置:UserDao.xml
<!--保存用户-->
<!-- 配置插入操作后,获取插入数据的id -->
<insert id="saveUser" parameterType="com.itheima.domain.User"
useGeneratedKeys="true" keyColumn="id" keyProperty="id">
insert into user(username,address,sex,birthday)
values(#{username},#{address},#{sex},#{birthday});
</insert>
<!--其中的参数
#{username}等价于 user.getUsername(); (OGNL)
useGeneratedKeys="true" 是否使用新增的主键:true使用
keyColumn="id" 主键对应的数据库列名
keyProperty="id" 主键对应的java对象属性名
-->
3.3模糊查询中的问题:
查询语句有两种写法:
a. select * from user where name like #{name}
b. select * from user where username like '%${value}%'
#{}与${}的区别:
a.#{}表示一个占位符号
通过#{}可以实现prepareStatement向占位符中设置值,自动进行java类型
和jdbc类型转换,#{}可以有效防止sql注入问题.#{}可以接受简单类型值和pojo属性值.
如果parameterType传输单个简单类型的值,#{}括号中可以是value或者其他自定义名称.
b.${}表示拼接sql串
通过${}可以将parameterType传入的内容拼接在sql中且不进行jdbc类型转换,${}可以接受简单类型值或pojo类型属性值,如果parameterType传输单个简单类型的值,
${}括号内只能是value(因为源码中读取的key的名字是value,所以在绑定参数时只能叫value).
4.Mybatis输出结果的封装
如果数据库中的字段和对象中的属性不一致
<!--
如果返回的列名和实体类的属性不一致时,我们就不能封装结果到指定的实体对象
解决方案 使用resultMap替换resultType
在UserDao.xml中的<mapper>下定义resultMap
-->
<!-- 配置 查询结果的列名和实体类的属性名的对应关系 -->
<resultMap id="userMap" type="com.itheima.domain.User">
<!-- 主键字段的对应 -->
<id property="userId" column="id"></id>
<!--非主键字段的对应-->
<result property="userName" column="username"></result>
<result property="userAddress" column="address"></result>
<result property="userSex" column="sex"></result>
<result property="userBirthday" column="birthday"></result>
</resultMap>
<id/>:此属性表示查询结果集的唯一标识,也是数据库的主键,
如果是多个字段为复合唯一约束则定义多个<id/>
property:表示java中类的属性
column:表示数据库的列名
column和property放在一块儿表示将sql查询出来的字段映射到指定的pojo类属性上。
<result />:普通属性(普通字段),即pojo的属性

浙公网安备 33010602011771号