㈠ jpa 如何優雅的實現動態sql
案例
動態語言註解
import www.ijava.com.entity.User;
/*
* (1)動態語言註解
對於創建動態的查的語言。MyBatis提供了多個註解如:
@InsertProvider,
@UpdateProvider,
@DeleteProvider和
@SelectProvider,
這些都是建立動態語言和讓MyBatis執行這些語言。
(2)@Provider使用思路
對於MyBatis提供的幾個@Provider,
裡面最主要的參數是type,
也就是sql類的Calss對象,
另外就是對應的方法名,
我們看SelectProvider的源代碼:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface SelectProvider {
Class<?> type();
String method();
}
所以要實現動態的SQL查詢,那麼大體的思路就是,編寫一個SqlProvider,比如:DemoSqlProvider,在此方法中返回一條SQL語句即可。然後在Mapper類中使用@SelectProvider註解,指定provider類和對應的SQL方法。
問題:有一個表中有id,name,email等欄位,有這么一個查詢要求:我們希望的是如果name不為null的話,那麼就當做條件,否則就不要當做條件;如果email不為null,那麼就當做條件,否則不當做條件。
接下里看看怎麼使用@SelectProvider破。
Provider:供應者
*/
public class UserSqlProvider {
/**
* 查詢語句.
*/
public String select1(User user ){
StringBuffer sql = new StringBuffer("select * from tb_user1 where 1=1 ");
if(user.getAge() != 0){
sql.append(" and age=#{age}");
}
if(user.getUsername() != null){
if("張三----".contains(user.getUsername())){
sql.append(" and username=#{username}");
}
}
return sql.toString();
}
}UserMapper
@SelectProvider(type=UserSqlProvider.class,method="select1")
List<User> getUserByIdAndUsername(User user);
㈡ 如何在java里實現復雜的動態查詢功能
根據選擇查詢內容在後台動態拼接sql,比如條件A,select * from A,條件B換成select * from B.
前端也可以動態的顯示要查詢的內容。
㈢ 在Java程序中怎樣動態的檢查SQL語句是否正
在Java程序中怎樣動態的檢查SQL語句是否正
String sql = "SELECT 角色 FROM userinfo WHERE 員工編號='A001' AND 密碼='a'";
try {
ResultSet res = stmt.executeQuery(sql);
while (res.next()) { // 循環輸出<a href="https://www..com/s?wd=%E7%BB%93%E6%9E%9C%E9%9B%86&tn=44039180_cpr&fenlei=-bIi4WUvYETgN-" target="_blank" class="-highlight">結果集</a>
String role = res.getString("角色"); //這里可以根據欄位名稱得到該記錄的角色的值
}
} catch (Exception e) {
e.printStackTrace();
}
㈣ 如何用java語言中如何執行sql查詢語句
使用jdbc技術,首先導入連接資料庫的jar包,聲明載入的類名,獲取連接,進行查詢,如:
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger");
Statement sta = conn.createStatement();
ResultSet rs = sta.executeQuery("select * from tablename");
㈤ java中如何處理多條件的sql查詢語句
一般多個條件的時候,處理方式是 select * from table where 1 = 1先寫上這樣一個條件,這樣你以後的條件就可以直接用 if判斷了,比如現在有A ,B 兩個條件 就可以直接這樣
String sql = "select * from table where 1 = 1";
if( 條件A != null ){
sql += " and A =" + 條件A;
}
if( 條件B != null ){
sql += " and B =" + 條件B;
}
這樣就可以避免多種情況存在的問題
㈥ java連接sql資料庫。實現增刪改查怎麼寫。誰有實例
java連接資料庫,你可以用一些框架,比如hibernate,iBATIS等,這樣方便一點,否則你就用JDBC吧,自己寫sql語句:
JDBC連接資料庫
•創建一個以JDBC連接資料庫的程序,包含7個步驟:
1、載入JDBC驅動程序:
在連接資料庫之前,首先要載入想要連接的資料庫的驅動到JVM(Java虛擬機),
這通過java.lang.Class類的靜態方法forName(String className)實現。
例如:
try{
//載入MySql的驅動類
Class.forName("com.mysql.jdbc.Driver") ;
}catch(ClassNotFoundException e){
System.out.println("找不到驅動程序類 ,載入驅動失敗!");
e.printStackTrace() ;
}
成功載入後,會將Driver類的實例注冊到DriverManager類中。
2、提供JDBC連接的URL
•連接URL定義了連接資料庫時的協議、子協議、數據源標識。
•書寫形式:協議:子協議:數據源標識
協議:在JDBC中總是以jdbc開始
子協議:是橋連接的驅動程序或是資料庫管理系統名稱。
數據源標識:標記找到資料庫來源的地址與連接埠。
例如:(MySql的連接URL)
jdbc:mysql:
//localhost:3306/test?useUnicode=true&characterEncoding=gbk ;
useUnicode=true:表示使用Unicode字元集。如果characterEncoding設置為
gb2312或GBK,本參數必須設置為true 。characterEncoding=gbk:字元編碼方式。
3、創建資料庫的連接
•要連接資料庫,需要向java.sql.DriverManager請求並獲得Connection對象,
該對象就代表一個資料庫的連接。
•使用DriverManager的getConnectin(String url , String username ,
String password )方法傳入指定的欲連接的資料庫的路徑、資料庫的用戶名和
密碼來獲得。
例如:
//連接MySql資料庫,用戶名和密碼都是root
String url = "jdbc:mysql://localhost:3306/test" ;
String username = "root" ;
String password = "root" ;
try{
Connection con =
DriverManager.getConnection(url , username , password ) ;
}catch(SQLException se){
System.out.println("資料庫連接失敗!");
se.printStackTrace() ;
}
4、創建一個Statement
•要執行SQL語句,必須獲得java.sql.Statement實例,Statement實例分為以下3
種類型:
1、執行靜態SQL語句。通常通過Statement實例實現。
2、執行動態SQL語句。通常通過PreparedStatement實例實現。
3、執行資料庫存儲過程。通常通過CallableStatement實例實現。
具體的實現方式:
Statement stmt = con.createStatement() ;
PreparedStatement pstmt = con.prepareStatement(sql) ;
CallableStatement cstmt =
con.prepareCall("{CALL demoSp(? , ?)}") ;
5、執行SQL語句
Statement介面提供了三種執行SQL語句的方法:executeQuery 、executeUpdate
和execute
1、ResultSet executeQuery(String sqlString):執行查詢資料庫的SQL語句
,返回一個結果集(ResultSet)對象。
2、int executeUpdate(String sqlString):用於執行INSERT、UPDATE或
DELETE語句以及SQL DDL語句,如:CREATE TABLE和DROP TABLE等
3、execute(sqlString):用於執行返回多個結果集、多個更新計數或二者組合的
語句。
具體實現的代碼:
ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ;
int rows = stmt.executeUpdate("INSERT INTO ...") ;
boolean flag = stmt.execute(String sql) ;
6、處理結果
兩種情況:
1、執行更新返回的是本次操作影響到的記錄數。
2、執行查詢返回的結果是一個ResultSet對象。
• ResultSet包含符合SQL語句中條件的所有行,並且它通過一套get方法提供了對這些
行中數據的訪問。
• 使用結果集(ResultSet)對象的訪問方法獲取數據:
while(rs.next()){
String name = rs.getString("name") ;
String pass = rs.getString(1) ; // 此方法比較高效
}
(列是從左到右編號的,並且從列1開始)
7、關閉JDBC對象
操作完成以後要把所有使用的JDBC對象全都關閉,以釋放JDBC資源,關閉順序和聲
明順序相反:
1、關閉記錄集
2、關閉聲明
3、關閉連接對象
if(rs != null){ // 關閉記錄集
try{
rs.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}
if(stmt != null){ // 關閉聲明
try{
stmt.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}
if(conn != null){ // 關閉連接對象
try{
conn.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}
㈦ sql動態條件查詢語句
你的意思是通過程序來添加查詢吧,我給你一個代碼參考
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import Jdbc.Util.DBPUtil;
public class PreparedStatementDemo {
public static void main(String[] args)
{
PreparedStatementDemo psd = new PreparedStatementDemo();
psd.updateSalary("JACOB",3000);//給方法傳入2個參數,執行sql語句
psd.selectSalary("JACOB");
}
public void updateSalary(String ename,double sal)
{
String sql = "Update stu_emp set sal= ? Where ename = ?";
Connection cn = null;
PreparedStatement ps = null;
try
{
cn = DBPUtil.getConnection();
ps = cn.prepareStatement(sql);
ps.setDouble(1, sal);
ps.setString(2, ename);
int num = ps.executeUpdate();
System.out.println("提示:總共有 "+num+" 條數據已經更新!");
}
catch (SQLException e)
{
e.printStackTrace();
}
finally
{
DBPUtil.stmtClose(ps);
DBPUtil.connClose(cn);
}
}
public void selectSalary(String name)
{
String sql = "Select * From stu_emp Where ename = ?";
Connection cn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try
{
cn = DBPUtil.getConnection();
ps = cn.prepareStatement(sql);
ps.setString(1, name);
rs = ps.executeQuery();
while(rs.next())
{
System.out.println(rs.getString("ename")+" 的工資是: "+ rs.getInt("sal"));
}
}
catch (SQLException e)
{
e.printStackTrace();
}
finally
{
DBPUtil.stmtClose(ps);
DBPUtil.rsClose(rs);
DBPUtil.connClose(cn);
}
}
}
㈧ 用java寫一個程序,實現對SQL資料庫的動態表進行定時查詢
你這跟struts2沒關系,需要一個定時器,定時去跑你的查詢庫表代碼就OK了。
如果你的程序是需要將查詢結果展示在jsp頁面上,你需要在jsp頁面上使用js寫定時器代碼,參考SetInterval方法。
如果你的程序是桌面應用程序,你可以使用java的定時器Timer。當然,你的項目中如果使用了spring,那有更好的解決方案Quartz。
具體問題要具體分析了。
㈨ java sql資料庫查詢語句怎麼寫
使用java的jdbc來連接資料庫
如連接mysql(其餘資料庫類似),引入mysql-connector-java-5.1.24.jar包到工程中,在程序中可以這樣連接mysql:
String Server = 你伺服器的ip;
String User = 你的賬號名;
String Password = 你的密碼;
String Database = 你的資料庫名;
// 驅動程序名
String driver = "com.mysql.jdbc.Driver";
// URL指向要訪問的資料庫名scutcs
String url = "jdbc:mysql://"+Server+"/" + Database;
// 載入驅動程序
Class.forName(driver);
// 連續資料庫
Connection conn = DriverManager.getConnection(url, User, Password);
if(!conn.isClosed())
System.out.println("Succeeded connecting to the Database!");
// statement用來執行SQL語句
Statement statement = conn.createStatement();
String sql = "select ** from ** where **";
ResultSet rs = statement.executeQuery(sql);
//假設資料庫表只有兩個屬性值,一個屬性值為String類型,另一個為Int類型
while(rs.next()) {
System.out.println(rs.getString(1)+" " +rs.getInt(2) );
}
㈩ java實現sql連接和查詢的代碼
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
public class DBCon {
//資料庫驅動對象
public static final String DRIVER="oracle.jdbc.driver.OracleDriver";
//資料庫連接地址(資料庫名)
public static final String URL="jdbc:oracle:thin:@localhost:1521:orcl";
//登陸名
public static final String USER="FM";
//登陸密碼
public static final String PWD="FM";
//創建資料庫連接對象
private Connection con=null;
//創建資料庫預編譯對象
private PreparedStatement ps=null;
//創建結果集
private ResultSet rs=null;
//創建數據源對象
public static DataSource source=null;
// //靜態代碼塊
// static{
//
// //初始化配置文件context
// try {
// Context context=new InitialContext();
// source=(DataSource)context.lookup("java:comp/env/jdbc/webmessage");
// } catch (Exception e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//
//
// }
/**
* 獲取資料庫連接
*/
public Connection getCon(){
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
con=DriverManager.getConnection(URL,USER,PWD);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return con;
}
// /**
// * 獲取資料庫連接
// */
// public Connection getCon(){
//
// try {
// con=source.getConnection();
// } catch (SQLException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//
// return con;
// }
/**
* 關閉所有資源
*/
public void closeAll(){
if(rs!=null)
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(ps!=null)
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(con!=null)
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @param sql資料庫更新(增、刪、改) 語句
* @param pras參數列表(可傳,可不傳,不傳為NULL,以數組形式存在)
* @return 返回受影響都行數
*/
public int update(String sql,String... pras){
int resu=0;
con=getCon();
try {
ps=con.prepareStatement(sql);
for(int i=0;i<pras.length;i++){
ps.setString(i+1,pras[i]);
}
resu=ps.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
closeAll();
}
return resu;
}
/**
* @param sql資料庫查詢語句
* @param pras參數列表(可傳,可不傳,不傳為NULL,以數組形式存在)
* @return 返回結果集
*/
public ResultSet query(String sql,String... pras){
con=getCon();
try {
ps=con.prepareStatement(sql);
if(pras!=null)
for(int i=0;i<pras.length;i++){
ps.setString(i+1, pras[i]);
}
rs=ps.executeQuery();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return rs;
}
}