Mybatis入门
来源:互联网 发布:淘宝客推广个多少钱 编辑:程序博客网 时间:2024/05/24 07:00
Mybatis入门
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJO(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
配置Mybatis
pom.xml
若不用maven构建项目可以直接导入jar包:mybatis-x.x.x.jar。
使用Maven:需将下面的dependency 代码置于 pom.xml 文件中:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.0</version>
</dependency>
Configuration.xml
<configuration> <!--配置包的别名--> <typeAliases> <typeAlias alias="my.Student" type="com.seu.sun.model.Student"/> <!--<package name="com.seu.sun.model"/>--><!--也可以这样写包名--> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"> <property name="" value=""/> </transactionManager> <dataSource type="UNPOOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test"/> <property name="username" value="root"/> <property name="password" value="0000"/> </dataSource> </environment> </environments> <!--配置一个包含完整类路径的xml文件--> <mappers> <mapper resource="com/seu/sun/mybatisConfig/mapper/Student.xml"/> </mappers></configuration>
Student.xml
<!DOCTYPE mapper PUBLIC "-//com.seu.sun.mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--对应接口的包名接口名(无需实现)使用接口的用法--><mapper namespace="com.seu.sun.mybatisConfig.mapper.StudentMapper"> <resultMap type="my.Student" id="StudentsResult"> <id column="id" jdbcType="INTEGER" property="id"/> <result column="name" jdbcType="VARCHAR" property="name"/> <result column="age" jdbcType="INTEGER" property="age"/> <result column="hobby" jdbcType="VARCHAR" property="hobby"/> </resultMap> <select id="selectAll" resultMap="StudentsResult"> SELECT id,name,age,hobby FROM students </select> <select id="selectById" resultMap="StudentsResult"> SELECT id,name,age,hobby FROM students WHERE id=#{id} </select> <insert id="insert"> INSERT INTO students(name,age,hobby) VALUES (#{name},#{age},#{hobby}) </insert> <update id="updateById"> UPDATE students SET name = #{name},age=#{age} WHERE id=#{id} </update> <delete id="deleteById"> DELETE FROM students WHERE id=#{id} </delete> </mapper>
DBAccess.java
从 XML 中构建 SqlSessionFactory
用于连接数据库,获得sqlSession会话
/** * 访问数据库类 */public class DBAccess { public SqlSession getSqlSession() throws IOException { // 通过配置文件获取数据库连接信息 Reader reader = Resources.getResourceAsReader("com/seu/sun/mybatisConfig/Configuration.xml"); // 通过配置信息构建一个SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); // 通过sqlSessionFactory打开一个数据库会话 SqlSession sqlSession = sqlSessionFactory.openSession(); return sqlSession; }}
纯XML实现方法
testCRUD.java
编写增删改查的各个方法,对应Student.xml文件中映射的方法。
/** * 实现方法有XML和接口方法 */public class testCRUD { private static SqlSession sqlSession; public static void main(String[] args) throws IOException { DBAccess dbAccess = new DBAccess(); sqlSession=dbAccess.getSqlSession();// testSelect();// testSelectById();// testInsert();// testUpdateById();// testDeleteById(); useInterface(); sqlSession.close(); } /** * 增删改查操作 * 传入的类型参数可以为基本类型(一个),JavaBean(一个) * 当参数为多个时,可以使用Map(需要自己建立对应Key-Value) * 也可以是用@Param注解(接口的方法,下面介绍) * */ public static void testSelect(){ List<Student> list = new ArrayList<>();
//若冲突需要些写mapper的namespace list=sqlSession.selectList("selectAll"); for(Student s:list){ System.out.println(s.getName()+s.getHobby()); } } public static void testSelectById(){// Student s = new Student();// s.setId(6);//也可以传入Student对象,可以自动识别 Student s = sqlSession.selectOne("selectById",1); System.out.println(s.getName()+s.getHobby()); } public static void testInsert(){ Student s = new Student(); s.setAge(10);s.setHobby("跳舞");s.setName("小王"); sqlSession.insert("insert",s); sqlSession.commit(); } public static void testUpdateById(){ Student s = new Student(); s.setId(9); s.setAge(99);s.setHobby("没有");s.setName("小小"); //可以通过map对参数直接赋值// Map<String,Object> map = new HashMap<>();// map.put("name","xiaohua");map.put("id",9);map.put("age",20); sqlSession.update("updateById"); sqlSession.commit(); } public static void testDeleteById(){ sqlSession.delete("deleteById",10); sqlSession.commit(); }
接口配合XML实现
接口可以配合XML使用,也可以配合注解来使用。XML可以单独使用,注解必须在接口中使用。
写对应的接口,方法名即为student.xml中对应的方法id
StudentMapper.java
/** * 参数直接写在方法声明中,多个参数用@Param注解 */public interface StudentMapper { List<Student> selectAll(); Student selectById(int id); int insert(Student student); int updateById(@Param("id")int id,@Param("name")String name,@Param("age")int age); int deleteById(int id);}
testCRUD.java
public static void useInterface(){ StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class); studentMapper.selectAll(); studentMapper.selectById(1); Student s = new Student(); s.setId(3); s.setName("小花"); s.setHobby("待定"); s.setAge(13); studentMapper.insert(s); studentMapper.deleteById(11); studentMapper.updateById(9,"呵呵",18); sqlSession.commit();}
注解方式基本用法
Mybatis注解就是将SQL语句直接写在接口上。
优点:开发效率高
缺点:修改SQL都需要重新编译
student2.xml
<!--对应接口的包名+接口名(无需实现)--><mapper namespace="com.seu.sun.mybatisConfig.mapper.Student2Mapper"> <resultMap type="my.Student" id="StudentsResult"> <id column="id" jdbcType="INTEGER" property="id"/> <result column="name" jdbcType="VARCHAR" property="name"/> <result column="age" jdbcType="INTEGER" property="age"/> <result column="hobby" jdbcType="VARCHAR" property="hobby"/> </resultMap></mapper>
Student2Mapper.java
public interface Student2Mapper { @Select({"select id,name,age,hobby", "from students", "where id=#{id}"}) Student selectById(int id); @Select("select id,name,age,hobby from students") List<Student> selectAll(); @Insert("insert students (name,age,hobby) VALUES (#{name},#{age},#{hobby})") int insert(Student student); @Update("UPDATE students SET name = #{name},age=#{age} WHERE id=#{id}") int updateById(@Param("id")int id, @Param("name")String name, @Param("age")int age); @Delete("DELETE FROM students WHERE id=#{id}") int deleteById(int id);}
testCRUD.java
public static void useInterface2(){ Student2Mapper student2Mapper = sqlSession.getMapper(Student2Mapper.class); Student s = student2Mapper.selectById(1); System.out.println(s.getName()); for(Student stu:student2Mapper.selectAll()){ System.out.println(stu.getId()+stu.getName()); } s.setAge(100);s.setId(9); student2Mapper.insert(s); student2Mapper.deleteById(14); sqlSession.commit();}
阅读全文