MyBatis学习笔记
来源:互联网 发布:官方双色球选号软件 编辑:程序博客网 时间:2024/06/05 17:23
1.MyBatis是通过接口调用的方式来对数据库进行操作,这里的接口通常定义为Mapper,在Mapper中,参数通常只有一个,关于多参数的问题,在文末做重点笔记,如StudentMapper,这里面通常只是定义一些数据库的操作,不做具体实现,如StudentMapper:
import java.util.List;import com.java1234.model.Student;public interface StudentMapper { public int add(Student student); public int delete(int id); public int modefiy(Student student); public Student query(int i); public List<Student> findAll();}
对应接口的每个方法,在对应接口的Mapper.xml文件中都定义具体的SQL语句的实现,这里尤为注意的是List这类的数据返回我们自定义了一个返回数据型resultMap:
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.java1234.mapper.StudentMapper"> <!-- 自定义一个用于返回List数据类型resultMap --> <resultMap type="Student" id="StudentResult"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="age" column="age"/> </resultMap> <!--id即接口中的方法名,parameterType表示的是传入参数的数据类型,前面有配置过Student的全类名的别称,就方便这里的引用 --> <insert id="add" parameterType="Student" > insert into tb_student values(null,#{name},#{age}) </insert> <delete id="delete" parameterType="Integer" > delete from tb_student where id=#{id} </delete> <update id="modefiy" parameterType="Student" > update tb_student set name=#{name},age=#{age} where id=#{id} </update> <select id="query" parameterType="Integer" resultType="Student"> select * from tb_student where id=#{id} </select> <select id="findAll" resultMap="StudentResult"> select * from tb_student </select></mapper>
2.在对接口的方法做具体实现的时候,可以通过SqlSession的对象对数据库做直接实现:
public class StudentTestWithJunit { private static Logger logger = Logger.getLogger(StudentTestWithJunit.class); private SqlSession sqlSession = null; //这里获取的是一个接口 private StudentMapper studentMapper = null; @Before public void setUp() throws Exception { sqlSession = SqlSessionFactoryUtil.openSession(); studentMapper = sqlSession.getMapper(StudentMapper.class); } @After public void tearDown() throws Exception { sqlSession.close(); } //添加 @Test public void testAdd() { logger.info("添加学生"); Student student = new Student("赵六", 22); int result = studentMapper.add(student); if(result==1){ logger.info("添加成功"); }else{ logger.info("添加失败"); } sqlSession.commit(); } //删除 @Test public void testDelete(){ logger.info("删除学生"); int result = studentMapper.delete(7); if(result==1){ logger.info("删除成功"); }else{ logger.info("删除失败"); } sqlSession.commit(); } //编辑 @Test public void testModefiy(){ logger.info("编辑学生"); Student s = new Student(3, "test2", 88); int result = studentMapper.modefiy(s); if(result==1){ logger.info("编辑成功"); }else{ logger.info("编辑失败"); } sqlSession.commit(); } //查询 @Test public void testList(){ logger.info("查询学生"); Student result = studentMapper.query(60); if(result!=null){ logger.info("查询成功"); System.out.println(result); }else{ logger.info("查询失败:未查到对象"); } sqlSession.commit(); } //查询所有 @Test public void testFindAll(){ logger.info("查询所有学生"); List<Student> result = studentMapper.findAll(); for(Student s:result){ System.out.println(s); } sqlSession.commit(); }}
3.具体的SqlSession工具类就是封装了一个获取SqlSession的工具类:
public class SqlSessionFactoryUtil { private static SqlSessionFactory sqlSessionFactory; //获取SqlSessionFactory public static SqlSessionFactory getSqlSessionFactory(){ if(sqlSessionFactory==null){ InputStream is = null; try { //以流的形式读取配置文件 is = Resources.getResourceAsStream("mybatis-config.xml"); sqlSessionFactory = new SqlSessionFactoryBuilder().build(is); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return sqlSessionFactory; } //最终通过Session来操作数据库 public static SqlSession openSession(){ return getSqlSessionFactory().openSession(); }}
4.MyBatis的配置文件
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration> <!--引入数据库的外部配置文件 --> <properties resource="jdbc.properties" /> <!-- 为com.java1234.model.Student起一个别名:Student,可以用alias随意指定别名,在映射文件中会有用到,如: <typeAliases> <typeAlias alias="Student" type="com.java1234.model.Student" /> </typeAliases>; 这种方式只能一个类一个类的配置,如果类很多就用Package标签来起别名,这里的别名都是取的是包下class文件的文件名,不可随意指定 如(推荐使用): <typeAliases> <package name="com.java1234.model"/> </typeAliases> 如果com.java1234.model包下有Student类和User类,那么会自动扫描取别名为:Student和User --> <typeAliases> <package name="com.java1234.model"/> </typeAliases> <environments default="development"> <environment id="development"> <!--transactionManager事务管理器 --> <transactionManager type="JDBC" /> <!-- 配置dataSource,其中POOLED表示使用数据库连接池,UNPOOLED则表示不用数据库连接池(新建连接,用完关闭,只适合小并发), JNDI表示使用应用服务器JNDI数据源来获取数据库连接 --> <dataSource type="POOLED"> <!-- 这里使用外部文件配置,也可以直接使用<property name="jdbc.username" value="root" /> --> <property name="driver" value="${jdbc.driverClass}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.userName}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments> <!-- 配置映射文件,因为开发中使用的映射文件很多,推荐使用如下方式,可以自动扫描包下的所有映射文件, 如果映射文件不多,则可以使用 <mappers> <mapper resource="com/java1234/mapper/StudentMapper.xml" /> </mappers> 这样的方式单独配置 --> <mappers> <package name="com.java1234.mapper"/> </mappers></configuration>
注意:关于Mapper中多参数的问题:
1.如果参数是两个或者多个,通常会将多个参数封装在一个Map中,通过key-value的形式传递到Mapper.xml中,比如在StudentMapper中定义了一个通过学生姓名和年龄这两个参数去查询学生:
public Student findStudent(Map<String, Object> map);
Mapper.xml中是正常调用:
<!-- 物理分页 --> <select id="findUsers2" parameterType="Map" resultMap="UserResult"> select * from t_user <if test="start!=null and size!=null"> limit #{start},#{size} </if> </select>
这里面传入的是一个Map,在xml中通过Map中的key来调用相应的参数,因为在调用该接口的时候必定已经对传入的Map进行过赋值,并且定义了两个key为start和size,下面看调用的流程:
//物理分页,开发中常用 @Test public void testFindUsers2(){ logger.info("物理分页查询"); Map<String, Object> map = new HashMap<String, Object>(); map.put("start", 0); map.put("size", 3); List<User> users = userMapper.findUsers2(map); for(User user:users){ System.out.println(user); } }
2.当然也可以直接传入参数调用,Mapper中定义的方法为:
public List<User> searchUser(String name, Integer age);
这里没用封装name和age这两个属性,而是直接传进去了,那么要特别注意Mapper.xml中的调用方式:
<!-- 多参数查询,不指定参数类型,用内置的param1这样的参数--> <select id="searchUser" resultMap="UserResult"> <!-- 模糊查询的时候没有用等号 --> select * from t_user where name like #{param1} and age=#{param2} </select>
注意!注意!这里不能用#{name} and age=#{age},而是用#{param1} and age=#{param2}!!
调用时正常调用即可:
@Test public void testsearchUser(){ logger.info("查询用户"); List<User> users = userMapper.searchUser("%四%", 22); for(User user:users){ System.out.println(user); } }
这里做简单的介绍,java中正常都是将参数名指定为arg0,arg1这样的形式,所以只能用MyBatis中内置的param1、param2这样的形式!
- mybatis 学习笔记
- MyBatis学习笔记
- mybatis学习笔记---入门
- MyBatis 学习笔记
- Mybatis学习笔记
- 【MyBatis学习笔记】系列
- Mybatis学习笔记
- mybatis学习笔记
- mybatis学习笔记
- MyBatis 学习笔记
- mybatis学习笔记
- mybatis学习笔记
- MyBatis学习笔记
- mybatis学习笔记
- Mybatis框架学习笔记
- Mybatis学习笔记
- MyBatis学习笔记
- MyBatis 学习笔记
- shell中单引号、双引号、反引号的区别
- JS部分高阶函数的运用及解析
- Eclipse中安装新的repository库,并本地库jar上传nexus中
- pwnable.tw刷题之dubblesort
- 算法(递归)--汉诺塔
- MyBatis学习笔记
- maven仓库--私服(Nexus的配置使用)
- dfs枚举 + 最小生成树 hdoj2489 Minimal Ratio Tree
- nginx模块之计算HTTP首包响应时间
- 如何删除本地的git仓库 和 github的仓库
- CodeForces808a_水(求整数长度)
- CAS 在 Tomcat 中实现单点登录
- cf 807C Success Rate
- HDU