mybatis开发Dao
参考文献:https://blog.csdn.net/u013036274/article/details/55668317
原始dao方式
需要写dao接口和dao实现类。
- 创建dao接口:UserDao.java
package cn.itcast.mybatis.dao;
import cn.itcast.mybatis.po.Employee;
public interface UserDao {
public Employee findUserById(int id) throws Exception;
public void insertUser(Employee employee) throws Exception;
public void deleteUser(int id) throws Exception;
}
- 创建dao实现类:UserDaoImpl.java
package cn.itcast.mybatis.dao;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import cn.itcast.mybatis.po.Employee;
public class UserDaoImpl implements UserDao{
private SqlSessionFactory sqlSessionFactory;
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
@Override
public Employee findUserById(int id) throws Exception {
SqlSession sqlSession =sqlSessionFactory.openSession();
Employee employee = sqlSession.selectOne("test.findUserById",id);
sqlSession.close();
return employee;
}
@Override
public void insertUser(Employee employee) throws Exception {
SqlSession sqlSession =sqlSessionFactory.openSession();
sqlSession.insert("test.insertUser",employee);
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();
}
}
- 测试方法:
package cn.itcast.mybatis.dao;
import static org.junit.Assert.*;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import cn.itcast.mybatis.po.Employee;
public class UserDaoImplTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception{
String resource="SqlMapConfig.xml";
InputStream inputStream= Resources.getResourceAsStream(resource);
sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void test() throws Exception {
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
Employee employee = userDao.findUserById(3);
System.out.println(employee);
}
}
缺点:
接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来。
另外调用SqlSession方法时,将Statement的id硬编码了。
调用SqlSession方法时,传入的变量,由于SqlSession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于开发。
mapper代理方法
- xml映射文件 (
UserMapper.xml
)
①在mapper.xml中namespace等于mapper接口地址
②mapper.java接口中的方法名和mapper.xml中的Statement的id一致
③mapper.java接口中的方法输入参数类型和mapper.xml中Statement的parameterType指定类型一致
④mapper.java接口中的方法返回值类型和mapper.xml中Statement的resultType指定的类型一致
<mapper namespace="cn.itcast.mybatis.mapper.UserMapper">
<select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.Employee">
select id,username,sex,address from users where id=#{id};
</select>
- mapper接口,相当于dao接口(
UserMapper.java
)
package cn.itcast.mybatis.mapper;
import cn.itcast.mybatis.po.Employee;
public interface UserMapper {
public Employee findUserById(int id) throws Exception;
public java.util.List<Employee> findUserByName(String name) throws Exception;
public void insertUser(Employee employee ) throws Exception;
public void deleteUser(int id) throws Exception;
}
- 还需在
SqlMapConfig.xml
加载映射文件
<mapper resource="mapper/UserMapper.xml"/>
- 测试文件
package cn.itcast.mybatis.mapper;
import static org.junit.Assert.*;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import cn.itcast.mybatis.po.Employee;
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception{
String resource="SqlMapConfig.xml";
InputStream inputStream= Resources.getResourceAsStream(resource);
sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void test() throws Exception {
SqlSession sqlSession =sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Employee employee =userMapper.findUserById(2);
System.out.println(employee);
}
@Test
public void test1() throws Exception {
SqlSession sqlSession =sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
java.util.List<Employee> list =userMapper.findUserByName("zhao");
sqlSession.close();
System.out.println(list);
}
}
通过调用单独的文件连接数据库
SqlMapConfig.xml
<properties resource="db.properties"></properties>
<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>
-
db.properties
(和SqlMapConfig.xml
在同一目录下)
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8
jdbc.username=root
jdbc.password=
pojo包装类型实现
-
UserMapper.xml
(定义用户信息综合查询,查询条件复杂)
<select id="findUserList" parameterType="cn.itcast.mybatis.po.UserQueryVo" resultType="cn.itcast.mybatis.po.EmployeeCustom">
select id,username,sex,address from users where sex= #{employeeCustom.sex} and username like '%${employeeCustom.username}%';
</select>
-
UserQueryVo.java
(包装对象)
package cn.itcast.mybatis.po;
public class UserQueryVo {
private EmployeeCustom employeeCustom;
public EmployeeCustom getEmployeeCustom() {
return employeeCustom;
}
public void setEmployeeCustom(EmployeeCustom employeeCustom) {
this.employeeCustom = employeeCustom;
}
}
EmployeeCustom.java
package cn.itcast.mybatis.po;
public class EmployeeCustom extends Employee{
}
测试文件
@Test
public void test1() throws Exception {
SqlSession sqlSession =sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//创建包装对象,设置查询条件
UserQueryVo userQueryVo= new UserQueryVo();
EmployeeCustom employeeCustom=new EmployeeCustom();
employeeCustom.setSex("nv");
employeeCustom.setUsername("zhou");
userQueryVo.setEmployeeCustom(employeeCustom);
//调用userMapper的方法
java.util.List<EmployeeCustom> list =userMapper.findUserList(userQueryVo);
sqlSession.close();
System.out.println(list);
}
动态sql判断
-
UserMapper.xml
(判断传入的sex和username是否为空,若是空则不进行拼接)
<select id="findUserList" parameterType="cn.itcast.mybatis.po.UserQueryVo" resultType="cn.itcast.mybatis.po.EmployeeCustom">
select id,username,sex,address from users
<where>
<if test="employeeCustom!=null">
<if test="employeeCustom.sex!=null and employeeCustom.sex!=''">
and sex= #{employeeCustom.sex}
</if>
<if test="employeeCustom.username!=null and employeeCustom.username!=''">
and username like '%${employeeCustom.username}%';
</if>
</if>
</where>
</select>
- 测试文件
@Test
public void test1() throws Exception {
SqlSession sqlSession =sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
UserQueryVo userQueryVo= new UserQueryVo();
EmployeeCustom employeeCustom=new EmployeeCustom();
//employeeCustom.setSex("nv");//注释此句后,查询语句中没有sex这个条件
employeeCustom.setUsername("zhou");
userQueryVo.setEmployeeCustom(employeeCustom);
java.util.List<EmployeeCustom> list =userMapper.findUserList(userQueryVo);
sqlSession.close();
System.out.println(list);
}
** 进行select * from users where id=1 or id=10 or id=11 ;**
- 在上面的
UserMapper.xml
中添加
<if test="ids!=null">
<!-- collection:指定输入对象中集合属性 item:每个遍历生成对象中 open:开始遍历时拼接串
close:结束遍历时拼接的串 separator:遍历两个对象须拼接的串
实现拼接 AND (id=1 or id=10 or id=13) -->
<foreach collection="ids" item="user_id" open="AND (" close=")" separator="or">
id=#{user_id}
</foreach>
- 测试文件
@Test
public void test1() throws Exception {
SqlSession sqlSession =sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
UserQueryVo userQueryVo= new UserQueryVo();
EmployeeCustom employeeCustom=new EmployeeCustom();
//employeeCustom.setSex("nv");
employeeCustom.setUsername("zhou");
java.util.List<Integer> ids =new ArrayList<Integer>();
ids.add(1);
ids.add(10);
ids.add(14);
userQueryVo.setIds(ids);
userQueryVo.setEmployeeCustom(employeeCustom);
java.util.List<EmployeeCustom> list =userMapper.findUserList(userQueryVo);
sqlSession.close();
System.out.println(list);
}

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
完美解决setInterval在浏览器切换时加速的问题
JavaScript中当我们切换浏览器的时候,setInterval会加快速度 导致这个原因是: 发现这是因为浏览器本着节省内存的性质,当切换到其他页面时,采油系统页面的定时器不运动,但是动画依然排列,当切换回来的时候,动画加速运动,出现错误,在轮播图之类的页面经常会发生这样的情况 在这里我们需要用到以下三个知识点: document.onvisibilitychange : 只要页面发生变化,不管是切换到其他的页面还是把浏览器缩小,都会触发这个事件。 document.hidden 这个是指当页面不是当前页面时为true,否则为false document.visibilityState: 这个属性有四个值,分为是:visible,hidden,prerender,unloaded visible 表示当前网页是可见或者是部分可见的。 hidden:当前网页是不可见的 prerender 网页内容被预渲染并且用户不可见 unloaded 如果文档被卸载,那么这个值将被返回 实际操作效果如下: document.onvisibilitychange=function(){ consol...
-
下一篇
mybatis的逆向工程自动生成代码
参考文献:https://blog.csdn.net/yerenyuan_pku/article/details/71909325 逆向工程: MyBatis需要程序员自己编写sql,如果表太多的话,会很麻烦。所以mybatis官方提供了一个逆向工程,可以针对单表自动生成mybatis执行所需要的代码(包括mapper.xml、mapper.java、po..)。通过数据库的表生成代码,这个真的是很方便,感觉前几天看了那么久的mybatis整合的我有点傻。。 目录结构 7.png 导入需要的jar包: mybatis-generator-core-1.3.5.jar 配置逆向工程的配置文件mbg.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-co...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8编译安装MySQL8.0.19
- MySQL数据库在高并发下的优化方案
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果