mybatis教程1(基本使用)
2019-01-23 11:58
232 查看
一、什么是 MyBatis ?
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
二、mybatis和hibernate的比较
mybatis | hibernate |
---|---|
半自动ORM框架 | 全自动ORM框架 |
必须写SQL | 可以不写SQL |
事务处理 | 事务处理 |
缓存都支持 | 缓存都支持,二级缓存比mybatis更好 |
三、入门案例
1.创建maven工程,添加对应jar包
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.27</version> </dependency> </dependencies>
2.创建全局配置文件
该配置文件包含了对 MyBatis 系统的核心设置,包含获取数据库连接实例的数据源(DataSource)和决定事务作用域和控制方式的事务管理器TransactionManager)。XML 配置文件的详细内容后面再探讨,这里先给出一个简单的示例
<?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.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/ssm?characterEncoding=utf-8"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> </configuration>
配置允许其他用户连接mysql:
grant all privileges on . to 'root'@'%' identified by '123456' with grant option;
flush privileges;
3.定义User对象
4.创建映射文件
<?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="dpb"> <insert id="addUser" parameterType="com.sxt.dao.User"> insert into t_user(name,age)values(#{name},#{age}) </insert> <delete id="deleteUserById" parameterType="java.lang.Integer"> delete from t_user where id=#{id} </delete> <update id="updateUserById" parameterType="com.sxt.dao.User"> update t_user set name = #{name} where id=#{id} </update> <select id="getUserById" parameterType="java.lang.Integer" resultType="com.sxt.dao.User"> select * from t_user where id=#{id} </select> </mapper>
5.将映射文件添加到主配置文件中
<?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.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/ssm"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!-- 注册映射文件 --> <mappers> <mapper resource="com/sxt/dao/UserMapper.xml"/> </mappers> </configuration>
6.测试
@Test public void add() throws IOException { // 1.通过Resources对象加载配置文件 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); // 2.获取SqlSessionFactory对象 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream ); // 3.通过SqlSessionFactory对象获取SQLSession对象 SqlSession session = factory.openSession(); User user = new User(); user.setName("dpb"); user.setAge(22); // dpb.addUser 是映射文件中 namespace的内容加 id的内容,定位要执行的SQL int count = session.insert("dpb.addUser", user); System.out.println("影响的行数:"+count); // 需要显示的提交 session.commit(); session.close(); } }
7.查询,修改,删除操作
public class Test02 { private SqlSession sqlSession; @Before public void before() throws IOException { // 1. 加载配置文件 InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); // 2. 根据配置文件获取一个SqlSessionFactory对象,这个对象相当于连接工厂 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is); // 3. 获取一个sqlsession,sqlsession类似于之前学过的Connection sqlSession = sqlSessionFactory.openSession(); } @After public void after() { sqlSession.commit(); sqlSession.close(); } @Test public void test1() { User user = new User(); user.setId(7); user.setName("里斯1"); int update = sqlSession.update("dpb.updateUserById", user); System.out.println(update); } @Test public void test2() { int delete = sqlSession.delete("dpb.deleteUserById", 7); System.out.println(delete); } @Test public void test3() { User user = (User) sqlSession.selectOne("dpb.getUserById", 8); System.out.println(user); } }
四、案例优化
1.获取SqlSessionFactory对象的方式
SqlSessionFactory在一个服务中只需要有一个实例就可以了,此时可以通过单例的模式获取
/** * 工具类 对外提供SqlSessionFactory的单例对象 * @author dengp * */ public class DbUtils { private static SqlSessionFactory factory ; public static SqlSessionFactory getInstace(){ if(factory ==null){ InputStream in = null; try{ in = Resources.getResourceAsStream("mybatis-config.xml"); }catch(Exception e){ e.printStackTrace(); } synchronized (DbUtils.class) { if(factory ==null){ factory = new SqlSessionFactoryBuilder().build(in); } } } return factory; } }
2.整理CRUD操作
public interface UserMapper { public int addUser(User user); public int updateById(User user); public int deleteById(int id); public User queryById(int id); }
public class UserDao implements UserMapper { @Override public int addUser(User user) { return DBUtils.getInstall().openSession().insert("com.sxt.dao.UserMapper.addUser", user); } @Override public int updateById(User user) { // TODO Auto-generated method stub return DBUtils.getInstall().openSession().update("com.sxt.dao.UserMapper.updateById", user); } @Override public int deleteById(int id) { // TODO Auto-generated method stub return DBUtils.getInstall().openSession().delete("com.sxt.dao.UserMapper.deleteById", id); } @Override public User queryById(int id) { // TODO Auto-generated method stub return DBUtils.getInstall().openSession().selectOne("com.sxt.dao.UserMapper.queryById", id); } }
<?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="com.sxt.dao.UserMapper"> <insert id="addUser" parameterType="com.sxt.bean.User"> insert into t_user(name,age)values(#{name},#{age}) </insert> <delete id="deleteById" parameterType="java.lang.Integer"> delete from t_user where id=#{id} </delete> <update id="updateById" parameterType="com.sxt.bean.User"> update t_user set name=#{name},age=#{age} where id=#{id} </update> <select id="queryById" parameterType="java.lang.Integer" resultType="com.sxt.bean.User"> select * from t_user where id=#{id} </select> </mapper>
/** * 代理方式 */ @Test public void test(){ UserMapper mapper = (UserMapper) Proxy.newProxyInstance(UserMapper.class.getClassLoader() , new Class[]{UserMapper.class},new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(UserMapper.class.getName()+"."+method.getName()); Object id = null; for (Object object : args) { System.out.println(object); id = object; } // 实现逻辑 return DBUtils.getInstall().openSession().selectOne(UserMapper.class.getName()+"."+method.getName(), id); } } ); System.out.println(mapper.queryById(5)); }
==可行!!!==
五、mybatis接口的使用方式
通过前面UserDao的设计,可以发现,UserDao中的代码都是模板化代码,都可以通过配置自动生成,因此,在实际开发中,Mapper可以按照如下方式设计
1.定义Mapper接口
Mapper接口中,只需要声明方法名,方法参数、方法返回等信息
public interface UserMapper { public int addUser(User user); }
2.定义映射文件
<?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"> <!-- 使用接口 代理的方式 namespace必须和接口的全路径名称一致 --> <mapper namespace="com.sxt.dao.UserMapper"> <!-- id必须和接口声明的方法一致 --> <insert id="addUser" parameterType="com.sxt.bean.User"> insert into t_user(name,age)values(#{name},#{age}) </insert> </mapper>
3.测试
@Test public void add() throws IOException { // 1.通过Resources对象加载配置文件 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); // 2.获取SqlSessionFactory对象 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream ); // 3.通过SqlSessionFactory对象获取SQLSession对象 SqlSession session = factory.openSession(); User user = new User(); user.setName("dpb"); user.setAge(22); //通过Java动态代理自动提供了UserMapper的实现类 UserMapper mapper = session.getMapper(UserMapper.class); int count = mapper.addUser(user); System.out.println("影响的行数:"+count); session.commit(); }
注意:
使用mapper接口方式必须满足:
1.映射文件的namespace的值必须是接口的全路径名称
比如:com.dpb.dao.UserMapper
2.接口中的方法名在映射文件中必须有一个id值与之对应。
==数据添加成功==
相关文章推荐
- MyBatis教程之一基本使用入门
- SERV-U 7 的安装和基本使用方法教程
- [转]CGIC简明教程1:使用CGIC的基本思路
- mysql 基本使用教程(源于网络)
- Log4j 基本使用教程
- CodeSmith 使用教程(7): 基本语法-转义Asp.Net标记
- 【Lucene4.8教程之一】使用Lucene4.8进行索引及搜索的基本操作
- 织梦CMS安装使用教程 系统基本参数设置之附件设置
- FlashFXP基本使用教程
- mysql 基本使用教程(源于网络)
- FFMEG开发教程--(01)ffmpeg基本使用流程
- 幻世(OurDream)2D图形引擎使用教程4——基本图形的绘制
- Mybatis基本使用
- 【Lucene4.8教程之一】使用Lucene4.8进行索引及搜索的基本操作
- 网站数据库Navicat For MySQL V8 简体中文版基本使用教程
- CGIC简明教程1:使用CGIC的基本思路
- 学习Emacs系列教程(一):基本使用
- 学习Emacs系列教程(一):基本使用
- CodeSmith 使用教程(5): 基本语法-使用注释
- msdn教程-.net framework4.5-使用基本类型