Mybatis框架学习笔记二
基础mybatis配置文件方式配置
前面的准备工作(即创建数据库表,1.编写数据源,2.依赖导入,3.编写实体类)与上篇相同
3.添加UserVo实体类
public class QueryVo {
private User user;
private List<Integer> ids;
//下面是get,set方法
...
}
4.编写持久层接口
package com.learn.dao;
public interface UserDao {
/**
* 保存用户方法
*/
void saveUser(User user);
/**
* 根据id查询用户信息
*/
User findById(Integer userId);
/**
* 根据id删除用户
*/
void deleteById(Integer id);
/**
* 根据id更新用户信息
*/
void updataById(User user);
/**
* 根据传入的条件查询
* @param user 查询的条件,可以有各个属性,也可能都没有
*/
List<User> findByCondition(User user);
/**
* 根据QueryVo提供的id集合查询用户集合
*/
List<User> findUserInIds(QueryVo vo);
}
5.在resources目录下建立与Dao(Mapper)接口相同的目录结构,并在该目录下创建UserDao.xml文件
我这里就是com/learn/dao(resources是目录,所以需要将.改成/)
<?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)接口的全类名-->
<mapper namespace="com.learn.dao.UserDao">
<!--如果实体类中属性名与数据库中列名不对应时,
如果不在sql语句中使用映射的方式,则需要使用下列这种方式来保证对象的正确封装-->
<!--配置 查询结果的列名和实体类的属性名的对应关系-->
<!--id属性:唯一标识,type属性:指定要封装成哪个类-->
<resultMap id="userMap" type="com.learn.domain.User">
<!--首先要设置主键字段的对应property属性:指定实体类中的属性名称,column属性:数据库表键值名称,下同 -->
<id property="id" column="id"></id>
<!--property 实体类中的名称 column 数据库中的列中的列名 -->
<!--非主键字段的对应-->
<result property="username" column="username"></result>
<result property="address" column="address"></result>
<result property="sex" column="sex"></result>
<result property="birthday" column="birthday"></result>
</resultMap>
<!--保存用户-->
<insert id="saveUser" parameterType="com.learn.domain.User">
<!--配置插入操作后,获取插入数据的id-->
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address});
</insert>
<!--根据id查询用户-->
<!--如果实体类中属性名与数据库中列名不对应时,需要使用下面注释掉的这一种方法来配置 -->
<!--<select id="findById" parameterType="int" resultMap="userMap">-->
<!--parameterType 参数类型,resultType要封装成的数据类型-->
<select id="findById" parameterType="int" resultType="com.learn.domain.User">
select * from user where id = #{uid};
<!--当只要一个参数时,{}里面的变量名可以随便写-->
</select>
<!--根据id删除用户-->
<delete id="deleteById" parameterType="int">
delete from user where id = #{uid}
</delete>
<!--根据id更新数据-->
<update id="updataById" parameterType="com.learn.domain.User">
update user set username = #{username} where id = #{id};
<!--当传入的参数是一个对象时,可以直接写属性名-->
</update>
<!--根据<if></if>条件查询-->
<select id="findByCondition" parameterType="com.learn.domain.User" resultType="com.learn.domain.User">
select * from user where 1=1
<!--添加where 1=1恒等式,方便添加其它条件-->
<if test="username != null">
and username = #{username}
</if>
<if test="sex != null">
and sex = #{sex}
</if>
</select>
<!--根据QueryVo提供的id集合查询用户集合-->
<select id="findUserInIds" parameterType="com.learn.domain.QueryVo" resultType="com.learn.domain.User">
select * from user
<where>
<if test="ids != null and ids.size() > 0">
<!--遍历ids集合并拼接sql语句-->
<foreach collection="ids" open="and id in (" close=")" item="uid" separator=",">
#{uid}
<!--#{里面的内容由 item属性的值决定}-->
</foreach>
</if>
</where>
</select>
</mapper>
6.在resources目录下新建SqlMapConfig.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--配置properties,加载JDBC配置文件读取数据库连接信息-->
<properties resource="jdbcConfig.properties">
</properties>
<!--配置环境-->
<environments default="mysql">
<!--配置mysql的环境-->
<environment id="mysql">
<!--配置事务-->
<transactionManager type="JDBC"></transactionManager>
<!--配置连接池-->
<dataSource type="POOLED">
<!--如果value里的key值必须与配置文件里面的保存一致-->
<property name="driver" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</dataSource>
</environment>
</environments>
<!--配置映射文件的位置-->
<mappers>
<!-- <mapper resource="com/learn/dao/UserDao.xml"></mapper>-->
<!-- package用于指定dao接口所在的包,当指定之后就不需要再写mapper以及resource或者class了-->
<package name="com/learn/dao"></package>
</mappers>
</configuration>
7.编写测试类
//避免篇幅过长,我就只写了测试保存的方法
public class MybatisTest {
private InputStream is;
private SqlSession sqlSession;
private UserDao userDao;
@Before//用于在方法执行前执行
public void init() throws IOException {
//1.读取配置文件,生成字节输入流
is = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.获取SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//3.获取SqlSession对象
sqlSession = factory.openSession();
//4.获取dao的代理对象
userDao = sqlSession.getMapper(UserDao.class);
}
@After//用于在方法执行之后执行
public void destroy() throws IOException {
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
is.close();
}
/**
* 测试保存操作
*/
@Test
public void testsaveUser(){
User user = new User();
user.setUsername("test");
user.setAddress("1234");
user.setSex("男");
user.setBirthday(new Date());
System.out.println(user);
//5.测试保存方法
userDao.saveUser(user);
System.out.println(user);
}
}
如有错漏,欢迎指正