JDBC存在的问题
数据库连接创建、释放频繁造成系统资源浪费
sql语句在代码中硬编码,不宜维护
MyBatis是一个持久层框架,对jdbc的操作数据库的过程进行封装。通过 xml 或注解的方式将要执行的各种 statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过 java 对象和 statement 中的 sql 进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射成 java 对象并返回。
select mapper都会有一个namespace,避免多个mapper冲突,而且这个namespace不可以重复。
id表示查询方法的唯一标识符,resultType定义返回值的类型,即调用sql的完整类名。
1 2 3 4 5 6 7 8 9 10 11 12 13 <?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 ="org.example.UserMapper" > <select id ="getUserById" resultType ="org.example.User" > SELECT * FROM user where id=#{id}; </select > </mapper >
下面文件属于mybatis的配置文件,需要自己创建,environments是mybatis所连接的数据库配置信息,environments可以有多个environment以对应不同的环境,每一个environment都有一个独属于自己的id。
在environments中可以通过default属性指定需要的environment,每一个environment定义一个数据的基本连接信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <?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 > <environments default ="development" > <environment id ="development" > <transactionManager type ="JDBC" /> <dataSource type ="POOLED" > <property name ="driver" value ="com.mysql.cj.jdbc.Driver" /> <property name ="url" value ="jdbc:mysql://localhost:3306/mybatis?serverTimezone=Asia/Shanghai& useSSL=false" /> <property name ="username" value ="root" /> <property name ="password" value ="root" /> </dataSource > </environment > </environments > <mappers > <mapper resource ="mapper.xml" /> </mappers > </configuration >
每个基于MyBatis的应用都是以一个SqlSessionFactory实例为核心。SqlSessionFactory实例可以通过SqlSessionFactoryBuilder加载配置文件获得。
MyBatis包含一个Resources工具类,其包含的方法从类路径或其他位置加载资源文件更容易。
SqlSession类提供了在数据库执行SQL命名所需的所有方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 package org.example;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.*;import java.io.IOException;public class Main { public static void main (String[] args) throws IOException { final String resource = "mybatis-config.xml" ; SqlSessionFactory sql=new SqlSessionFactoryBuilder ().build(Resources.getResourceAsStream(resource)); SqlSession session=sql.openSession(); User user=(User)session.selectOne("org.example.UserMapper.getUserById" ,1 ); System.out.println(user); session.close(); } } class User { private Integer id; private String name; @Override public String toString () { return "User [id=" + id + ", name=" + name + "]" ; } public Integer getId () {return id;} public void setId (Integer id) {this .id = id;} public String getName () {return name;} public void setName (String name) {this .name = name;} }
1 2 3 4 5 6 7 8 9 interface UserMapper { User getUserById (Integer id) ; } UserMapper userMapper=session.getMapper(UserMapper.class); User user=userMapper.getUserById(1 ); System.out.println(user); session.close();
注意:也可以不通过xml配置文件构建SqlSessionFactory,仅需要添加一个映射器类,但高级映射仍需要xml配置文件。
insert parameterType表示参数的类全限定名或别名(参数类型)。
useGeneratedKeys表示获取数据库生成的自增主键。(仅适用于 insert 和 update)
KeyProperty表示回填的属性名。(仅适用于 insert 和 update)
KeyColumn表示获得指定的数据库列名,与KeyProperty搭配,可以用逗号分隔多个列名;如果数据库列名和 Java 属性名相同可以省略。(仅适用于 insert 和 update)
1 2 3 4 5 6 7 8 9 10 11 12 13 <?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 ="org.example.user.UserMapper" > <insert id ="addUser" parameterType ="org.example.user.User" useGeneratedKeys ="true" keyProperty ="id" > insert into user(id,username) values (#{id},#{name}); </insert > </mapper >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 package org.example;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.*;import org.example.user.*;import java.io.IOException;public class Main { public static void main (String[] args) throws IOException { final String resource = "mybatis-config.xml" ; SqlSessionFactory sql=new SqlSessionFactoryBuilder ().build(Resources.getResourceAsStream(resource)); SqlSession session=sql.openSession(); UserMapper userMapper=session.getMapper(UserMapper.class); User user=new User (); user.setName("test1" ); int insert=userMapper.addUser(user); System.out.println(user); session.commit(); session.close(); } }
delete 1 2 3 4 <delete id ="delUser" parameterType ="int" > delete from user where id=#{id} </delete >
1 2 3 4 int deleteuser = userMapper.delUser(1 );System.out.println(deleteuser); session.commit(); session.close();