目录
代理Dao方式的增删改查
1. 创建项目
$$1. 在sql.xml里增加日志代码以及user的mapper资源。
$$ 2. 在usermapper里引入接口。
$$3. 在测试类中引入以下代码,并修改其中名字。
$$ 4. 实例对象User.java里属性要与表中列严格对应。
2. 查询
1>. 查询所有
2>. 通过id查询
3>. 通过username查询
4>. 分页查找
5>.不同类型查询
6>.计数
3. 插入
4. 修改
5. 删除
代理Dao方式的增删改查
1. 创建项目
这里以上一博客中配置batis创建的user表为例。
创建UserDao接口,创建User实例对象,创建mybatis.xml和sql.xml mapper类以及测试类
$$1. 在sql.xml里增加日志代码以及user的mapper资源。
代码:
<settings> <setting name="cacheEnabled" value="true"/> <setting name="logImpl" value="STDOUT_LOGGING" /> </settings>
<mapper resource="mapper/UserMapper.xml"></mapper>
$$ 2. 在usermapper里引入接口。
$$3. 在测试类中引入以下代码,并修改其中名字。
代码:
private InputStream in = null; private SqlSession session = null; private UserDao mapper = null; @Before //前置通知, 在方法执行之前执行 public void init() throws IOException { //加载主配置文件,目的是为了构建SqlSessionFactory对象 in = Resources.getResourceAsStream("SqlMapConfig.xml"); //创建SqlSessionFactory对象 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); //通过SqlSessionFactory工厂对象创建SqlSesssion对象 session = factory.openSession(); //通过Session创建UserDao接口代理对象 mapper = session.getMapper(UserDao.class); } @After //@After: 后置通知, 在方法执行之后执行 。 public void destory() throws IOException { //释放资源 session.close(); in.close(); }
$$ 4. 实例对象User.java里属性要与表中列严格对应。
生成访问器与更改器以及toString()。
2. 查询
1>. 查询所有
<!-- id后跟方法的名字 --> <!-- parameterType 入参的类型-->
resultType返回结果类型
<select id="findAll" resultType="com.qcby.entity.User">
select * from user;
</select>
在接口那写相应的方法(找到的有很多,所以用List接,因为返回的是对象。List<User>)
List<User> findAll();
测试:
mapper.findAll().var回车
@Test
public void findAll(){
List<User> users = mapper.findAll();
for(User user:users){
System.out.println(user.toString());
}
}
2>. 通过id查询
d是int型,故入参类型为int型,返回实例对象。
<select id="findById" resultType="com.qcby.entity.User" parameterType="int">
select * from user where id=#{id}
</select>
因为通过id查,最后输出的对象只有一个,所以不用List接,用User对象接就好。
User findById(int id);
测试:
@Test
public void findById(){
User user=mapper.findById(1);
System.out.println(user.toString());
}
3>. 通过username查询
入参类型为String类,java中,String在java/lang包下。
<select id="findByUserName" resultType="com.qcby.entity.User" parameterType="java.lang.String">
select * from user where username=#{username}
</select>
可能有很多重名的,所以用List接。
List<User> findByUserName(String username);
测试:
@Test
public void findByUserName(){
List<User> users = mapper.findByUserName("熊大");
for(User user:users){
System.out.println(user.toString());
}
}
4>. 分页查找
当数据库数据量比较大时,前台分页显示
select * from user limit pageSize offset pageStart
<select id="findPage" resultType="com.qcby.entity.User" parameterType="int">
select * from user limit #{pageSize} offset #{pageStart}
</select>
两个都是int型,故入参为int型。
在这里,需要用注解区分两个参数
List<User> findPage(@Param("pageSize") int pageSize,@Param("pageStart") int pageStart);
测试:
@Test
public void findPage(){
int pageSize=2;//每页显示的数据量
int pageIndex=1;//当前是第1页
int pageStart = pageSize*(pageIndex-1);
List<User> users = mapper.findPage(pageSize, pageStart);
for(User user:users){
System.out.println(user.toString());
}
}
5>.不同类型查询
不同类型时,入参为实例对象。
<select id="findByUserNameAndId" resultType="com.qcby.entity.User" parameterType="com.qcby.entity.User">
select * from user where username=#{username} and id=#{id}
</select>
List<User> findByUserNameAndId(User user);
测试:
@Test
public void findByUserNameAndId(){
User user=new User();
user.setId(1);
user.setUsername("老王");
List<User> users = mapper.findByUserNameAndId(user);
for(User u:users){
System.out.println(user.toString());
}
}
6>.计数
这里不用传参,结果为int型。
<select id="getCount" resultType="int">
select count(*) from user;
</select>
int getCount();
测试:
@Test
public void getCount(){
System.out.println(mapper.getCount());
}
3. 插入
传参为实例对象,不需要输出结果。
<insert id="insert" parameterType="com.qcby.entity.User">
insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address})
</insert>
int insert(User user);
测试:
在实例对象类里,生成构造器(不包含id)
注意!!需要session事务提交。
@Test
public void insert(){
User user=new User("aa",new Date(),"男","保定");
mapper.insert(user);
session.commit();//事务提交
}
4. 修改
同样,修改也不需要输出结果。
<update id="update" parameterType="com.qcby.entity.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
</update>
int update(User user);
测试:
在实例对象类里,生成构造器(包含id)。
注意!!需要session事务提交。
@Test
public void update(){
User user=new User(5,"bb",new Date(),"男","保定");
mapper.update(user);
session.commit();
}
5. 删除
删除靠 id,因此入参类型为int型。
<delete id="delete" parameterType="int">
delete from user where id=#{id}
</delete>
int delete(int id);
测试:
注意!!需要session事务提交。
@Test
public void delete(){
mapper.delete(6);
session.commit();
}