Mybaties学习
基于现在Mybatis 我没有学习太多,就基于简单的增删改查进行基础学习。
学习资源来自 http://www.cnblogs.com/xdp-gacl/p/4261895.html
1 引入jar包
【mybatis】
mybatis-3.1.1.jar
【MYSQL驱动包】
mysql-connector-java-5.1.7-bin.jar
2 2 建立对应数据库表
3 在src目录创建配置文件conf.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://127.0.0.1:3306/mybatis" />
- <property name="username" value="root" />
- <property name="password" value="s1127736971" />
- </dataSource>
- </environment>
- </environments>
- <mappers><!-- 这里下面是mapper的注册-->
- <mapper resource="my/Mapper/userMapper.xml"/>
- <!-- <mapper resource="my.Mapper.userMapper2"/> 记得用class 这是错误的-->
- <mapper class="my.Mapper.userMapper2"/>
- </mappers>
- </configuration>
4 编写对应的User类
- package my.domain;
- public class User {
- private int id;
- private String name;
- private int age;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- @Override
- public String toString() {
- return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
- }
- }
5 编写对应的映射文档Mapper(xml) 之后在对应的conf中添加Mapper(上面已经写好)
- <?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,namespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的
- 例如namespace="me.gacl.mapping.userMapper"就是me.gacl.mapping(包名)+userMapper(userMapper.xml文件去除后缀)
- -->
- <mapper namespace="my.Mapper.userMapper">
- <!-- 在select标签中编写查询的SQL语句, 设置select标签的id属性为getUser,id属性值必须是唯一的,不能够重复
- 使用parameterType属性指明查询时使用的参数类型,resultType属性指明查询返回的结果集类型
- resultType="me.gacl.domain.User"就表示将查询结果封装成一个User类的对象返回
- User类就是users表所对应的实体类
- -->
- <!--
- 根据id查询得到一个user对象
- -->
- <select id="getUser" parameterType="int"
- resultType="my.domain.User">
- select * from users where id=#{id}
- </select>
- <insert id="insertUser" parameterType="my.domain.User">
- insert into users(name,age) values(#{name},#{age})
- </insert>
- <delete id="deleteUser" parameterType="int">
- delete from users where id=#{id}
- </delete>
- <update id="updateUser" parameterType="my.domain.User">
- update users set name=#{name},age=#{age} where id=#{id}
- </update>
- <select id="getUsers" resultType="my.domain.User">
- select * from users
- </select>
- </mapper>
编写测试类
- package Test;
- import static org.junit.Assert.*;
- import java.io.IOException;
- import java.io.Reader;
- import java.util.Collection;
- import my.Mapper.userMapper2;
- import my.domain.User;
- 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.Test;
- public class test2 {
- // Reader reader = Resources.getResourceAsReader(config); 这个方法是错误的,大概是里面不能用静态?
- //SqlSessionFactory sqlFactory = new SqlSessionFactoryBuilder().build(reader);
- //SqlSession sqlSession = sqlFactory.openSession();
- public SqlSession getSqlSession() throws IOException{
- String config = "conf.xml";
- Reader reader = Resources.getResourceAsReader(config);
- SqlSessionFactory sqlFactory = new SqlSessionFactoryBuilder().build(reader);
- return sqlFactory.openSession();
- }
- @Test
- public void add() throws IOException {
- SqlSession sqlSession = getSqlSession();
- String statement = "my.Mapper.userMapper.insertUser";
- User user = new User();
- user.setAge(10);
- user.setName("猛虎捕食");
- sqlSession.insert(statement, user);
- sqlSession.commit();//需要commit 不然没有效果,教程却不用?
- sqlSession.close();
- }
- @Test
- public void update() throws IOException{
- SqlSession sqlSession = getSqlSession();
- String statement = "my.Mapper.userMapper.updateUser";
- User user = new User();
- user.setId(1);
- user.setAge(10);
- user.setName("这是改后");
- sqlSession.update(statement, user);
- sqlSession.commit();
- sqlSession.close();
- }
- @Test
- public void delete() throws IOException{
- SqlSession sqlSession = getSqlSession();
- String statement = "my.Mapper.userMapper.deleteUser";
- sqlSession.delete(statement, 10);
- sqlSession.commit();
- sqlSession.close();
- }
- @Test
- public void queryAll() throws IOException{//这是第二种方式写的用法
- SqlSession sqlSession = getSqlSession();
- String statement = "my.Mapper.userMapper.getUsers";
- Collection<User> users = sqlSession.selectList(statement);
- System.out.println(users);
- sqlSession.close();
- }
- @Test
- public void insert () throws IOException{
- SqlSession sqlSession = getSqlSession();
- userMapper2 mapper = sqlSession.getMapper(userMapper2.class);
- User user = new User();
- user.setAge(15);
- user.setName("猛虎爬树");
- int result = mapper.add(user);
- sqlSession.commit();
- sqlSession.close();
- System.out.println(result);
- }
- }
工程大概目录
mybatis的语句还有另一种写法
基于注解的实现,首先要先写出映射接口
- package my.Mapper;
- import java.util.List;
- import my.domain.User;
- import org.apache.ibatis.annotations.Delete;
- import org.apache.ibatis.annotations.Insert;
- import org.apache.ibatis.annotations.Select;
- import org.apache.ibatis.annotations.Update;
- public interface userMapper2 {
- @Insert("insert into users(name,age) values(#{name},#{age})")
- public int add(User user);
- @Delete(" delete from users where id=#{id}")
- public int delete();
- @Update("update users set name=#{name},age=#{age} where id= #{id}")
- public int update();
- @Select("select * from users")
- public List<User>getAll();
- }
之后直接在上面的conf.xml文件添加类后缀的配置
代码简单测试在上面测试类的之后一个方法,到这完成基本增删改查配置。
注意点:
sqlSessionFactory需要commit 和close才能成功
基本流程是,用mybatis的Resouces读取配置文件来开启SqlSession,选择需要执行的语句,SqlSession提交执行语句。
注解形式则不是选择执行语句,而是选择对应接口类。
mybatis的自动生成。。。懒人福利
下载对应jar包 ,在配置好generatorConfig,运行,自动生成Dao(mapper) 、实体类、xml配置。
generatorConfig 模板如下
- <?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-config_1_0.dtd">
- <generatorConfiguration>
- <!-- 数据库驱动-->
- <classPathEntry location="mysql-connector-java-5.0.8-bin.jar"/>
- <context id="DB2Tables" targetRuntime="MyBatis3">
- <commentGenerator>
- <property name="suppressDate" value="true"/>
- <!-- 是否去除自动生成的注释 true:是 : false:否 -->
- <property name="suppressAllComments" value="true"/>
- </commentGenerator>
- <!--数据库链接URL,用户名、密码 -->
- <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1:3306/mybatis" userId="root" password="s1127736971">
- </jdbcConnection>
- <javaTypeResolver>
- <property name="forceBigDecimals" value="false"/>
- </javaTypeResolver>
- <!-- 生成模型的包名和位置-->
- <javaModelGenerator targetPackage="com.book.pojo" targetProject="src">
- <property name="enableSubPackages" value="true"/>
- <property name="trimStrings" value="true"/>
- </javaModelGenerator>
- <!-- 生成映射文件的包名和位置-->
- <sqlMapGenerator targetPackage="com.book.mapping" targetProject="src">
- <property name="enableSubPackages" value="true"/>
- </sqlMapGenerator>
- <!-- 生成DAO的包名和位置-->
- <javaClientGenerator type="XMLMAPPER" targetPackage="com.book.dao" targetProject="src">
- <property name="enableSubPackages" value="true"/>
- </javaClientGenerator>
- <!-- 要生成的表 tableName是数据库中的表名或视图名 domainObjectName是实体类名-->
- <table tableName="users" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
- </context>
- </generatorConfiguration>
Mybaties学习的更多相关文章
- spring学习 六 spring与mybatis整合
在mybatis学习中有两种配置文件 :全局配置文件,映射配置文件.mybatis和spring整合,其实就是把mybatis中的全局配置文件的配置内容都变成一个spring容器的一个bean,让sp ...
- MyBaties源码解析
觉得查看源代码确实是一个学习的一种方法 因为很多时候别人把最核心的代码给我们都封装好了 我们直接可以来拿使用 很多时候自己也会问 为什么通过这个方法就可以得到我觉得就是一颗好奇心吧 我算了算 就这三个 ...
- java 动态代理—— Mybaties 拦截器链基本原理实现
1.摘要 Mybaties 中有个分页插件,之前有特意的去了解了一下原理 :https://www.cnblogs.com/jonrain0625/p/11168247.html,从了解中得知分页插件 ...
- 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代
2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...
- Angular2学习笔记(1)
Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...
- ABP入门系列(1)——学习Abp框架之实操演练
作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...
- 消息队列——RabbitMQ学习笔记
消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- Unity3d学习 制作地形
这周学习了如何在unity中制作地形,就是在一个Terrain的对象上盖几座小山,在山底种几棵树,那就讲一下如何完成上述内容. 1.在新键得项目的游戏的Hierarchy目录中新键一个Terrain对 ...
随机推荐
- 无线网络覆盖-java中,用Math.sqrt()时,必须要注意小数问题
时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 我们的乐乐同学对于网络可算得上是情有独钟,他有一个计划,那就是用无线网覆盖郑州大学. 现在学校给了他一个机会,因此他要购买 ...
- Confluence 6 空间的权限是附加的
空间的权限是附加的.如果一个用户以个人的方式或者以一个用户组成员的方式赋予了权限,Confluence 将会把这些权限合并在一起. 下面是这个概念的示例... Sasha 是 confluence- ...
- scrapy-redis(一)
安装scrapy-redis pip install scrapy-redis 从GitHub 上拷贝源码: clone github scrapy-redis源码文件 git clone https ...
- hammer.js方法总结(只做了一个简单的demo)
html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...
- Vue自动化工具(Vue-CLI)的安装
安装VUM 前面学习了普通组件以后,接下来我们继续学习单文件组件则需要提前先安装准备一些组件开发工具.否则无法使用和学习单文件组件. 一般情况下,单文件组件,我们运行在 自动化工具vue-CLI中,可 ...
- harbor安装
一.下载安装包https://github.com/goharbor/harbor/releases wget https://storage.googleapis.com/harbor-releas ...
- mysql并行执行--缩短主从同步时延
https://www.w3cschool.cn/architectroad/architectroad-mysql-parallel-copy.html 三.结尾 从mysql并行复制缩短主从同步时 ...
- 论raw_input与input之间的缠缠绵绵
例子1:py2.7中,raw_input输入整数,返回的是str. input1=raw_input("raw_input:") print(type(input1)) print ...
- P标签莫名有了margin-top值的原因
p标签默认 -webkit-margin-after: 1em; -webkit-margin-before: 1em;元素上下边距数值为1倍字体高度 设置-webkit-margin-after: ...
- python-time,datetime
1.time模块:time.time() # 返回当前时间的时间戳(1970纪元后经过的浮点秒数)time.localtime([ sec ]) # 接收时间戳(默认为当前时间),返回struct_t ...