发表于: 2018-01-31 22:21:43
1 571
今日完成
学习mybatis;
1.编写mybatis中原始dao开发;
2.mapper代理方法开发dao
在mybatis中使用mapper代理来开发dao,不需要我们去写具体的实现,在定义好了mapper.xml文件之后, sqlSession自动创建一个mapper接口的代理对象。通过这个代理对象来实现接口中的方法。
需要注意的是:
1.在mapper.xml中,使namespace等于mapper接口的地址(完全限定名)
若不一致则会抛出找不到映射文件的异常
2.mapper.java接口中的方法名和mapper.xml中statement的id一致
若不一致则会抛出找不到映射文件的异常
3.mapper.java接口中方法的输入参数类型和mapper.xml中statement的parameterType指定的类型一致
4.mapper.java接口中方法返回值类型和mapper.xml中statement的resultType指定的类型一致
下面是通过原始dao开发 和用mapper代理方法开发dao的实例
DAO接口
public interface Dao1 {
public User findUserById(int id) throws IOException;//查询
public List<User> findUserByname(String name)throws IOException;
//模糊查询(查询结果不一定只有一个,所以将查询结果放入List集合中。
public void insertUser(User3 user) throws Exception;//增加
public void deleteUser(int id) throws Exception;//删除指定id的记录
public void updateUser(User user) throws Exception;//更改指定id的数据
在使用原始dao开发时实现类
public class UserDaoImpl implements Dao1 {
private SqlSessionFactory sqlSessionFactory;
public UserDaoImpl(SqlSessionFactory sqlSessionFactory){
this.sqlSessionFactory=sqlSessionFactory;
}
@Override
public User findUserById(int id) throws IOException {
SqlSession sqlSession=sqlSessionFactory.openSession();
User user=sqlSession.selectOne("test.findUserById", id);
sqlSession.close();
return user;
}
@Override
public List<User> findUserByname(String name) throws IOException {
SqlSession sqlSession=sqlSessionFactory.openSession();
List<User> list=sqlSession.selectList("test.findUserByname",name);
return list;
}
@Override
public void insertUser(User3 user) throws Exception {
SqlSession sqlSession=sqlSessionFactory.openSession();
sqlSession.insert("test.insertUser", user);
sqlSession.commit();
sqlSession.close();
}
@Override
public void deleteUser(int id) throws Exception {
SqlSession sqlSession=sqlSessionFactory.openSession();
sqlSession.delete("test.deleteUser", id);
sqlSession.commit();
sqlSession.close();
}
@Override
public void updateUser(User user) throws Exception {
SqlSession sqlSession=sqlSessionFactory.openSession();
sqlSession.update("test.updateUser", user);
sqlSession.commit();
sqlSession.close();
}
}
单元测试
public class TestDaoImpl {
private SqlSessionFactory sqlSessionFactory;@Before//通过before在所有的测试方法之前都先执行这个方法。如果不注解,则出报出sqlSessionFactory空指针异常
public void setUp() throws Exception{//创建sqlSessionFactory
String resource="SqlMapConfigDaoTest.xml";
InputStream inputStream= Resources.getResourceAsStream(resource);
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);}
//通过原始dao开发
@Test
public void testFindInsertUser() throws Exception{
Dao1 dao1=new UserDaoImpl(sqlSessionFactory);
System.out.println(dao1.findUserById(1));//通过ID查询,并输出结果
System.out.println(dao1.findUserByname("张"));//通过名字模糊查询,并输出结果
User3 user=new User3("赵六2",null,"女","重庆大学");dao1.insertUser(user);//插入数据
//通过mapper代理方法开发dao
@Test}
public void testFindUserById() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
User user=userMapper.findUserById(5);
System.out.println(user);
}
@Test
public void testFindUserByName() throws Exception{
SqlSession sqlSession=sqlSessionFactory.openSession();
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
List<User> p=userMapper.findUserByname("四");
sqlSession.close();
System.out.println(p);
}
<?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 resource="db.properties"/>//通过db.properties加载属性文件
<typeAliases><package name="POJO"/>//批量自定义别名
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- <mapper resource="User4.xml" /><mapper resource="UserMapper.xml" />//通过mapper代理方法开发dao
-->
<mapper resource="User4.xml" />//原始dao开发
</mappers>
</configuration>
映射文件1
<?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">
<mapper namespace="test">
<select id="findUserById" parameterType="int" resultType="User">
select * from user where id = #{id}
</select>
<select id="findUserByname" parameterType="java.lang.String" resultType="User2">
select * from user where username like '%${value}%'
</select>
<insert id="insertUser" parameterType="User3">
insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
select last_insert_id()
</selectKey>
</insert>
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id=#{id}
</delete>
<update id="updateUser" parameterType="User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
</update>
</mapper>
映射文件2
<?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">
<mapper namespace="Dao.Dao1">
<select id="findUserById" parameterType="int" resultType="POJO.User">
select * from user where id = #{id}
</select>
<select id="findUserByname" parameterType="java.lang.String" resultType="POJO.User2">
select * from user where username like '%${value}%'
</select>
<insert id="insertUser" parameterType="POJO.User3">
insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
select last_insert_id()
</selectKey>
</insert>
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id=#{id}
</delete>
<update id="updateUser" parameterType="POJO.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
</update>
</mapper>
映射文件1和2除了namespace不同,其他地方都相同。
3.resultMap
使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。
4.定义包装类型pojo
通过定义包装类型pojo 可以进行比较复杂的查询需求;
5.动态sql
动态sql即对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。
映射文件1
<?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">
<mapper namespace="test">
<!-- 模糊查询 -->
<select id="findUserList" parameterType="java.lang.String" resultType="User2">
select * from user
<where>
<include refid="sqlfrase"></include>
</where></select>
<!--右边拼接AND ( id=n1 OR id=n2 OR id=n3 ) sql语句:select * from user WHERE user.sex = ? and user.username like '%user.username%' AND ( id=n1 OR id=n2 OR id=n3 ) -->
<sql id="sqlfrase" >
<if test="user!=null">
<if test="user.sex!=null and user.sex!=''" >
and user.sex=#{user.sex}
</if>
<if test="user.username!=null and user.username!=''">
and user.username like '%${user.username}%'
</if>
<if test="ids!=null">
<foreach collection="ids" item="user_id" open="AND(" close=")" separator="OR">
id=#{user_id}
</foreach>
</if>
</if>
</sql>
<!--右边拼接AND id IN(n1,n2,n3) sql语句:select * from user WHERE user.sex = ? and user.username like '%user.username%' AND AND id IN(n1,n2,n3) -->
<!---
<sql id="sqlfrase" >
<if test="user!=null">
<if test="user.sex!=null and user.sex!=''" >
and user.sex=#{user.sex}
</if>
<if test="user.username!=null and user.username!=''">
and user.username like '%${user.username}%'
</if>
<if test="ids!=null">
<foreach collection="ids" item="user_id" open="AND id IN(" close=")" separator=",">
id=#{user_id}
</foreach>
</if>
</if>
</sql>-->
</mapper>
映射文件2
<?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">
<mapper namespace="Dao.UserMapperIn">
<!-- 模糊查询 -->
<select id="findUserList" parameterType="java.lang.String" resultType="POJO.User2">
select * from user
<where>
<include refid="test.sqlfrase"></include>//调用映射文件1的sql片段
</where>
</select>
</mapper>
测试单元
public class TestIn {
private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws IOException {
String resource = "SqlMapConfigDaoTest.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindUserList() throws Exception{
SqlSession sqlSession=sqlSessionFactory.openSession();
UserMapperIn userMapperIn=sqlSession.getMapper(UserMapperIn.class);
UserQueryVO userQueryVO=new UserQueryVO();
User user=new User();
user.setSex("男");
user.setUsername("五");
List<Integer> ids=new ArrayList<Integer>();
ids.add(1);
ids.add(10);
ids.add(3);
userQueryVO.setIds(ids);
userQueryVO.setUser(user);
List<User> p=userMapperIn.findUserList(userQueryVO);
System.out.println(p);
}
}
DAO
public interface UserMapperIn {
public List<User> findUserList(UserQueryVO userQueryVO)throws IOException;
}
实体类
public class UserQueryVO {
private User user;
private List<Integer> ids;
public List<Integer> getIds() {
return ids;
}
public void setIds(List<Integer> ids) {
this.ids = ids;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String toString() {
return "UserQueryVO{" +
"user=" + user +
", ids=" + ids +
'}';
}
}
明天计划
1.学习单元测试(任务一:18-20);
遇到问题
1.运行测试单元,报空指针异常。师兄指出:未在创建sqlSessionFactory时加上@Before,导致报错;
2.在编写mapper.java接口时方法名和mapper.xml中的id不一致,导致找不到映射文件。看错误报告后,查询mapper.xml文件和接口文件,改为相同后解决;
收获
学习到了mybatis中的DAO编写和动态sql;
运行测试单元时,遇到一些系统报错,通过师兄的帮助和网上查询都圆满解决。知道了一些常见的坑,避免以后再次发生同样的错误;
评论