利用Mybatis对数据库进行增删改查操作
文章目錄
- mybatis模糊查找
- 先來了解一下 #{}和${}的使用
- parameterType和resultType的使用
- selectOne和selectList的使用
- mysql自增主鍵返回
- 方法一:mysql的函數函數返回
- 方法二:定義useGeneratedKeys為true返回
- Mysql使用 uuid實現主鍵
- 看到UUID和自增長的id想必大家想了解它們的區別?
- 增刪改查操作
- 目標對象:
- xml數據源配置
- mybatis xml映射文件配置
- 測試類
mybatis模糊查找
先來了解一下 #{}和${}的使用
#{}表示一個占位符號,通過#{}可以實現preparedStatement向占位符中設置值,自動進行java類型和jdbc類型轉換。#{}可以有效防止sql注入。 #{}可以接收簡單類型值或pojo屬性值。 如果parameterType傳輸單個簡單類型值,#{}括號中可以是value或其它名稱。#{}默認加單引號
${}表示拼接sql串,通過${}可以將parameterType 傳入的內容拼接在sql中且不進行jdbc類型轉換, ${}可以接收簡單類型值或pojo屬性值,如果parameterType傳輸單個簡單類型值,${}括號中只能是value**。${}默認不加單引號
1.查詢sql:
SELECT * FROM `user` WHERE username LIKE '%王%'2.在User.xml配置文件中添加如下內容:
<!-- 如果傳入的參數是簡單數據類型,${}里面必須寫value --><select id="queryUserByUsername2" parameterType="string"resultType="cn.itcast.mybatis.pojo.User">SELECT * FROM `user` WHERE username LIKE '%${value}%'</select>MybatisTest中添加測試方法如下:
parameterType和resultType的使用
parameterType:
指定輸入參數類型,mybatis通過ognl從輸入對象中獲取參數值拼接在sql中。
resultType:
指定輸出結果類型,mybatis將sql查詢結果的一行記錄數據映射為resultType指定類型的對象。如果有多條數據,則分別進行映射,并把對象放到容器List中
selectOne和selectList的使用
selectOne:查詢一條記錄
User user = openSession.selectOne("queryUserById", 1);selectList可以查詢一條或多條記錄。
List<User> user = openSession.selectList("queryUserByName", "hexiang");記住:查詢操作openSession不需要提交事務,而如果是增刪改需要openSession.commit()來提交事務
mysql自增主鍵返回
方法一:mysql的函數函數返回
LAST_INSERT_ID():是mysql的函數,返回auto_increment自增列新記錄id值。
<!-- 保存用戶 --> <insert id="saveUser" parameterType="cn.itcast.mybatis.pojo.User"><!-- selectKey 標簽實現主鍵返回 --><!-- keyColumn:主鍵對應的表中的哪一列 --><!-- keyProperty:主鍵對應的pojo中的哪一個屬性 --><!-- order:設置在執行insert語句前執行查詢id的sql,孩紙在執行insert語句之后執行查詢id的sql --><!-- resultType:設置返回的id的類型 --><selectKey keyColumn="id" keyProperty="id" order="AFTER"resultType="int">SELECT LAST_INSERT_ID()</selectKey>INSERT INTO `user`(username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address}) </insert>方法二:定義useGeneratedKeys為true返回
<!-- 插入數據:返回記錄主鍵id值 --> <insert id="insert" useGeneratedKeys="true" keyProperty="id" keyColumn="id">insert into stu (name,age) values (#{name},#{age}) </insert>獲取新添加記錄主鍵字段值
Integer rows = sqlSession.getMapper(StuMapper.class).insertOneTest(student); System.out.println("rows = " + rows); // 添加操作返回記錄數 System.out.println("id = " + student.getId()); // 執行添加操作之后通過Java對象獲取主鍵屬性值推薦用方式二
Mysql使用 uuid實現主鍵
需要增加通過select uuid()得到uuid值,注意這里使用的order是“BEFORE”
<!-- 保存用戶 --> <insert id="saveUser" parameterType="cn.itcast.mybatis.pojo.User"><!-- selectKey 標簽實現主鍵返回 --><!-- keyColumn:主鍵對應的表中的哪一列 --><!-- keyProperty:主鍵對應的pojo中的哪一個屬性 --><!-- order:設置在執行insert語句前執行查詢id的sql,孩紙在執行insert語句之后執行查詢id的sql --><!-- resultType:設置返回的id的類型 --><selectKey keyColumn="id" keyProperty="id" order="BEFORE"resultType="string">SELECT LAST_INSERT_ID()</selectKey>INSERT INTO `user`(username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address}) </insert>看到UUID和自增長的id想必大家想了解它們的區別?
uuid是按照字符型存儲(可以用string類型),正常自增長用的id是int類型占四個字節,當數據量非常大的時候就可以提現出id和uuid之間的區別,假設用500萬個數據來模擬的話,id可以相對uuid節省2.5G空間,詳細區別,可以問度娘.
增刪改查操作
新建的項目中的列表用到的文件是User.java(目標對象)、TestDemo1.java(測試類)、SqlMapConfig.xml(數據庫連接池配置)、User.xml(數據庫增刪查改配置)、jdbc.properties(配置信息:賬戶密碼等)、log4j.properties(控制臺打印日志):
目標對象:
User.java
package com.firtDay.sqlMapconFig;import java.io.Serializable;public class User implements Serializable {@Overridepublic String toString() {return "User [_name=" + _name + ", _money=" + _money + "]";}private Integer id;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}private String _name;private int _money;public String get_name() {return _name;}public void set_name(String _name) {this._name = _name;}public int get_money() {return _money;}public void set_money(int _money) {this._money = _money;}}xml數據源配置
SqlMapConfig.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> <properties resource="jdbc.properties"></properties> <typeAliases> <!-- 給User類取別名 --><!-- <typeAlias type="com.firtDay.sqlMapconFig.User" alias="User"/> --><!-- 取別名以及其子包下所有類的別名,避免多個類都需要配置代碼太多,利用包默認取包下類中所定義的名字 --><package name="com.firtDay.sqlMapconFig"/> </typeAliases><!-- 和spring整合后 environments配置將廢除 --><environments default="development"><environment id="development"><!-- 使用jdbc事務管理 --><transactionManager type="JDBC" /><!-- 數據庫連接池 --><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url"value="${url}" /><property name="username" value="${username}" /><property name="password" value="${password}" /></dataSource></environment></environments><!-- 加載映射文件的時候用到 --><mappers><!-- <mapper class="com.mapper.mapper"/> 使用這種方式加載mapper.xml必須把該xml文件放在mapper包下才能并且與mapper類名相同加載出來 。<package name=""/>package同理,用分最多的是package避免配置多個麻煩--><mapper resource="User.xml"/><mapper resource="mapper.xml"/> <!-- <package name="com.mapper"/> package用法,只需要把xml文件放在該mapper包下就會被掃描到,名稱沒有要求--></mappers> </configuration>mybatis xml映射文件配置
User.xml
<?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:命名空間,用于隔離sql,因為多個數據庫都會用到queryUserById方法因此為了區分我們所調用的是哪個數據庫中方法,因此設置名稱空間來區別開來,調用方式:test.queryUserById。 --> <mapper namespace="test"><!-- id="方法名" parameterType="參數類型" --><select id="queryUserById" parameterType="Integer"resultType="com.firtDay.sqlMapconFig.User">SELECT * FROM `t_user` WHERE id = #{id}</select><!-- like "%"#{v}"%"防SQL注入、默認不會自動添加單引號 '${value}'相反 --><select id="queryUserByName" parameterType="String"resultType="com.firtDay.sqlMapconFig.User">SELECT * FROM `t_user` WHERE _name like '%${value}%'</select><!-- 添加用戶 --><insert id="addUser" parameterType="com.firtDay.sqlMapconFig.User"><!-- 獲取主鍵 keyProperty="對應的主鍵的對象",resultType="主鍵數據類型",order="after:表示在下面insert語句后面執行,在mysql中是先插入再生成主鍵而Oracle中是先出主鍵在插入值因此用before"--><selectKey keyProperty="id" resultType="Integer" order="AFTER">select LAST_INSERT_ID()</selectKey>INSERT INTO t_user(_name,_money) values (#{_name},#{_money})</insert><update id="updateUser" parameterType="com.firtDay.sqlMapconFig.User">UPDATE t_user set _name = #{_name},_money = #{_money} WHERE id = #{id}</update><delete id="deleteUserById" parameterType="Integer">delete from t_user where id = #{id} </delete> </mapper>測試類
TestDemo1.java
package com.test;import java.io.InputStream; import java.util.List;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.Before; import org.junit.Test;import com.firtDay.sqlMapconFig.User;public class TestDemo1 {private SqlSessionFactory sqlSessionFactory=null;@Beforepublic void testDemo() throws Exception{// 1. 創建SqlSessionFactoryBuilder對象SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();String url="SqlMapConfig.xml";InputStream resource = Resources.getResourceAsStream(url);this.sqlSessionFactory = sqlSessionFactoryBuilder.build(resource);}@Testpublic void testDemo2(){SqlSession openSession = sqlSessionFactory.openSession();User user = openSession.selectOne("queryUserById", 1);System.out.println(user);openSession.close();}@Testpublic void testDemo3(){SqlSession openSession = sqlSessionFactory.openSession();List<User> user = openSession.selectList("queryUserByName", "hexiang");for (User user2 : user) {System.out.println(user2);}openSession.close();} @Testpublic void testDemo4(){SqlSession openSession = sqlSessionFactory.openSession();User user = new User();user.set_name("hha");user.set_money(1000);int insert = openSession.insert("addUser", user);//返回值為影響的行數System.out.println(insert);openSession.commit();//需要提交事務System.out.println("id:"+user.getId());openSession.close();}//更新數據@Testpublic void testDemo5(){SqlSession openSession = sqlSessionFactory.openSession();User user = new User();user.setId(9);user.set_name("111xxxoooo");user.set_money(1000);int update = openSession.update("updateUser", user);openSession.commit();openSession.close();}//刪除數據 @Testpublic void testDemo6(){SqlSession openSession = sqlSessionFactory.openSession();User user = new User();openSession.update("deleteUserById", 9);openSession.commit();openSession.close();} }總結
以上是生活随笔為你收集整理的利用Mybatis对数据库进行增删改查操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DBUtils使用详细示例(转载)
- 下一篇: jsoup的Elements类